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. 
   
   
  
   
  |