Режимы работы wdt
Сторожевые таймеры в общем случае допускают следующие режимы работы:
- режим прерывания;
- режим сброса системы;
- режим прерывания и сброса системы;
- таймер остановлен.
Установка режимов работы таймера может осуществляться как в процессе функционирования системы, так и на этапе программирования.
Управление режимами работы в процессе функционирования
Рассмотрим сначала возможности управления режимами работы таймера, которые могут быть реализованы в процессе функционирования системы. Установка указанных режимов осуществляется установкой соответствующих бит регистра управления WDTCR.
В табл. 7.2 показаны все режимы сторожевого таймера.
WDTON |
WDE |
WDIE |
Режим работы WDT |
Действие по истечении контрольного времени |
0 |
0 |
0 |
Таймер остановлен |
Нет |
0 |
0 |
1 |
Режим прерывания |
Вызов прерывания |
0 |
1 |
0 |
Режим сброса |
Системный сброс |
0 |
1 |
1 |
Режим прерывания и сброса |
Вызов прервания и переход к системному сбросу |
1 |
х |
Х |
Режим сброса |
Системный сброс |
Если оба флага (WDE и WDIE) сброшены, то сторожевой таймер остановлен.
Нормальный режим работы (режим сброса)
Если установлен только бит WDE – то сторожевой таймер работает в режиме системного сброса. В нормальном режиме работы необходимо, чтобы программа периодически сбрасывала охранный таймер при помощи команды WDR. Программа должна быть написана таким образом, чтобы команда сброса всегда приходила раньше, чем содержимое таймера достигнет конца. Если система зависнет и перестанет перезапускать счетчик, то он досчитает конца. Это вызовет прерывание или системный сброс. В результате программа начнет работать сначала.
Режим прерывания
Если установлен только бит WDIE – то сторожевой таймер работает в режиме прерывания.
В режиме прерываний при истечении заданного времени система WDT вырабатывает запрос на прерывание. Этот запрос может использоваться для пробуждения микроконтроллера из любого спящего режима.
Пробуждение происходит таким же образом, как в случае прерывания от системного таймера. Один из вариантов использования такого режима – ограничение максимального времени выполнения некоторых операций. Таймер вызывает прерывание, если выполнение операции происходит дольше, чем положено.
Режим прерывания и системного сброса
Если оба флага (WDE и WDIE) установлены, охранный таймер переходит в режим прерывания со сбросом. В этом режиме первое срабатывание охранного таймера установит флаг WDIF. Как только начнется процедура обработки прерывания, флаги WDIE и WDIF автоматически очистятся, а сторожевой таймер перейдет в режим сброса.
Этот режим объединяет возможности двух первых режимов. Сначала вызывается прерывание, а затем происходит системный сброс. Этот режим применяется, например, в том случае, когда перед вызовом системного сброса необходимо сохранить важные параметры.
Это повышает надежность работы охранного таймера по сравнению с обычным режимом работы по прерыванию. Если процедура обработки прерывания затянется непозволительно долго, произойдет очередное срабатывание сторожевого таймера, которое уже вызовет системный сброс микроконтроллера.
В случае успешного завершения процедуры обработки прерывания сторожевой таймер все равно останется в режиме системного сброса для того, чтобы сторожевой таймер постоянно оставался в режиме прерывания, необходимо устанавливать этот режим программным путем после каждого прерывания.
Таймеры, реализующие режимы прерывания имеют несколько усложненную функциональную схему формирования сигналов сброса и прерывания (рис.7.2.)
Рис.7.2. Функциональная схема МК AVR AT2313.
Установка режимов работы таймера на этапе программирования.
В некоторых моделях Tiny и во всех Mega есть специальные fusе- регистры, доступные только при подключении программаторов (отладчиков), указанные регистры доступны только на этапе программирования кристаллов и соответственно на этом этапе могут быть использованы для установки требуемого режима.
Один из битов fusе- регистра, а именно бит WDTON в некоторых моделях МК серии AVR используется для установки режима сброса. Т.е. при помощи соответствующего fusе- переключателя (WDTON) можно установить режим, при котором сторожевой таймер постоянно включен, и при этом срабатывание таймера всегда вызывает сброс системы. В результате выполнения указанной операции бит системного сброса (WDE) и бит режима прерывания (WDIE) приобретают фиксированные значения 1 и 0 соответственно.
По умолчанию fusе- бит WDTON находится в незапрограммированном состоянии (лог. 1), означающее, что WDT выключен, и для приведения в действие его следует специально инициализировать.
Наличие WDTON - довольно удобное свойство для того, чтобы не возиться с включением WDT самостоятельно, но оно в значительной мере обесценивается тем фактом, что по умолчанию сторожевой таймер запрограммирован на минимальный интервал (~15 мс), который все равно, как правило, приходится увеличивать.
Это так называемое аппаратное включение охранного таймера (WDTON) для режима повышенной надежности.
Уровни защиты установленного режима работы WDT
Если установлен разряд WDE (Watchdog Еnable), то сторожевой таймер активен. Если разряд WDE сброшен (лог. 0), то сторожевой таймер отключен.
Для предотвращения самопроизвольного, например, при понижении напряжения питания, или непреднамеренного изменения режима работы WDT должна быть реализована специальная последовательность действий. Сложность этой последовательности (количество операций, которое необходимо выполнить для изменения режима работы таймера) определяется уровнем защиты режима.
Возможна реализация трех уровней защиты режимов работы WDT.
0 – защита отсутствует и режимы работы могут быть изменены путем изменения одного бита WDE (Watchdog Еnable);
1 – защита установлена, при этом режимы работы могут быть изменены путем выполнения специальной последовательности команд, изменяющих бит WDE и WDTOE (Watchdog Turn Off Еnable);
2 – выключить таймер программными средствами невозможно, можно только изменить его параметры (длительность).
Отключение сторожевого таймера с уровнем защиты 1.
Во избежание непреднамеренного отключения сторожевого таймера, разряд WDE может быть сброшен только в том случае, если установлен разряд WDTOE.
Для отключения активного сторожевого таймера необходимо выполнить следующую последовательность действий.
1. С помощью одной команды должны быть установлены разряды WDE и WDTOE. Если сторожевой таймер активен, разряд WDE необходимо установить даже в том случае, если ранее он уже был установлен.
2. На протяжении последующих четырех импульсов такта системной синхронизации в разряд WDE записывается лог. 0, что приводит к отключению сторожевого таймера.
После установки разряда WDTOE он в течение четырех периодов такта системной синхронизации остается в состоянии лог. 1, а затем аппаратно сбрасывается в лог. 0. Программа пользователя имеет возможность отключить сторожевой таймер посредством записи лог.0 в разряд WDE только во время этих четырех тактов системной синхронизации.
Рассмотрим в качестве примера короткую программу, демонстрирующую отключение активного сторожевого таймера.
Листинг 7.1 |
sbr r16, 1<<WDTOE 1<<WDE ;установка разрядов WDE и WDTOE
out WDTCR, r16 ;WDTCR обратно, WDE+WDTOE=1
cbr r16, 1<<WDE ;стираем разряд WDE
out WDTCR, r16 ; WDTCR записываем повторно
nop ;
nop ;
nop ; WDTOE сбрасывается аппаратно
Ожидать истечения времени до сброса разряда WDTOE не обязательно. Три команды пор в представленном выше листинге предназначены только для обозначения момента времени сброса.
Для активизации сторожевого таймера в подобной процедуре нет необходимости. Достаточно просто установить разряд WDE в лог. 1.
Команда сброса сторожевого таймера в исходное состояние : WDR.
WDR – (Watchdog Reset) – сброс сторожевого таймера.
Установка с уровнем защиты – 0.
Для семейства Classic и Tiny для включения достаточно установить бит WDE в единичное состояние, одновременно, если надо, устанавливается и период таймера битами WDP2:0 того же регистра, задающими коэффициент деления генератора (состояние 000 соответствует минимальному периоду ~ 15 мс, 110 - примерно 1 с, 111 задает максимальный период немного менее 2 с). Перед такими операциями всегда рекомендуется сбрасывать WDT командой wdr (иначе таймер может начать отсчет не с начала, и произойдет непроизвольный сброс МК), как показано в листинге 7.2.
Листинг 7.2 |
сli
wdr
ldi tmp, (1<<WDE) I (l<<WDP2) I (l<<WDP1) I (l<<WDP0)
out WDTCR,tmp
sei
Установка с уровнем защиты – 1.
Для семейства Mega процедура несколько сложнее: сначала нужно установить биты WDCE И WDE одновременно, потом повторно разрешить работу установкой WDE и одновременно установить коэффициент деления, но при сброшенном WDCE: (листинг 7.3).
Листинг 7.3 |
сli
wdr
ldi tmp, (l<<WDCE) I (l<<WDE)
out WDTCR,tmp
ldi tinр, (l«WDE) I (l«WDP2) I (l«WDPl.) I (l«WDP0)
out WDTCR,tmp
sei
Процедура выключения одинакова для всех моделей и аналогична включению в предыдущем случае (листинг 7.4).
Листинг 7.4 |
cli
wdr
ldi tmp, (l«WDCE) I (l«WDE)
out WDTCR,tmp
ldi tmp, (O«WDE)
out WDTCR,tmp
sei
После того как мы разобрались с включением, WDT начинает постоянно "молотить" (в том числе и в режиме энергосбережения), и чтобы избежать сброса МК в нормальном режиме работы программы, таймер следует периодически сбрасывать командой wdr - paньше, чем истечет заданный период. Обычно это делается по какому-либо прерыванию, например:
ЕХТ INT0:
wdr ;сброс сторожевого таймера
Предположим, что мы установили WDT на период 2 с, а прерывание должно возникать каждую секунду, то командой wdr мы сбрасываем таймер WDT заведомо раньше, чем он сработает, и тогда он начнет отсчет выдержки сначала. Если же что-то (часы или программа) "повиснет", то произойдет общий сброс МК.
Внешний сброс
Внешний или аппаратный сброс реализуется подачей сигнала низкого уровня на вывод /RST. Сигнал низкого уровня должен сохраняться как минимум два периода такта системной синхронизации. Нарастающий фронт сигнала на выводе сброса /RST после превышения порогового напряжения включения V RST приводит в действие счетчик задержки Z1 (рис. 7.3), и, следовательно, - внутренний сигнал сброса. По истечение времени tTOUT внутренний процесс сброса заканчивается, и микроконтроллер переходит к выполнению программы, начиная с адреса 0.
Рис.7.3.
Сброс от сторожевого таймера
При срабатывании сторожевой таймер генерирует короткий импульс сброса продолжительностью один период такта системной синхронизации. Нарастающий фронт этого импульса инициирует внутренний процесс сброса, а ниспадающий фронт активизирует счетчик задержки (рис. 7.4).
Рис.7.4.
После формирования задержки tтouт внутренний процесс сброса заканчивается, и микроконтроллер переходит к выполнению про граммы, начиная с адреса О. Подробнее этот процесс рассматривается в главе 5, "Сторожевой таймер".
Регистр MCUCSR