Amateur Radio Station R9AL

     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 перезапускает микроконтроллер при превышении заданной задержки


WDT может быть использован для того, чтобы предотвратить полное зависание контроллера без возможности перезапустить его. Эта функция поможет . перезапустить МК в случае его зависания, когда нет непосредственного доступа к плате МК, например, в космическом спутнике.





Copyright © R9AL 2021 Все права защищены

Рейтинг@Mail.ru