Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ATMega328P WatchDog
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Ioann_II
Здравствуйте, Уважаемые коллеги.

Столкнулся с такой вот проблемой - не получается запустить сторожевой таймер в режиме Сброс.
Делаю так:

Код
WDR ();     // сброс счетчика сторожевого таймера
WDTCSR = WDTCSR | (1<<WDCE) | (1<<WDE);
// запуск сторожевого таймера с предделителем на 512К (0,55с)
WDTCSR = (1<<WDE) | (1<<WDIE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);
SEI();      // разрешить прерывания

Работает в режиме прерываний. Действительно, срабатывает прерывание.

Если настраиваю так:

Код
WDR ();     // сброс счетчика сторожевого таймера
WDTCSR = WDTCSR | (1<<WDCE) | (1<<WDE);
// запуск сторожевого таймера с предделителем на 512К (0,55с)
WDTCSR = (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);
SEI();      // разрешить прерывания

То, не работает. Точнее, срабатывает, но вместо перезапуска, останавливает работу МК. Далее помогает только если снять питание и подать заново.

Стакливался кто? или может, что-то не так делаю???

Спасибо.
controller_m30
ATMega328P установлена на Arduino? Если да, то в интернете пишут что есть проблема с встроенным загрузчиком (geektimes), который и не даёт правильно работать WatchDog-у.

В отличие от обычного контроллера, который мы покупаем "чистым", в изделиях Arduino вшит загрузчик. Плюс его в том, что для программирования достаточно любого USB-UART переходника, с сигналами RX, TX. А минус - что ещё перед запуском основной программы которую мы пишем, этот загрузчик успевает настроить процессор удобным для себя образом, что в некоторых случаях может мешать работе загруженной программы.
Ioann_II
Цитата(controller_m30 @ Mar 15 2017, 07:17) *
ATMega328P установлена на Arduino? Если да, то в интернете пишут что есть проблема с встроенным загрузчиком (geektimes), который и не даёт правильно работать WatchDog-у.

В отличие от обычного контроллера, который мы покупаем "чистым", в изделиях Arduino вшит загрузчик. Плюс его в том, что для программирования достаточно любого USB-UART переходника, с сигналами RX, TX. А минус - что ещё перед запуском основной программы которую мы пишем, этот загрузчик успевает настроить процессор удобным для себя образом, что в некоторых случаях может мешать работе загруженной программы.


Не установлена, загрузчика нет.
aiwa
Цитата(Ioann_II @ Mar 12 2017, 04:29) *
То, не работает. Точнее, срабатывает, но вместо перезапуска, останавливает работу МК. Далее помогает только если снять питание и подать заново.


Как Вы узнаете, что не срабатывает, а останавливает работу МК?
Может он, например, срабатывает циклически.
Сначала проверьте снимаете ли Вы собачий флаг - в доке рекомендация его очищать даже если WatchDog не используется.

Сергей Борщ
QUOTE (aiwa @ Mar 16 2017, 11:04) *
Может он, например, срабатывает циклически.
Да, есть там забавная особенность - WDTCSR не меняется, пока установлен флаг сработавшей собаки. Поэтому если перед записью в WDTCSR не сбросить флаг, то после сброса по собаке WDTCSR устанавливается на какой-то небольшой период, а повторная запись в него не работает, поскольку стоит флаг. И программа сбрасывается, не успев дойти до WDR().
Ioann_II
Цитата(aiwa @ Mar 16 2017, 12:04) *
Как Вы узнаете, что не срабатывает, а останавливает работу МК?
Может он, например, срабатывает циклически.
Сначала проверьте снимаете ли Вы собачий флаг - в доке рекомендация его очищать даже если WatchDog не используется.

Инициализацию я уже приводил. Настроен на интервал примерно 0,55с.
После неё стоит следующее:
Код
LCD_String("INIT",0,0);
sleep(3000);
LCD_Command(0x01);
LCD_String("NO WATHCHDOG!!!",0,0);

и
Код
#pragma interrupt_handler wdt_isr:iv_WDT
void wdt_isr(void)
{
//watchdog timeout
LCD_String("INTERRUPT!!!",0,1);

sleep(1000);
resetFunc();
}

