Tutorials - PIC

 

WDT - Watchdog Timer


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:

  1. inserire nel programma l'istruzione clrwdt con una cadenza adeguata ad azzerare il timer prima dell' overflow
      
  2. 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 OPTIONPer 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:

  1. ciclo di cancellazione con clrwdt
  2. 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.


 

 

Copyright © afg. Tutti i diritti riservati.
Aggiornato il 06/05/13.