Watchdog Timer

Микроконтроллеры / Для начинающих / Архитектура /

Микроконтроллеры для начинающих Что нужно для того, чтобы стать профессиональным разработчиком программ для микроконтроллеров и выйти на такой уровень мастерства, который позволит с лёгкостью найти и устроиться на работу с высокой зарплатой (средняя зарплата программиста микроконтроллеров по России на начало 2017 года составляет 80 000 рублей). Подробнее...

Слово Watchdog можно перевести как “сторожевая собака”. Применительно к микроконтроллерам Watchdog Timer - это сторожевой таймер.

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

Микроконтроллер ATtiny13A имеет улучшенный сторожевой таймер (WDT). WDT представляет собой таймер, отсчитывающий циклы отдельного встроенного генератора 128 кГц. WDT выдает прерывание или сброс системы, когда счетчик достигает заданного значения тайм-аута. В обычном режиме работы требуется, чтобы система использовала WDR - Watchdog Timer Reset - команду сброса счетчика при достижении значения тайм-аута. Если система зависла, то она не перезапустит счётчик, и тогда будет выдано прерывание или сброс системы.

Watchdog Timer

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

Одним из примеров является ограничение максимального времени, разрешенного для определенных операций, то есть прерывание выполняется, если операция выполняется дольше, чем ожидалось.

В режиме сброса системы WDT выполняет сброс по истечении времени таймера. Обычно это используется для предотвращения зависания системы в случае сбоя в программе.

Третий режим, режим прерывания и сброса системы, объединяет два других режима, сначала предоставляя прерывание, а затем переключаясь в режим сброса системы. Этот режим, например, позволит безопасно завершить работу, сохранив критические параметры перед сбросом системы.

Сторожевой таймер всегда включен фуз-битом (WDTON). Если фуз-бит установлен, то он переведет сторожевой таймер в режим сброса системы. При установленном фуз-бите, бит режима сброса системы (WIDE) и бит режима прерывания (WDTIE) устанавливаются в 1 и 0 соответственно. Для дальнейшего обеспечения безопасности программы изменения в настройке сторожевого таймера должны выполняться в соответствии с установленной очерёдностью. Последовательность действий очистки WDE и изменения конфигурации тайм-аута выглядит следующим образом:

  1. В одной и той же операции запишите логическую единицу для изменения состояния сторожевого таймера, изменив бит включения (WDCE) и WADE. Логическая единица должна быть записана в WDE независимо от предыдущего значения бита WDE.
  2. В течение следующих четырех тактов запишите биты WDE и предварительного делителя частоты (Watchdog prescaler - WDP) по желанию, но с очищенным битом WDCE. Это должно быть сделано за одну операцию.

В следующем примере показан код на ассемблере и C для отключения сторожевого таймера. В примере предполагается, что прерывания контролируются (например, путем глобального отключения прерываний), чтобы во время выполнения этих функций не возникало прерываний.

Ассемблер

WDT_off:
; Отключить глобальные прерывания
cli
; Сбросить Watchdog Timer
wdr
; Очистить WDRF в MCUSR
in r16, MCUSR
andi r16, (0xff - (1<<WDRF))
out MCUSR, r16
; Записать логическую 1 в WDCE и WDE
; Сохранить предыдущие настройки делителя частоты,
; чтобы предотвратить непреднамеренный тайм-аут
in r16, WDTCR
ori r16, (1<<WDCE) | (1<<WDE)
out WDTCR, r16
; Отключить сторожевой таймер WDT
ldi r16, (0<<WDE)
out WDTCR, r16
; Включить глобальные прерывания
sei
ret

Си

void WDT_off(void)
{
__disable_interrupt();
__watchdog_reset();
/* Очистить WDRF в MCUSR */
MCUSR &= ~(1<<WDRF);
/* Записать логическую 1 в WDCE и WDE */
/* Сохранить предыдущие настройки делителя частоты,
   чтобы предотвратить непреднамеренный тайм-аут */
WDTCR |= (1<<WDCE) | (1<<WDE);
/* Выключить WDT */
WDTCR = 0x00;
__enable_interrupt();
}

Если сторожевой таймер случайно включен, например, из-за утечки памяти или при сработке детектора напряжения, устройство будет сброшено, а сторожевой таймер останется включенным. Если код не настроен для обработки событий сторожевого таймера, это может привести к бесконечному циклу сброса тайм-аута. Чтобы избежать этой ситуации, прикладное программное обеспечение всегда должно сбрасывать флаг сброса системы сторожевого таймера (WDRF) и бит управления WDE в процедуре инициализации, даже если сторожевой таймер не используется.

В следующем примере показан код на ассемблере и C для изменения значения тайм-аута сторожевого таймера.

Ассемблер

WDT_Prescaler_Change:
; Отключить глобальные прерывания
cli
; Сбросить сторожевой таймер
wdr
; Запустить временную последовательность
in r16, WDTCR
ori r16, (1<<WDCE) | (1<<WDE)
out WDTCR, r16
; -- Есть четыре цикла, чтобы установить новые значения здесь -
; Установить новое значение предустановки 
; (тайм-аут) = 64 тыс. циклов (~0,5 с)
ldi r16, (1<<WDE) | (1<<WDP2) | (1<<WDP0)
out WDTCR, r16
; -- Закончить установку новых значений, используя 2 цикла -
; Включить глобальные прерывания
sei
ret

Си

void WDT_Prescaler_Change(void)
{
__disable_interrupt();
__watchdog_reset();
/* Запустить временную последовательность */
WDTCR |= (1<<WDCE) | (1<<WDE);
/* Установить новое значение предустановки 
  (тайм-аут) = 64 тыс. циклов (~0,5 с) */
WDTCR = (1<<WDE) | (1<<WDP2) | (1<<WDP0);
__enable_interrupt();
}

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


Вступить в группу "Основы программирования"

Подписаться на RUTUBE-канал

Подписаться на Дзен-канал

Подписаться на рассылки по программированию

Микроконтроллеры для ЧАЙНИКОВ Микроконтроллеры для ЧАЙНИКОВ

Бесплатная рассылка о микроконтроллерах. Рассылка содержит как бесплатную информацию для начинающих, так и ссылки на платные продукты (книги, видеокурсы и др.) для тех, кто захочет вникнуть в тему более глубоко. Подробнее...

Инфо-МАСТЕР ®
Все права защищены ©
e-mail: mail@info-master.su