Обсуждаем контроллеры компании Atmel.
Ответить

WatchDog Timer Сторожевой таймер в AVR

Вс ноя 19, 2006 14:23:38

WatchDog Timer - что это?
Обьясните что это такое как можно проще.
(использую tini13, и прогу AlgorithmBuilder)
Последний раз редактировалось Gudd-Head Пт фев 07, 2014 13:41:14, всего редактировалось 2 раз(а).
Причина: Тему прилепил

Пн ноя 20, 2006 07:39:01

Так называемый сторожевой таймер. Если он включен, то по его переполнению контроллер сбрасывается. Нужен чтобы зависаний не было. Програмно может обнулятиься.

Чт ноя 23, 2006 22:07:58

Все спасибо, уже пошел делать.

ATtiny24 не стартует WDT...

Ср дек 05, 2012 20:35:55

Здравствуйте, Братья по паяльнику!
Ваяю один полезный "девайсик" с батарейным питанием. Основа - ATtiny24. Данный МК выбрал за его мелкоту, наличие АЦП и относительно невысокую цену. Но вот засада - аппаратный INT, способный выводить данный МК из "глубокой спячки" только один, что для моего случая не достаточно. Внимание привлёк WDT с возможностью не только давать сброс, но и прерывание, способное пробудить ядро МК. По пробуждению решил задать опрос нужных портов и потом, если что, снова отправлять МК в "спячку".
Попытался запустить WDT, создав проект в CV AVR и выставив все нужные опции при помощи "Визарда". Получилось следующее:


Но единица на соответствующем порту так и не появляется, то есть программа никогда не попадает в обработчик прерывания от WDT. Сброс МК тоже не происходит (пробовал по нажатию кнопок менять ШИМ). Думал, может чего с самим МК не так, попытался запустить в "Протеусе" - ситуация аналогичная.
Помогите, пожалуйста, разобраться.

Re: ATtiny24 не стартует WDT...

Сб дек 08, 2012 18:32:39

Возможно выставлены неправильные настройки сторожевого таймера, в СИшном коде мало понимаю. Скинул скриншот с настройками из книги "Микроконтроллеры AVR семейств Tiny Руководство пользователя". В Протеусе есть пошаговая отладка, не пробовал там смотреть чем занят микроконтроллер?
Вложения
настройки таймера.jpg
(98.1 KiB) Скачиваний: 1045

Re: ATtiny24 не стартует WDT...

Вс дек 09, 2012 02:50:06

Благодарю за ответ.
В качестве настройки в регистр таймера последовательно записываются два значения
WDTCSR=0x1A;
WDTCSR=0x4A;
затем разрешается глобальный флаг прерываний
#asm("sei")
Но, похоже, что этого не достаточно и нужно ещё где-то чего-то разрешить.

Re: ATtiny24 не стартует WDT...

Вс дек 09, 2012 19:27:22

ELcat:
WDTCSR=0x4A=1001010;

WDIF-WDIE-WDP3-WDCE-WDE-WDP2-WDP1-WDP0
0______1____ 0_____0____1____0_____1____0

Бит WDIE - разрешение прерывания от сторожевого таймера.
Бит WDE - должен быть сброшен в 0. См. файл который я прикреплял, он взят из книги "Микроконтроллеры AVR семейств Tiny Руководство пользователя.djvu".

P.S. извиняюсь, в первый раз переклинило, перепутал малость :shock:
Последний раз редактировалось стьюдент Вс дек 09, 2012 22:52:51, всего редактировалось 1 раз.

Re: ATtiny24 не стартует WDT...

Вс дек 09, 2012 21:27:25

стьюдент писал(а):WDIF-WDIE-WDP3-WDCE-WDE-WDP2-WDP1-WDP0
0______0____ 1_____0____0____0_____1____0
Не догнал...
Ты пишешь, что WDTCSR=0x4A=1001010; и тут же рисуешь биты 0010 0010, что в hex будет 0х22, почему??? Там что, записью "1" меняется состояние на противоположное? Поясни, пожалуйста.

Re: ATtiny24 не стартует WDT...

Вс дек 09, 2012 21:33:54

вы названия битов то прочтите.

Re: ATtiny24 не стартует WDT...

Вс дек 09, 2012 22:58:38

Отредактировал сообщение :shock: сейчас должно быть все правильно

Re: ATtiny24 не стартует WDT...

Вс дек 09, 2012 23:46:06

Блин, не люблю загадки!
Может ошибка в том, что сначала необходимо установить только один бит - бит разрешение изменения регистра:
WDTCSR |= 0b00010000;
и только потом внести сами настройки:
WDTCSR |= 0b01001010; ???
То есть 0х10 и 0х4А ???

Re: ATtiny24 не стартует WDT...

Пн дек 10, 2012 00:08:30

Нихрена не помогает. Складывается такое впечатление, как будто даташит написан к какому-то другому микроконтроллеру. Кроме того нигде в инете не встречал подобного примера настройки и использования WDT в режиме генерации прерываний. Конечно, далеко не все AVR-ки имеют такую функцию у встроенного WDT, но всё же надеялся найти хотябы какой-нибудь пример...

Re: ATtiny24 не стартует WDT...

Чт дек 13, 2012 23:51:15

как насчет того, чтобы не путаться в битовых и других магических константах и сделать вот так:
WDTCSR = (1<<WDE)|(1<<WDIE)|(1< WDP1);

А насчет загадок могу сказать, что вам код генератор уже создал нравильную последовательность активации таймера собаки, осталось выбрать правильный режим, на картинке , которую вам привели описано, что есть несколько режимов, если ваш Мк будет всегда уходить в перезагруз, то никаких лампочек вы не увидите. попробуйте в основном цикле сделать:
1 зажечь лампу
2 сбросить собаку

