WDT
Il Watchdog (letteralmente "cane da guardia") Timer
o WDT è un meccanismo di sicurezza per il programma in esecuzione.
La sua funzione è quella di resettare il microcontroller se, entro un certo
tempo prefissato, il suo contatore non viene azzerato.
Trattandosi di un sistema di sicurezza dalle regole di funzionamento
critiche e che può non essere richiesto dall' applicazione, la sua messa in
servizio dipende dal _CONFIG preliminare.
E' comune per tutti i PIC la disponibilità di una opzione _WDT che
può essere settata come:
_WDT_ON |
Watchdog abilitato |
_WDT_OFF |
Watchdog disabiitato |
Per Baseline e Midrange NON è possibile disabilitare da programma il WDT
una volta abilitato nella configurazione.
Solamente in alcuni PIC (Enhanced - PIC18) è possibile agire sullo stato del
WDT da programma.
Il funzionamento del watchdog si basa su un timer interno, alimentato da
una sorgente di clock autonoma, non sincronizzata con il clock principale o
con altri eventi esterni.
Questo clock è sempre presente, anche con il processore in modalità sleep e
quindi può essere una fonte di wake-up dallo sleep.
Il clock interno è a circa 31kHz e la durata del conteggio del timer è di
circa 18ms, ma può variare da chip a chip, oltre che con la temperatura
e le tolleranze costruttive. In effetti, per un Baseline o Midrange, il minimo
tempo garantito dal costruttore si aggira attorno a 7 ms e il massimo a 33 ms,
medio 18 ms. Non si tratta quindi di un conteggio di precisione e di
questo va tenuto conto.
Il conteggio di WDT inizia non appena il clock è disponibile e non può
essere arrestato durante il funzionamento; quando il contatore va in overflow,
si genera un reset.
L' unico modo per evitare l' overflow è quello di azzerare il contatore
del timer prima che l' overflow avvenga.
Questo si ottiene con la speciale istruzione
clrwdt (Clear WDT). Ogni volta che questa istruzione è eseguita,
il timer si azzera e riprende da capo il conteggio; agendo ciclicamente in
modo che clrwdt sia
eseguita prima dell' overflow, è possibile evitare il reset. Quindi occorre
inserire in un loop del programma l' esecuzione di clrwdt
ripetuta con un periodo inferiore a 7 ms.
Se questo non avviene, perchè il programma è bloccato in modo inaspettato
o l' hardware non risponde nei tempi previsti, il reset riporta a 0 il PC e
riavvia il programma.
Dunque, l' abilitazione di WDT prevede due presupposti:
- inserire nel programma l'istruzione clrwdt
con una cadenza adeguata ad azzerare il timer prima dell' overflow
- disporre al reset di una procedura che ne determini la causa
Infatti, come per le altre situazioni di reset, anche quello generato da
WDT determina una situazione univoca nei flag di controllo e permette di
discriminare la causa. Se la causa è WDT, questo vuole dire che si è
verificata una situazione anomala e quindi è possibile prendere provvedimenti
adeguati.
Se questi presupposti non sono entrambi implementati, non ha alcun senso
abilitare WDT.
Inoltre WDT va disabilitato durante il debug in-circuit per evitare reset
che renderebbero gravoso il lavoro.
WDT e Timer0
WDT nei Baseline
e Midrange è legato al Timer0, con il quale condivide il pre
divisore.
Ecco come si presenta il diagramma semplifica del gruppo Timer0-WDT nei PIC
Baseline e Midrange:
Osserviamo che il prescaler è unico per entrambie le funzioni, ovvero può
essere assegnato o a WDT o a Timer0. La scelta è effettuata con il bit PSA
del registro OPTION. Per comprendere meglio la cosa, prendiamo un diagramma semplificato del
complesso TIMER0/Prescaler/WDT
La chiave è il bit PSA. A livello 0 instrada il segnale di
ingresso del conteggio attraverso il prescaler (percorso verde), mentre il
segnale del WDT viene passato direttamente (percorso blu).
Per contro, se il valore assegnato a PSA
è 1, sarà il
segnale del WDT ad essere trattato dal prescaler (percorso blu), mentre
quello del conteggio perviene direttamente al TMR0.
Quindi
occorre attenzione nel dedicare le risorse: se il prescaler è
attribuito a Timer0 non potrà essere usato con WDT e viceversa.
|
Il prescale ha l' effetto di allungare il tempo di
conteggio: con prescaler 1:2, il tempo minimo passerà a 14-36 ms. Con il
prescaler a 1:128 si arriva a 896-2304 ms.
Nei PIC Enhanced Midrange e PIC18 Timer0 e WDT hanno prescaler separati;
in queste famiglie non è più presente il registroOPTION,
ma Timer0 ha un registro di controllo proprio, T0CON,
mentre il prescaler del WDT viene impostato nel _CONFIG.
Ecco lo schema a blocchi del WDT di un PIC18
In questi processori si parla più correttamente di un post scaler, con
rapporto tra 1:1 e 1:32768, il che peremette di estendere il tempo operativo a
oltre 131 minuti (il tempo minimo garantito è 4 ms).
Un registro WDTCON consente di abilitare o
disabilitare il WDT da programma (ma non di variare il post scaler).
Il ruolo del WDT
Il watchdog ha due finalità specifiche:
- verificare che il programma non si è "perso" durante l' esecuzione per
qualche errore di indirizzamento o di stack o se non è bloccato in un ciclo infinito
dovuto ad un bug del programma.
- svegliare il PIC dalla modalità sleep
Questa funzione è integrata in tutti i PIC, ma è considerata così
importante per varie applicazioni da originare la costruzione di moduli di
watchdog esterni, che possono essere utilizzati anche da processori che ne
sono privi.
Da un punto di vista pratico possiamo far equivale la funzione del watchdog
a quella del "pulsante di uomo morto" presente in molte
apparecchiature e nelle motrici ferroviarie. In generale si tratta di un dispositivo
molto semplice che funziona con un pedale o un pulsante; questo va
premuto ciclicamente per evitare l' arresto del motore. Un ritardo della pressione sul pedale
viene ritenuto sintomo di un malore o di un allontanamento del conducente alla
guida e il macchinario si arresta per evitare incidenti.
Analogamente il WDT del microcontroller è un meccanismo per garantire sicurezza
a quanto connesso al microcontroller. Si attiva quando non è applicato ad intervalli
regolari una azione di cancellazione.
Può essere usato per riavviare un'applicazione dall'inizio, per fermarla, per
metterla in stato di sicurezza in caso di guasto o di qualsiasi altra azione
che debba essere messa in atto oltre un certo tempo, tenendo sempre conto del
fatto che il tempo di overflow del timer non è un fattore di precisione.
Il WDT può correggere situazioni anomale, anche causate da problemi non
evidenziati in fase di debug, da un comportamento anormale del programma causato da un evento esterno (disturbi
elettromagnetici, sull' alimentazione, ecc), da un problema ad una periferica,
non previsto dal programma (un blocco durante la comunicazione, ad esempio).
NON è un metodo di sicurezza assoluto per uscire da tutte le possibili situazioni
e in applicazioni critiche o di rischio (ascensori, macchine utensili,
elettromedicali, ecc.), saranno necessari altri sistemi di sicurezza supplementari
secondo le normative vigenti. Un ulteriore incremento di sicurezza può essere
applicato da un WDT esterno, che, quindi, non risente di eventuali guasti di
quello integrato.
Per curiosità, mancando nei Baseline e Midrange l' istruzione reset, per
provocare un reset software si può sospendere la cancellazione del timer in
modo da indurre un reset dovuto al watchdog.
Come utilizzare WDT
Per prima cosa, se si vuole utilizzare il WDT, prima di impostare il CONFIG per
la sua abilitazione, occorre comprenderne bene il funzionamento e predisporre
nel programma le due misure essenziali:
- ciclo di cancellazione con clrwdt
- trattamento dell' evento di reset da WDT
Se dichiariamo _WDT_ON, ma il programma che non supporta
la cancellazione del timer alla cadenza necessaria, il programma si riavvia ad
ogni overflow e pertanto non funzionerà o funzionerà in modo anomalo.
Va notato che i bit della Configuration Word , non programmati, sono a
1 e questo normalmente abilita il WDT. La pessima abitudine di trattare il
CONFIG nell' ambiente di sviluppo invece che nel sorgente o, peggio, di non
trattarlo affatto, fa si che ci si possa trovare con il WDT attivato ed una
raffica di reset alla cadenza di 4-18 ms (a seconda del processore) che
rendono impossibile capire cosa stia succedendo.
La corretta inserzione dell' istruzione clrwdt
è fondamentale, facendo si che la sua cadenza sia tale da garantire sempre la
cancellazione del contatore. In questo potrà venire in aiuto il
prescaler, permettendo di dilazionare il tempo di overflow in modo da
adattarsi alle più varie situazioni.
Va tenuto conto del fatto che in Baseline e Midrange, come abbiamo visto, il
prescaler è condiviso con Timer0 e non sarà possibile avere questa opzione
in entrambi. Nel caso sia necessario, occorrerà spostare l' applicazione su
un PIC18 o un Enhanced Midrange.
Anche la mancanza di una procedura di identificazione delle cause di reset
possibili, e quindi anche di quella da WDT, è altrettanto un grave errore,
perche rende inutile la funzione di sicurezza del watchdog.
Se non avete predisposto la
gestione del watchdog nel programma, NON attivatelo nella configurazione !
Come ultima nota, è il caso di ricordare che, è probabile che la chiamata
di interrupt sia generata in modo asincrono al funzionamento del processore e
quindi sia attiva anche se, per qualche ragione, il programma si trova in una
situazione anormale. Una volta servita l' interruzione, il programma viene
ricondotto al punto in cui si trovava, qualunque sia la situazione del PC.
Quindi, se si inserisce una istruzione clrwdt
in una routine di interrupt, questa può funzionare anche se il programma è
andato in palla e quindi il WDT viene cancellato anche se non dovrebbe. Per
cui il consiglio è quello di non inserire la cancellazione del timer in routine di
interrupt, anche se danno la sicurezza di intervenire a cadenze ben precise.
|