Get the Flash Player to see this player.

time2online Joomla Extensions: Simple Video Flash Player Module
Watchdog

Watchdog to rodzaj timera, który, gdy nie zostanie wyzerowany (specjalną instrukcją wdt_reset()) resetuje procesor. Ma to zabezpieczać system, kiedy program się zawiesi. Sposób działania jest prosty, wystarczy dobrze ustawić rejestr WDTCR i co jakiś czas resetować licznik. W rejestrze do dyspozycji mamy 5 bitów. Trzy pierwsze bity ustawiają czas po jakim watchdog ma wywołać reset, a następne dwa służą do załączania watchdoga.

Watchdog posiada własny rezonator ok 1MHz, dlatego dostępne są czasy od 17,1ms do 2,2s. Ustala się je poprzez odpowiednie ustawienie bitów WDP0, WDP1, WDP2. Wygląda to tak:

0 0 0 16K (16,384) 17.1 ms
0 0 1 32K (32,768) 34.3 ms
0 1 0 64K (65,536) 68.5 ms
0 1 1 128K (131,072) 0.14 s
1 0 0 256K (262,144) 0.27 s
1 0 1 512K (524,288) 0.55 s
1 1 0 1,024K (1,048,576) 1.1 s
1 1 1 2,048K (2,097,152) 2.2 s

Gdybyśmy włączyli watchdoga, ustawili bity WDP na 1 1 1, ale nie umieścili w programie instrukcji _WDR(), to co 2,2s nasz mikrokontroler resetowałby program, aby tego uniknąć zawsze trzeba pamiętać, aby w samym kodzie co ustalony czas dać wdt_reset(). Czas ten nie może być dłuższy niż ustawiony w bitach WDP (np. mniej niż 2,2s dla 1 1 1).

W Win/AVR dostępne są biblioteki obsługujące watchdoga avr/wdt.h, do dyspozycji mamy 3 funkcje:

wdt_reset() - resetująca licznik watchdoga;

wdt_enable(timeout) - ustawiająca czas po którym licznik zostanie przepełniony;

Gdzie timeout może przybrać wartości:

WDTO_15MS
WDTO_30MS
WDTO_60MS
WDTO_250MS
WDTO_500MS
WDTO_1S
WDTO_2S

wdt_disable() - wyłączająca watchdoga;

Zastosowanie tych funkcji zaprezentowałem na przykładzie. Jak widać czasy z funkcji _delay_ms() zależą od taktowania procesora (w bibliotece lcd.h jest ustawione na 8MHz, jeśli wasz mikrokontroler taktowany jest inaczej, to czasy dealy mogą się różnić). Czas _delay_ms(1500) (jest taki duży, że nawet gdy wasze taktowanie będzie złe, to zauważycie jak działa program) jest większy niż czas watchdoga, więc gdy naciśniemy PB6, to watchdog wywoła przerwanie. Gdy naciśniemy PB5, to program wyświetli inny napis, ale reset nie zostanie wywołany, a gdy naciśniemy PB4, to watchdog się wyłączy i będzie można naciskać PB6 bez resetu;

Przykładowy program:

#include <stdio.h>  //dodajemy biblioteki, które umożliwiają korzystanie z procedur
#include <math.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/wdt.h>
#include "LCD.h"

int main(void)
{

DDRB = 0; //ustawiamy port B jako wyjście
PORTB = 255; // ustawienie napięcia na porcie B

LCD_start();

//inicjacja Watchdoga
WDTCR |= (1<<WDTOE) | (1<<WDE); 
wdt_enable(WDTO_15MS);

while (1) //pętla główna programu, to co jest w tej pętli powtarza się w nieskończoność
{

wdt_reset();
 if(bit_is_clear(PINB,PB6 ))  //procedura bit_is_clear zwraca nam wartość logiczna true lub false w zależności od tego czy jest 0 czy 1 na bicie PD0
 {
 LCD_putstrxy("petla bez watch ", 0, 0); // wyświetla napis w 0 wierszu i 0 kolumnie
 _delay_ms(1500);
 }
 if(bit_is_clear(PINB,PB5 ))
 {
 LCD_putstrxy("zmiana napisu   ", 0, 0);
 _delay_ms(14);
 }
 if(bit_is_clear(PINB,PB4 ))
 {
 LCD_putstrxy("wyłączyłeś watch", 0, 0);
 _delay_ms(14);
 wdt_disable();
 }


}
}

kliknij tu, aby pobrać cały program na Atmege32