Re: ATtiny24 не стартует WDT...

Пт дек 14, 2012 10:08:13

Честно говоря, не имел дело ни с 24-й Тинькой, ни с собакой.
Но! После прочтения соотв. раздела ДШ по диагонали, кое-что прояснилось:
Помимо фьюзов, включать/выключать собаку можно программно.
В зависимости от конфигурации, собака может вызывать ресет или своё прерывание.
Для конфигурирования собаки надо выставить бит WDCE: Watchdog Change Enable и в течение 4-х тактов внести изменения.
Есть какие-то два safety level, которые влияют на возможность отключения сторожа :facepalm:

Re: ATtiny24 не стартует WDT...

Пт дек 14, 2012 10:34:57

в Safety level 1 (WDTON не запрограммирован) можно выставлять таймаут и без WDTCE.
Тоже хочется разобраться с WD, но под рукой контроллера нет, а Proteus, похоже, некорректно работает с WDT.
ELcat, попробуйте в железе для проверки простой тест:
Код:
ISR(SIG_WATCHDOG_TIMEOUT)
{
  PORTA ^= 0xFE;
}

int main(void)
{
  DDRA = 0xFF;

  WDTCSR = (1<<WDCE) | (1<<WDE);
  WDTCSR = (1<<WDIE) | (1<<WDP1) | (1<<WDP2);
  sei();

  while(1)
  {
    PORTA ^= 1;
    _delay_ms(500);
  }
}
только CLKDIV8 не программировать.
в основном цикле дергание ножкой PA0 1 Гц, а если прерывание WD будет работать, то будут дергаться остальные PA7-PA1 0.5 Гц.
скомпилированный HEX прилагается.
Вложения
main.hex
(394 байт) Скачиваний: 537

Re: ATtiny24 не стартует WDT...

Пт дек 14, 2012 22:44:44

a_skr, к сожалению, мне этот код в "девайс" лить нельзя, поскольку "девайс" уже полностью спаянный и частично работает (без "спячки" пока, разумеется). На РА.7 повешен затвор HexFETa, и если туда вместо корректного ШИМ подать "1" на полсекунды, то буду иметь "пичальку" с погоревшими детальками бустера. Если можно, перепишите код, пожалуйста, исключительно для РВ.0, РВ.1 и РВ.2 (подключены светодиоды). Все остальные линии портов надо оставить "плавающими", то есть входами без "подтяжек".

По поводу подозрений в том, что я "мог не поймать ресет". Сейчас в основном цикле программы опрашиваются кнопки с частотой около 10Гц. По нажатию инкрементируется/декрементируется содержимое регистра OCR0B, по которому и формируется выходной сигнал ШИМ. То есть, если бы были сбросы, то при попытке установить какой-либо уровень скважности он периодически сбрасывался бы в 0х00, поскольку именно это число в моём коде пишется в OCR0B при инициализации таймера 0. Но тем не менее этого не происходило при любой записываемой мной комбинации в WDTCSR.

Re: ATtiny24 не стартует WDT...

Пн дек 17, 2012 09:33:44

ok. давайте попробуем. используются PB.0 - основной цикл, PB.1 - таймаут WD:
Код:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

ISR(SIG_WATCHDOG_TIMEOUT)
{
  PORTB ^= 2;
}

int main(void)
{
  DDRB = 3;
  WDTCSR = (1<<WDCE) | (1<<WDE);
  WDTCSR = (1<<WDIE) | (1<<WDP1) | (1<<WDP2);
  sei();
  while(1)
  {
    PORTB ^= 1;
    _delay_ms(500);
  }
}
Вложения
main.hex
(394 байт) Скачиваний: 633

Re: ATtiny24 не стартует WDT...

Вт дек 18, 2012 21:02:05

a_skr, прошу прощения, что долго не отвечал. Отец ушёл. Похороны. Ваш код работает, мигают оба светодиода (со снятым фузом CKDIV8). Проблема не в фузе. Мой вариант на CVAVR так и не запускается. Выкладываю архив проекта. Прошу вас взглянуть что в нём не так.
Вложения
DL.ZIP
(30.29 KiB) Скачиваний: 470

Re: ATtiny24 не стартует WDT...

Ср дек 19, 2012 08:36:53

сожалею :(
по программе. про фьюз CKDIV8 я указал просто, чтобы задержка нормально работала.
я так понял, что сброс по WD не интересует, только таймаут, так?
если так, то попробуйте поменять Ваши строчки:
WDTCSR=0x1A;
WDTCSR=0x4A;
на следующие:
WDTCSR=0x18;
WDTCSR=0x42;
таймаут 64 mS, правильно?
из обработчика таймаута WD уберите WDTCSR|=0x40;
кстати, в обработчике у Вас просто включается светодиод.
для проверки на первое время можно просто помигать им из обработчика, не трогая в главном цикле.

Re: ATtiny24 не стартует WDT...

Ср дек 19, 2012 20:08:55

Благодарю за соболезнования. Он пережил операцию, мучался больше года. Мы все до последнего момента верили, но чуда так не произошло. Онкология никого не щадит. Для нашей семьи, друзей и знакомых это невосполнимая потеря. Он был видным общественным деятелем и очень уважаемым человеком.

a_skr писал(а):попробуйте поменять Ваши строчки:
WDTCSR=0x1A;
WDTCSR=0x4A;
на следующие:
WDTCSR=0x18;
WDTCSR=0x42;
Не помогло.
Вложения
DL.ZIP
(30.72 KiB) Скачиваний: 444
Ответить