Watchdog Timer (WDT) в МК серии Atmega позволяет принудительно перезапускать
микроконтроллер, если время выполнения определенного куска кода превышает
заданное. В начале программы задается время для WDT, по истечении которого
произойдет перезапуск МК, а в конце заданного отрывка кода этот таймер
сбрасывается, после чего отчет времени начинается снова.
Предусмотрено несколько предустановленных значений времени для WDT:
16 мс, 32 мс, 64 мс, 1/8 с, 1/4 с, 1/2 с, 1 с, 2 с, 4 с, 8 с
wdt_disable() - отключение WDT, применяется при инициализации для
предотвращения перезагрузки МК во время загрузки кода, может быть использована
для принудительного отключения таймера при выполнении особо длительных,
занимающих много времени (>8 секунд) команд.
wdt_enable(WDTO_XXX) - включение WDT, объявление времени таймаута
(где XXX - таймаут в мс / секундах, прим.: WDTO_32MS, WDTO_1S и.т.д.)
wdt_reset() - сброс WDT, применяется в конце требуемого отрывка кода,
обнуляет таймер. Если время таймаута пройдет до достижения этой команды, WDT
произведет сброс МК.
ВНИМАНИЕ! перед инициализацией WDT обязательна задержка (в течение, как минимум,
3 секунд). В случае отсутствия таковой при прошивке МК WDT будет бесконечно
сбрасывать плату, за счет чего загрузчик не успеет загрузить прошивку в плату.
Это может привести к тому, что скетчи не смогут быть загружены в плату.
Пример кода, в котором использован WDT:
#include < avr/wdt.h> //подключение заголовочного файла int i; //объявление переменной-инкремента void setup() { Serial.begin(9600); //инициализация подключения по последовательному порту wdt_disable(); //!!!обязательно!!! отключение WDT перед инициализацией delay(3000); //!!!обязательно!!! задержка перед инициализацией WDT wdt_enable(WDTO_2S); //инициализация WDT, время задержки 2 секунды } void loop() { Serial.print("time: "); Serial.println(i+1500); //вывод в порт текущего времени задержки для проверки WDT delay(1500+i); //задержка i = i + 100; //инкремент задержки для следующей итерации цикла if (i >= 1000) {i = 0;}; //обнуление времени задержки (принудительное ограничение) wdt_reset(); //сброс WDT } //Этот код демонстрирует то, как WDT перезапускает микроконтроллер при превышении заданной задержки