воскресенье, 17 марта 2013 г.

Программирование сторожевого таймера C

Прежде чем приступать к программированию сторожевого таймера, рекомендую ознакомиться со следующей информацией:
Команды для работы со сторожевым таймером:
  • #include <avr/wdt.h> - подключение библиотеки для работы со сторожевым таймером
  • wdt_reset() - сброс сторожевого таймера
  • wdt_enable() - включение сторожевого таймера
  • wdt_disable() - выключение сторожевого таймера
Для работы со сторожевым таймером для начала необходимо подключить библиотеку "wdt.h" в которой описаны все основные команды для работы со сторожевым таймером. Пример программы №1 будет включать сторожевой таймер, который в свою очередь будет сбрасывать микроконтроллер каждые 4 секунды. Пример программы №2 будет иметь более расширенный функционал: если микроконтроллер перестал отвечать, то он будет сброшен; если же он работает нормально, то при поступлении прерывания от сторожевого таймера каждые 8 секунд сторожевой таймер будет сбрасываться и начинать отсчет времени сначала. Это позволит контролировать работу устройства на протяжении всего времени.

Пример программы №1:

#include <avr/io.h> //подключаем стандартную библиотеку ввода/вывода
#include <avr/wdt.h> //подключаем библиотеку для работы со сторожевым таймером

int main(void)
{
wdt_enable(WDTO_4S); //включаем сторожевой таймер со сбросом через 4 секунды
    while(1); //любая пользовательская программа
}

Пример программы №2:

#include <avr/io.h> //подключаем стандартную библиотеку ввода/вывода
#include <avr/wdt.h> //подключаем библиотеку для работы со сторожевым таймером
#include <avr/interrupt.h> //подключаем библиотеку для работы с прерываниями

ISR(WDT_vect) //подпрограмма обработки прерывания от сторожевого таймера
{
wdt_reset(); //сброс сторожевого таймера
WDTCSR = 1 << WDIE; //разрешение прерываний от сторожевого таймера (запрещаются автоматически при сбросе сторожевого таймера)
}

int main(void)
{
sei(); //разрешаем глобальные прерывания
wdt_enable(WDTO_8S); //включаем сторожевой таймер со сбросом через 4 секунды
WDTCSR = 1 << WDIE//разрешение прерываний от сторожевого таймера
    while(1); //любая пользовательская программа
}

Параметры функции wdt_enable() обуславливают время сброса сторожевого таймера:
  • WDTO_15MS
  • WDTO_30MS
  • WDTO_60MS
  • WDTO_120MS
  • WDTO_250MS
  • WDTO_500MS
  • WDTO_1S
  • WDTO_2S
  • WDTO_4S
  • WDTO_8S