Перейти к содержанию
    

ATMega328P WatchDog

Здравствуйте, Уважаемые коллеги.

 

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

Делаю так:

 

 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();      // разрешить прерывания

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

 

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

 

Спасибо.

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Изменено пользователем controller_m30

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Не установлена, загрузчика нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Как Вы узнаете, что не срабатывает, а останавливает работу МК?

Может он, например, срабатывает циклически.

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может он, например, срабатывает циклически.
Да, есть там забавная особенность - WDTCSR не меняется, пока установлен флаг сработавшей собаки. Поэтому если перед записью в WDTCSR не сбросить флаг, то после сброса по собаке WDTCSR устанавливается на какой-то небольшой период, а повторная запись в него не работает, поскольку стоит флаг. И программа сбрасывается, не успев дойти до WDR().

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как Вы узнаете, что не срабатывает, а останавливает работу МК?

Может он, например, срабатывает циклически.

Сначала проверьте снимаете ли Вы собачий флаг - в доке рекомендация его очищать даже если 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", которая через полсекунды гаснет.... И ВСЁ!!!! более ничего не происходит.

Отсюда делаю вывод, что в режиме сброса у меня он не заработал.

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если включаю в режиме сброса, то вижу надпись "INIT", которая через полсекунды гаснет.... И ВСЁ!!!! более ничего не происходит.
Еще раз внимательно перечитайте мое предыдущее сообщение и покажите настройку собаки.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Еще раз внимательно перечитайте мое предыдущее сообщение и покажите настройку собаки.

Вот настройки для режима прерываний - работает.

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)

Изменено пользователем Ioann_II

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Про флаг: как надо? При инициализации сделать сначала это?:

MCUSR = MCUSR &~(1<<WDRF);

Да, это. Но не так. Флаги в этом регистре сбрасываются так:

MCUSR = ~(1<<WDRF);

 

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

 

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может быть потому, что для этого контроллера надо читать документацию на ATmega328?

Да, получается что недочитал... Просто раньше работал с ATMega8, а на этот лишь бегло глянул документацию...

Т.е., если я верно понял, то получается так, что раз я этот бит не чистил, то WatchDog начинал посылать бесконечную серию Reset.... и контроллер не работал...

Спасибо, что ткнули носом.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Т.е., если я верно понял, то получается так, что раз я этот бит не чистил, то WatchDog начинал посылать бесконечную серию Reset..
Он после сброса оказывался включен с периодом 16 мс. И если за это время вы его не перенастроите - получите новый сброс.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Он после сброса оказывался включен с периодом 16 мс. И если за это время вы его не перенастроите - получите новый сброс.

Спасибо. Всё получилось.

Эти 16мс подвели. У меня сначала стояла инициализация LCD, а это где-то 22мс. Теперь сначала настройка WatchDog, а в самом конце - LCD. Работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...