#include <avr/wdt.h>
Этот header файл подключает интерфейс к некоторому встроенному макроопределению обработки сторожевого таймера, имеющемуся во многих МК AVR. Чтобы предотвращать случайное изменение конфигурации сторожевого таймера аварийным приложением, в микроконтроллерах предусмотрена специально установленная последовательность изменения конфигурации сторожевого таймера. Макросы в этом header файле для изменения любого значения выполняют требуемую последовательность автоматически. Прерывания в течение этой манипуляции блокируются.
Примечание:
Перед использованием сторожевого таймера нужно правильно установить конфигурационные фусы.
Сторожевой таймер остается активным после системного сброса (кроме состояния включения питания), используя самое быстрое значение предделителя (приблизительно 15 ms). Нужно обязательно выключать сторожевой таймер раньше запуска программы, dataseet рекомендует последовательность подобную следующей:
#include <stdint.h>
#include <avr/wdt.h>
uint8_t mcusr_mirror _attribute_ ((section (".noinit")));
void get_mcusr(void) \
__attribute__((naked)) \
__attribute__((section(".init3")));
void get_mcusr(void)
{
mcusr_mirror = MCUSR;
MCUSR = 0;
wdt_disable();
}
Сохранение
значения MCUSR в mcusr
_
mirror
необходимо
в случае,
если
приложение
будет
исследовать
источник
сброса, но
согласно dataseet-а
очищающий в
особенности
охранительный
флаг сброса
перед
отключением
сторожевого
таймера
требуется.
Макроопределения |
|
#define |
wdt_reset() __asm__
__volatile__ ("wdr") |
#define |
|
#define |
wdt_enable(timeout) _wdt_write(timeout) |
#define |
|
#define |
|
#define |
|
#define |
|
#define |
|
#define |
|
#define |
WDTO_1S 6 |
#define |
WDTO_2S 7 |
#define |
WDTO_4S 8 |
#define |
WDTO_8S 9 |
Значение:
__asm__ __volatile__ ( \
"in __tmp_reg__, __SREG__" "\n\t" \
"cli" "\n\t" \
"out %0, %1" "\n\t" \
"out %0, __zero_reg__" "\n\t" \
"out __SREG__,__tmp_reg__" "\n\t" \
: /* no outputs */ \
: "I" (_SFR_IO_ADDR(_WD_CONTROL_REG)), \
"r" ((uint8_t)(_BV(_WD_CHANGE_BIT) | _BV(WDE))) \
: "r0" \
)
Отключает
сторожевой
таймер, если
это возможно,
посредством
сброса
разряда WDE в регистре WDTCR или WDTCSR.
Включает сторожевой таймер, настраивая его на срабатывание через время, заданное через timeout (установка разрядов WDP0…WDP2 регистра WDTCR; Для тех устройств, которые имеют регистр WDTCSR, устанавливаются разряды WDP0…WDP3). Возможные значения timeout: см. символические константы WDTO_15MS и остальные (рассмотрены ниже).
Пример,
выбора
задержки
сброса МК приблизительно
500 ms:
Сброс
сторожевого
таймера. Если
сторожевой
таймер
включен, то
выполнение
этой команды
требуется
прежде, чем
истечёт
время работы
сторожевого
таймера,
иначе
произойдёт
сброс МК.
Символьные константы для времени задержки сброса сторожевого таймера. Так как сторожевой таймер построен на отдельном RC генераторе, времена задержек приблизительны и относятся к напряжению питания 5 V. При более низких напряжениях питания, времена задержки увеличиваются. Для старых устройств, времена задержек будут приблизительно в три раза больше, чем для более новых устройств (ATmega128, ATmega8) при Vcc = 3 V.
Возможные значения времени ожидания: 15 ms, 30 ms, 60 ms, 120 ms, 250 ms, 500 ms, 1 s, 2 s. (Некоторые устройства также учитывают 4 s и 8 s.) Символьные константы сформированы префиксом WDTO_XXMS.
См. WDT
0_15
MS
Примечание:
доступно
только для ATtiny2313, ATtiny24, ATtiny44, ATtiny84, ATtiny25, ATtiny45, ATtiny85, ATtiny261, ATtiny461, ATtiny861, ATmega48, ATmega88, ATmega168, ATmega48P, ATmega88P,
ATmega168P, ATmega328P, ATmega164P,
ATmega324P, ATmega644P, ATmega644, ATmega640,
ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega8HVA, ATmega16HVA,
ATmega406, AT90PWM1, AT90PWM2,
AT90PWM2B, AT90PWM3, AT90PWM3B, AT90PWM216, AT90PWM316 AT90USB82, AT90USB162, AT90USB646, AT90USB647, AT90USB1286, AT90USB1287, ATtiny48.
См. WDT
0_15
MS
Примечание:
доступно
только для ATtiny2313, ATtiny24, ATtiny44, ATtiny84, ATtiny25, ATtiny45, ATtiny85, ATtiny261, ATtiny461, ATtiny861, ATmega48, ATmega88, ATmega168, ATmega48P, ATmega88P,
ATmega168P, ATmega328P, ATmega164P,
ATmega324P, ATmega644P, ATmega644, ATmega640,
ATmega1280, ATmega1281, ATmega2560, ATmega2561, ATmega8HVA, ATmega16HVA,
ATmega406, AT90PWM1, AT90PWM2,
AT90PWM2B, AT90PWM3, AT90PWM3B, AT90PWM216, AT90PWM316 AT90USB82, AT90USB162, AT90USB646, AT90USB647, AT90USB1286, AT90USB1287, ATtiny48.