Reklama

Základy ovládání mikrokontroléru ATmega(16/32) 16.díl – Watchdog

Úvod

Tento díl seriálu zaměřený na práci s mikrokontroléry ATmega je věnován watchdogu. Představme si případ, kdy máme například obsluhu některé komunikace, která v sobě obsahuje čekání na nějaký stav pomocí smyčky „while“ a díky chybě nikdy tento stav nenastane. V tom případě se nám program zasekne na tomto příkazu a nikdy by se již nevrátil do klasického chodu. Pro tyto případy se právě používá watchdog, což je nezávislý čítač, který když není včas vynulován a “přeteče”, tak resetuje mikrokontrolér. Proto ho musíme vždy včas vynulovat, aby se mikrokontrolér neresetoval i za klasického běhu programu.

Popis

V Mikrokontroléru je pro watchdog vytvořen oscilátor, který pro napájecí napětí 5 V má zhruba frekvenci 1 MHz. Časový interval pro reset watchdogu lze nastavit cca od 16,3 ms až do 2,2 s. Přesné hodnoty závisí na hodnotě napájecího napětí a na nastavení předděličky, ale k tomu se dostaneme až při popisu jednotlivých registrů.
Pro nastavení watchdogu se používá registr WDTCR. Jednotlivé bity, které obsahuje registr WDTCR ukazuje Tab. 1.
 

Tab. 1: Popis bitů registru WDTCR

Pozice bitu Označení
7 – (nejvyšší váha) -
6 -
5 -
4 WDTOE
3 WDE
2 WDP2
1 WDP1
0 – (nejnižší váha) WDP0

 

Jako první si popíšeme bit WDE. Tímto bitem lze zapnout watchdog nastavením do stavu log. 1.
 
WDTOE slouží k povolení vypnutí watchdogu. Pro vypnutí watchdogu musí být tento bit nastaven na hodnotu log. 1. a zároveň musí být bit WDE ve stavu log. 0. Po nastavení bitu WDTOE do stavu log. 1. se tento bit po čtyřech strojových cyklech automaticky nastaví zpět na hodnotu log. 0.
 
K vypnutí watchdogu je zapotřebí splnění dvou podmínek.
 
1. Během jedné instrukce musíme nastavit bity WDTOE i WDE do stavu log. 1., a to i v případě, že byl předtím již bit WDE nastaven do stavu log. 1.
2. Nastavíme bit WDE do stavu log. 0 během následujících čtyř cyklů.
 
Dále následují tři bity WDP0 – WDP2, kterými lze nastavit velikost předděličky, která určuje dobu „přetečení“ watchdogu. Jednotlivá nastavení bitů a k tomu odpovídající časy „přetečení“ pro dvě napájecí napětí ukazuje Tab. 2.

 

Tab. 2: Nastavení předděličky pro watchdog

WDP2 bitu WDP1 WDP0 Počet cyklů Čas pro Vcc = 3V Čas pro Vcc = 5V
0 0 0 16K 17,1 ms 16,3 ms
0 0 1 32K 34,3 ms 32,5 ms
0 1 0 64K 68,5 ms 65 ms
0 1 1 128K 0,14 s 0,13 s
1 0 0 256K 0,27 s 0,26 s
1 0 1 512K 0,55 s 0,52 s
1 1 0 1024K 1,1 s 1 s
1 1 1 2048K 2,2 s 2,1 s

 

K vynulování watchdogu dojde použitím speciální instrukce WDR. Instrukci WDR pro vynulování čítače použijeme i před nastavením registru WDTCR, abychom si nezkrátili čas „přetečení“ při prvním běhu.

Obsluha watchdogu

K práci s watchdogem, lze použít dva způsoby ovládání. První možností je ruční nastavení registru WDTCR a využití nulovací instrukce WDR z jazyka symbolických adres, kterou v programovacím jazyce C vložíme pomocí: asm(“WDR”). Příklad použití lze vidět níže ve zdrojovém kódě.

Druhou možností je vložení hlavičkového souboru „avr/wdt.h“ do projektu pomocí: „#include <avr/wdt.h > “ a využít maker z tohoto hlavičkového souboru. Nulování watchdogu potom probíhá pomocí wdt_reset(). Povolení watchdogu lze vykonat pomocí wdt_enable( value), kde „value“ znamená nastavení potřebného času, např. wdt_enable( WDTO_250MS). K nastavení časového intervalu jsou také definovány následující hodnoty: WDTO_15MS , WDTO_30MS, WDTO_60MS, WDTO_120MS, WDTO_250MS , WDTO_500MS , WDTO_1S , WDTO_2S. K vypnutí watchdogu slouží wdt_disable().

Okomentovaný zdrojový kód

V tomto příkladu dojde k změně stavu na PA0 v případě, že je vše v pořádku. Lze si odzkoušet, že zakomentováním řádku s „asm( “wdr” )“ nebo s „wdt_reset()“ ve smyčce „for“ ke změně stavu nikdy nedojde a mikrokontrolér se bude neustále restartovat.
 
První způsob použití:

 

001: #define F_CPU 16000000UL// definice hodinového signálu, nutné pro delay
002:
003: #include <util/delay.h// hlavičkový soubor pro zpoždění
004: #include <avr/io.h>// hlavičkový soubor AVR pro Input/output
005:
006: int i;// proměnná pro cykly
007:
008: int main(void)
009: {
010: DDRA = 0xFF;
011:
012: asm("wdr") ;//vynulování watchdogu
013: WDTCR = 0b00001101;// watchdog – zapnut a nastaven na 0,52s
014:
015: while(1)
016: {
017: for (i = 0; i < 5; i++)
018: {
019: _delay_ms(300);
020: asm("wdr");// vynulování watchdogu
021: }
022:
023: _delay_ms(300);
024: asm("wdr");// vynulování watchdogu
025:
026: PORTA = 0x01;
027:
028: _delay_ms(300);
029: asm("wdr");// vynulování watchdogu
030:
031: PORTA = 0x00;
032:
033: _delay_ms(300);
034: asm("wdr");// vynulování watchdogu
035:
036: PORTA = 0x01;
037:
038: _delay_ms(300);
039: asm("wdr");// vynulování watchdogu
040:
041: PORTA = 0x00;
042: }
043: return 0;
044: }

 
Druhý způsob použití:

 

001: #define F_CPU 16000000UL// definice hodinového signálu, nutné pro delay
002:
003: #include <util/delay.h// hlavičkový soubor pro zpoždění
004: #include <avr/io.h>// hlavičkový soubor AVR pro Input/output
005: #include <avr/wdt.h>// hlavičkový soubor pro watchdog
006:
007: int i;// proměnná pro cykly
008:
009: int main(void)
010: {
011: DDRA = 0xFF;
012:
013: wdt_reset();// vynulování watchdogu
014: wdt_enable(WDTO_500MS);// watchdog – zapnut a nastaven na 0,52s
015:
016: while(1)
017: {
018:
019: for (int i = 0; i < 5; i++)
020: {
021: _delay_ms(300);
022: wdt_reset();// vynulování watchdogu
023: }
024:
025: _delay_ms(300);
026: wdt_reset();// vynulování watchdogu
027:
028: PORTA = 0x01;
029:
030: _delay_ms(300);
031: wdt_reset();// vynulování watchdogu
032:
033: PORTA = 0x00;
034:
035: _delay_ms(300);
036: wdt_reset();// vynulování watchdogu
037:
038: PORTA = 0x01;
039:
040: _delay_ms(300);
041: wdt_reset();// vynulování watchdogu
042:
043: PORTA = 0x00;
044: }
045: return 0;
046: }

Vzorové zdrojové kódy slouží pouze k jednoduché demonstraci funkce, proto často obsahují globální proměnné, neobsahují většinou ukazatele, dále také neobsahují kontroly proměnných, definování nevyužitých pinů mikrokontroléru a podobné správné programátorské návyky. Proto je nutné tyto kódy brát s patřičnou rezervou.
 

 
Aktualizace: 18.4.2015
 

[1] ATMEL. 8-bit AVR Microcontroller with 16K Bytes In-System Programmable Flash. [online] citováno 24. Ledna 2015. Dostupné na www: http://www.atmel.com/Images/doc2466.pdf
[2] AVR Libc Home Page. Watchdog timer handling. [online] citováno 24. Ledna 2015. Dostupné na www: http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html
Jiné příspěvky v kategorii:

Základy ovládání mikrokontroléru ATmega(16/32) 1.díl – První kroky

Základy ovládání mikrokontroléru ATmega(16/32) 2. díl – Kompilace a krokování programu

Základy ovládání mikrokontroléru ATmega(16/32) 3.díl – Nahrání vytvořeného zdrojového kódu do mikrokontroléru

Základy ovládání mikrokontroléru ATmega(16/32) 4.díl – Ovládání vstupně/výstupních portů

Základy ovládání mikrokontroléru ATmega(16/32) 5.díl – Ošetření zákmitů na vstupním pinu mikrokontroléru

Základy ovládání mikrokontroléru ATmega(16/32) 6.díl – Externí přerušení

Základy ovládání mikrokontroléru ATmega(16/32) 7. díl – Jednoduchá elektronická hrací kostka

Základy ovládání mikrokontroléru ATmega(16/32) 8.díl – A/D převodník (1.část)

Základy ovládání mikrokontroléru ATmega(16/32) 9.díl – A/D převodník (2.část)

Základy ovládání mikrokontroléru ATmega(16/32) 10.díl – A/D převodník (3.část)

Základy ovládání mikrokontroléru ATmega(16/32) 11.díl – Čítač / Časovač (1.část – Základní popis)

Základy ovládání mikrokontroléru ATmega(16/32) 12.díl – Čítač / Časovač (2.část – Popis registrů)

Základy ovládání mikrokontroléru ATmega(16/32) 13.díl – Čítač / Časovač (3.část – Praktická ukázka)

Základy ovládání mikrokontroléru ATmega(16/32) 14.díl – Dvouřádkový LCD displej

Základy ovládání mikrokontroléru ATmega(16/32) 15.díl – Popis implementace komunikace I2C a EEPROM paměti 24LC512

Základy ovládání mikrokontroléru ATmega(16/32) 17.díl – Obsluha maticové klávesnice

Základy ovládání mikrokontroléru ATmega(16/32) 18.díl – Jednotka USART (1. část – Popis)

Základy ovládání mikrokontroléru ATmega(16/32) 19.díl – Jednotka USART (2. část – Praktická ukázka)

Základy ovládání mikrokontroléru ATmega(16/32) 20. díl – Generování audio signálu pomocí PWM

Základy ovládání mikrokontroléru ATmega(16/32) 21. díl – Analogový komparátor

Základy ovládání mikrokontroléru ATmega(16/32) 22. díl – Krokování programu v jazyce symbolických adres (JSA)

 
Tajned facebook
 

Za případné chyby v textu, ve zdrojovém kódě, nebo ve schématickém zapojení se omlouváme.
AUTOŘI NEBEROU ŽÁDNOU ODPOVĚDNOST ZA PŘÍPADNÉ ÚJMY NA ZDRAVÍ ČI MAJETKU.