Tutti i microcontrollori usualmente necessitano di timer watchdog che nelle condizioni critiche di sicurezza devono occuparsi di gestire grosse quantità di corrente e di tensione. Parecchi microcontrollori hanno persino dei temporizzatori watchdog appositamente progettati a tal scopo all’interno del proprio silicio, ma in molti casi è preferibile avere un circuito esterno che permette di monitorare anche gli eventi critici sia software sia firmware che possono avvenire all’interno del microcontrollore stesso.
Ci sono molte opzioni da considerare per realizzare correttamente un’interfaccia fra il temporizzatore esterno e il microcontrollore. Per esempio, nelle applicazioni che necessitano di fornire un segnale d’uscita considerevole o addirittura multiplo è indispensabile disporre di un segnale di abilitazione (enable) che può servire da interruttore sulla linea d’uscita con funzione di monitoraggio sull’effettivo passaggio della potenza, tale cioè da auto disabilitarsi alla fine dell’attività.
Nel software residente nei microcontrollori c’è sempre un ciclo ad anello principale che tipicamente, se non esegue direttamente qualche attività, richiama dei sottoprogrammi che svolgono le funzionalità più impegnative e in tal caso interagisce anche con qualche routine di interrupt. Se una task fa qualche errore e, per esempio, ordina una chiamata a un indirizzo inesistente oppure esegue un calcolo vettoriale inconsistente, il ciclo principale può solo scegliere fra reinizializzarsi oppure bloccarsi a tempo indeterminato: in entrambi i casi si ferma e quando ciò succede il watchdog non può far altro che togliere l’alimentazione ai vostri circuiti.
Se il ciclo principale viene eseguito da 10 a 100000 volte al secondo, allora si può risolvere il guaio come illustrato nella figura 1 e cioè inserendo nel ciclo un’istruzione che consente di aprire un’opportuna uscita una sola volta per ogni iterazione. Si può tradurre nell’hardware questo tipo di watchdog in diversi modi, ma è innanzi tutto fondamentale lasciare un po’ di tolleranza al segnale di temporizzazione giacché c’è sempre un po’ di variabilità nel tempo d’esecuzione del ciclo principale di qualsiasi microcontrollore, dato che questo deve pur sempre prevenire la possibilità di eventi non deterministici o interrupt esterni. Se il circuito di watchdog non è abbastanza tollerante, infatti, può generare falsi interrupt e fallire il proprio compito. Inoltre, il tempo di ripristino dopo un interrupt generato dal watchdog è senza dubbio il massimo fra gli eventi di interrupt e, quindi, può e deve succedere solo se necessario e se può essere seguito da un’opportuna modalità di ripristino da parte del sistema operativo.
Fig. 1 – Tutti i microcontrollori generano degli impulsi che servono unicamente a non spegnere la temporizzazione dei circuiti di sicurezza watchdog
Il circuito in esempio può ospitare una discreta durata di tempo di ripristino, ma se necessario l’uscita del watchdog può essere disattivata. Nella figura 2 è mostrato un esempio di algoritmo utilizzabile come watchdog, mentre nella figura 3 se ne può vedere un’implementazione hardware basata su due transistor bipolari, il secondo dei quali è utilizzato come puro interruttore. In pratica, il circuito lavora estraendo la componente continua dalla forma d’onda quadra in ingresso, rettificandola e fornendone la media come valore stabile. Questo segnale continuo mantiene acceso il transistor Q1 che però è polarizzato in modo tale da spegnersi se si verifica una prolungata assenza di impulsi e, quindi, in tal caso si spegne anche il transistor Q2 che diventa un circuito aperto. Cambiando il valore della capacità C2 si modifica anche la velocità di risposta del circuito all’assenza di impulsi.
Fig. 2 – Esempio di listato per l’implementazione di un watchdog esterno
Questo circuito va bene per frequenze comprese fra 10 Hz e 100 kHz, ma se si cambia il valore del condensatore C2 si può modificare anche il range di frequenze alle quali il circuito può funzionare correttamente. Infine, questo circuito va bene con i microcontrollori e microprocessori alimentati a 3,3 V, ma sul transistor interruttore occorre fornire almeno 5 V. Comunque, se ne può facilmente modificare la polarizzazione per adattarla ad altri dispositivi più a basso consumo.
Fig. 3 – Il condensatore C2 rimane carico abbastanza per dare energia al circuito fintantoché è presente il segnale impulsato di 10 Hz. Quando finiscono gli impulsi il circuito rimuove la potenza spegnendo l’interruttore