Домашняя страница библиотеки_c AVR

Синтаксис языка C

Библиотека языка C GNU glibc

 Страницы развития библиотеки_с AVR

Главная страница

Инструкция пользователя

Содержание библиотеки_c

Часто задаваемые вопросы

Содержание по алфавиту

Демонстрационные проекты


<avr/wdt.h>: Работа со сторожевым таймером

Детальное Описание

 #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 

wdt_disable()

#define 

wdt_enable(timeout)   _wdt_write(timeout)

#define 

WDTO_15MS   0

#define 

WDTO_30MS   1

#define 

WDTO_60MS   2

#define 

WDTO_120MS   3

#define 

WDTO_250MS   4

#define 

WDTO_500MS   5

#define 

WDTO_1S   6

#define 

WDTO_2S   7

#define 

WDTO_4S   8

#define 

WDTO_8S   9


Документация макроопределений

#define wdt_disable

 

 ) 

 

Значение:

__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.

#define wdt_enable

(

timeout 

 

 ) 

   _wdt_write(timeout)

Включает сторожевой таймер, настраивая его на сраба­тывание через время, заданное через timeout (уста­новка разрядов WDP0…WDP2 регистра WDTCR; Для тех устройств, которые имеют регистр WDTCSR, устанавливаются разряды WDP0…WDP3). Возможные значения timeout: см. символические константы WDTO_15MS и остальные (рассмотрены ниже).

Пример, выбора задержки сброса МК  приблизительно 500 ms:

wdt_enable(WDTO_500MS);

#define wdt_reset

 

 ) 

   __asm__ __volatile__ ("wdr")

Сброс сторожевого таймера. Если сторожевой таймер включен, то выполнение этой команды требуется прежде, чем истечёт время работы сторожевого таймера, иначе произойдёт сброс МК.

#define WDTO_120MS   3

См. WDT0_15MS

#define WDTO_15MS   0

Символьные константы для времени задержки сброса сторожевого таймера. Так как сторожевой таймер построен на отдельном 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.

#define WDTO_1S   6

См. WDT0_15MS

#define WDTO_250MS   4

См. WDT0_15MS

#define WDTO_2S   7

См. WDT0_15MS

#define WDTO_30MS   1

См. WDT0_15MS

#define WDTO_4S   8

См. WDT0_15MS Примечание: доступно только для 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.

#define WDTO_500MS   5

См. WDT0_15MS

#define WDTO_60MS   2

WDT0_15MS

#define WDTO_8S   9

См. WDT0_15MS Примечание: доступно только для 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.

Hosted by uCoz