Отключение сторожевого таймера с уровнем защиты 1.
Уровни защиты установленного режима работы WDT
Установка режимов работы таймера на этапе программирования.
В некоторых моделях Tiny и во всех Mega есть специальные fusе- регистры, доступные только при подключении программаторов (отладчиков), указанные регистры доступны только на этапе программирования кристаллов и соответственно на этом этапе могут быть использованы для установки требуемого режима.
Один из битов fusе- регистра, а именно бит WDTON в некоторых моделях МК серии AVR используется для установки режима сброса. Т.е. при помощи соответствующего fusе- переключателя (WDTON) можно установить режим, при котором сторожевой таймер постоянно включен, и при этом срабатывание таймера всегда вызывает сброс системы. В результате выполнения указанной операции бит системного сброса (WDE) и бит режима прерывания (WDIE) приобретают фиксированные значения 1 и 0 соответственно.
По умолчанию fusе- бит WDTON находится в незапрограммированном состоянии (лог. 1), означающее, что WDT выключен, и для приведения в действие его следует специально инициализировать.
Наличие WDTON - довольно удобное свойство для того, чтобы не возиться с включением WDT самостоятельно, но оно в значительной мере обесценивается тем фактом, что по умолчанию сторожевой таймер запрограммирован на минимальный интервал (~15 мс), который все равно, как правило, приходится увеличивать.
Это так называемое аппаратное включение охранного таймера (WDTON) для режима повышенной надежности.
Если установлен разряд WDE (WatchdogЕnable), то сторожевой таймер активен. Если разряд WDE сброшен (лог. 0), то сторожевой таймер отключен.
Для предотвращения самопроизвольного, например, при понижении напряжения питания, или непреднамеренного изменения режима работы WDTдолжна быть реализована специальная последовательность действий. Сложность этой последовательности (количество операций, которое необходимо выполнить для изменения режима работы таймера) определяется уровнем защиты режима.
Возможна реализация трех уровней защиты режимов работы WDT.
0 – защита отсутствует и режимы работы могут быть изменены путем изменения одного бита WDE (WatchdogЕnable);
1 – защита установлена, при этом режимы работы могут быть изменены путем выполнения специальной последовательности команд, изменяющих бит WDE и WDTOE(Watchdog Turn Off Еnable);
2 – выключить таймер программными средствами невозможно, можно только изменить его параметры (длительность).
Во избежание непреднамеренного отключения сторожевого таймера, разряд 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) – сброс сторожевого таймера.