Соответственно, если отключен, то вижу надпись "INIT", через полсекунды "NO WATCHDOG".
Если включен в режиме прерываний, то вижу "INIT", затем "INTERRUPT". Когда в прерывании есть resetFunc(), то всё по кругу.
Если включаю в режиме сброса, то вижу надпись "INIT", которая через полсекунды гаснет.... И ВСЁ!!!! более ничего не происходит.
Отсюда делаю вывод, что в режиме сброса у меня он не заработал.
Сергей Борщ
QUOTE (Ioann_II @ Mar 18 2017, 03:12) *
Если включаю в режиме сброса, то вижу надпись "INIT", которая через полсекунды гаснет.... И ВСЁ!!!! более ничего не происходит.
Еще раз внимательно перечитайте мое предыдущее сообщение и покажите настройку собаки.
Ioann_II
Цитата(Сергей Борщ @ Mar 18 2017, 11:15) *
Еще раз внимательно перечитайте мое предыдущее сообщение и покажите настройку собаки.

Вот настройки для режима прерываний - работает.
Код
WDR ();     // сброс счетчика сторожевого таймера
WDTCSR = WDTCSR | (1<<WDCE) | (1<<WDE);
// запуск сторожевого таймера с предделителем на 512К (0,55с)
WDTCSR = (1<<WDE) | (1<<WDIE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);
SEI();      // разрешить прерывания

А вот настройки для режима сброс - не работает
Код
WDR ();     // сброс счетчика сторожевого таймера
WDTCSR = WDTCSR | (1<<WDCE) | (1<<WDE);
// запуск сторожевого таймера с предделителем на 512К (0,55с)
WDTCSR = (1<<WDE) | (1<<WDP2) | (1<<WDP1) | (1<<WDP0);
SEI();      // разрешить прерывания

Про флаг: как надо? При инициализации сделать сначала это?:
Код
MCUSR = MCUSR &~(1<<WDRF);

Для ATMega8 аналогичным образом делал - работало... (в смысле не трогая регистр MCUSR)
Сергей Борщ
QUOTE (Ioann_II @ Mar 18 2017, 13:13) *
Про флаг: как надо? При инициализации сделать сначала это?:
CODE
MCUSR = MCUSR &~(1<<WDRF);
Да, это. Но не так. Флаги в этом регистре сбрасываются так:
CODE
MCUSR = ~(1<<WDRF);


QUOTE (Ioann_II @ Mar 18 2017, 13:13) *
Для ATMega8 аналогичным образом делал - работало... (в смысле не трогая регистр MCUSR)
Может быть потому, что для этого контроллера надо читать документацию на ATmega328?

QUOTE
Bit 3 – WDE: Watchdog System Reset Enable
WDE is overridden by WDRF in MCUSR. This means that WDE is always set when WDRF is set. To
clear WDE, WDRF must be cleared first. This feature ensures multiple resets during conditions causing
failure, and a safe startup after the failure.
Ioann_II
Цитата(Сергей Борщ @ Mar 18 2017, 15:29) *
Может быть потому, что для этого контроллера надо читать документацию на ATmega328?

Да, получается что недочитал... Просто раньше работал с ATMega8, а на этот лишь бегло глянул документацию...
Т.е., если я верно понял, то получается так, что раз я этот бит не чистил, то WatchDog начинал посылать бесконечную серию Reset.... и контроллер не работал...
Спасибо, что ткнули носом.
Сергей Борщ
QUOTE (Ioann_II @ Mar 18 2017, 14:56) *
Т.е., если я верно понял, то получается так, что раз я этот бит не чистил, то WatchDog начинал посылать бесконечную серию Reset..
Он после сброса оказывался включен с периодом 16 мс. И если за это время вы его не перенастроите - получите новый сброс.
Ioann_II
Цитата(Сергей Борщ @ Mar 18 2017, 17:46) *
Он после сброса оказывался включен с периодом 16 мс. И если за это время вы его не перенастроите - получите новый сброс.

Спасибо. Всё получилось.
Эти 16мс подвели. У меня сначала стояла инициализация LCD, а это где-то 22мс. Теперь сначала настройка WatchDog, а в самом конце - LCD. Работает.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.