Сторожевой таймер (Watchdog timer) в Arduino

Сторожевой таймер на arduino

Плата Arduino UNO имеет микросхему ATmega328P в качестве блока управления. В свою очередь ATmega328P имеет сторожевой таймер (Watchdog timer или WDT), который является полезной функцией. Ее суть помочь системе восстановиться после сценариев, в которых происходит зависание  из-за ошибок в написанном коде или из-за условий, которые могут возникнуть из-за проблем с оборудованием.

Как работает сторожевой таймер?

Сторожевой таймер необходимо настроить в соответствии с потребностями устройства. Для работы  он использует внутренний источник тактовой частоты 128 кГц.

Когда он включен, то начинается отсчет от 0 до значения, выбранного пользователем. Если таймер не сбрасывается к тому времени, когда он достигает выбранного пользователем значения, то происходит сброс (RESET) микроконтроллера.

WDT может быть сконфигурирован для 10 различных настроек времени (время, после которого сторожевой таймер переполняется, вызывая сброс).

Различные значения времени:

  • 16 мс
  • 32 мс
  • 64 мс
  • 0,125 с
  • 0,25 с
  • 0,5 с
  • 1 с
  • 2 с
  • 4 с
  • 8 с

Пример

Давайте посмотрим, как настроить сторожевой таймер для платы Arduino UNO. Для этого мы будем использовать простой пример мигания светодиода. Использоваться будет встроенный светодиод, подключенный к контакту 13 платы.

  • Светодиод мигает определенное время перед входом в бесконечный цикл while(1). Цикл while(1) используется для имитации системы в зависшем состоянии.
  • Поскольку сторожевой таймер не сбрасывается в цикле while(1), он вызывает сброс системы, и светодиод снова начинает мигать, прежде чем система зависнет снова и перезапустится.

Комментарий к алгоритму

В начале кода сторожевой таймер отключается и перед его включением необходимо выдержать задержку примерно в 3 секунды. Эта задержка важна для того, чтобы позволить загрузчику в Arduino проверить, загружается ли новый код, и если да, то дать ему время записать код во флэш-память.

Если не выдерживать такой задержки, может произойти ситуация, что загрузчик не успеет загрузить прошивку во флеш-память. А сторожевой таймер все время будет сбрасывать микроконтроллер.

Внимание!


Это повредит плату Arduino и приведет к тому, что скетчи не смогут быть загружены в плату.

Этого может не произойти с новым загрузчиком Optiboot, который поставляется с более новой версией Arduino. Но этого не избежать со старыми версиями.

Примечание!


В случае, если вы «сломаете» Arduino таким образом, то придется записать загрузчик, используя другую плату Arduino в качестве программатора.

Скетч для примера

#include <avr/wdt.h> /* Заголовочный файл для сторожевых таймеров в AVR */ 

void setup() { 
   Serial.begin(9600); /* Определяем скорость передачи данных для последовательной связи */  
   Serial.println("Запуск демо-версии Watchdog"); 
   pinMode(13, OUTPUT); wdt_disable(); /* Отключаем сторожевой таймер и ждем более 2 секунд. */ 
   delay(3000); /* Сделано для того, чтобы Arduino не перезагружался бесконечно в случае неправильной конфигурации */ 
   wdt_enable(WDTO_2S); /* Включаем сторожевой таймер с тайм-аутом в 2 секунды */ 
} 

void loop() { 
   for(int i = 0; i<20; i++) /* Мигаем светодиодом некоторое время */ 
   { 
      digitalWrite(13, HIGH); 
      delay(100); 
      digitalWrite(13, LOW); 
      delay(100); 
      wdt_reset(); /* Сбросить сторожевой таймер */ 
   } 
   while(1); /* Бесконечный цикл. Приводит к тайм-ауту сторожевого таймера и сбросу системы. */ 
}
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии