Molti microcontrollori integrano il sistema denominato watchdog al fine di controllare il programma caricato al suo interno. Esso, infatti, ha il compito di monitorare l’esecuzione del programma e di riavviare il microcontrollore nel momento in cui si verifichino blocchi o loop infiniti.
Di default tale funzionalità è disabilitata poiché si tiene conto del fatto che il programmatore preveda, durante la stesura del codice, la prevenzione di eventuali blocchi o loop infiniti. Spesso però ci si trova in situazioni per cui il nostro programma vada in situazioni di stallo durante l’attesa di eventi esterni che noi non possiamo prevedere o controllare. Proprio per questo ci viene incontro il watchdog
Vediamo come è possibile utilizzarlo all’interno del nostro sketch da caricare su arduino.
Prima di tutto includiamo la libreria #include <avr/wtd.h>.
Nel setup dovremo inizializzare il nostro watchdog attraverso l’istruzione
wdt enable(Parola Chiave);
Questa parola chiave è definita in base al tempo che riteniamo necessario, assunta dalla tabella seguente:
Tempo reset | Parola Chiave |
15mS | WDTO_15MS |
30mS | WDTO_30MS |
60mS | WDTO_60MS |
120mS | WDTO_120MS |
250mS | WDTO_250MS |
500mS | WDTO_500MS |
1S | WDTO_1S |
2S | WDTO_2S |
4S | WDTO_4S |
8S | WDTO_8S |
Supponiamo quindi di impostare il nostro watchdog con l’istruzione
wdt enable(WDTO_4S);
questo significa che se entro 4 secondi non resettiamo il conteggio del watchdog, esso eseguirà automaticamente il reset della cpu.
Per resettarlo impieghiamo la seguente funzione:
wdt reset();
Supponiamo ora di avere le seguenti istruzioni all’interno del nostro loop():
void loop(){
delay(3000);
Serial.println(“Ciao”);
wdt reset();
}
In questa situazione il watchdog non riavvierà mai Arduino in quanto passeranno solo 3 secondi prima che venga effettuato un reset.
Supponendo invece di avere l’istruzione delay(5000); al posto del delay(3000); . Di fatto non vedremo mai su seriale stampato il Ciao poichè non andremo mai oltre al delay.
Il funzionamento del watchdog in definitiva è molto semplice e intuibile e soprattutto utile nel momento in cui vogliamo essere sicuri che una determinata istruzione o blocco di istruzioni vengano eseguiti nel tempo preimpostato del watchdog.
Daniele Ruffo