Come resettare automaticamente Arduino? con il watchdog!

Ciao a tutti!


quella che vedremo oggi è una funzionalità un po' più avanzata rispetto al solito, però ci può tornare utile in diverse situazioni.
Infatti durante la realizzazione dei vostri progetti potreste aver bisogno della garanzia che il vostro Arduino non si fermi per nessun motivo, e purtroppo questo a volte potrebbe capitare.

Una possibile soluzione a questo problema si trova all'interno dell'Atmega328, il cuore di Arduino Uno.
Questa soluzione si chiama watchdog, cane da guardia.





Il watchdog dell'Atmega328 funziona grazie ad un oscillatore interno dedicato, che consente al watchdog di resettare il sistema al raggiungimento del tempo impostato a prescindere dallo stato del programma principale.


Quindi se nel vostro sketch inizializzate il watchdog, e nel loop mettete un reset del timer,
il vostro Arduino continuerà a girare senza mai resettarsi.
Nel momento però in cui il vostro loop dovesse bloccarsi o infilarsi in un ciclo e ripeterlo all'infinito,
non si arriverà mai al punto dello sketch in cui si resetta il timer, e quindi il watchdog resetterà il vostro Arduino,
permettendo al programma di ricominciare dall'inizio.

Grazie alla libreria Atmel "avr/wdt.h", già presente di default, utilizzare questa funzionalità ci viene semplificato notevolmente.
Infatti utilizzare il watchdog è molto semplice, ecco uno sketch di esempio:


  1. #include <avr/wdt.h>             // includo la libreria per utilizzare il watchdog
  2. void setup()
  3. {
  4.     wdt_enable(WDTO_1S);         // abilita la funzione watchdog con un tempo di intervento di 1 secondo
  5. }
  6. void loop()
  7. {
  8.    //////////// qui ci sarà il tuo programma ///////////
  9.    wdt_reset();                  // resetta il conteggio del watchdog, se prima di arrivare a questo punto sarà passato più di 1 secondo allora la scheda si resetterà, altrimenti il loop continuerà ad essere eseguito senza problemi
  10. }


A seconda del tuo sketch potresti aver bisogno di impostare diversi tempi di intervento del watchdog, per fare questo è sufficiente cambiare il valore impostato alla riga 5

(es se ho bisogno di 4 secondi scriverò wdt_enable(WDTO_4S); )

Possono essere utilizzati solo determinati valori, sono:
15, 30, 60, 120, 250, 500 millisecondi, 1, 2, 4 e 8 secondi.


per informazioni aggiuntive vi rimando alla pagina di riferimento della libreria
e alla pagina 51 del datasheet dell'Atmega328.

Ciao!!

Seguimi sulle mie pagine per rimanere sempre aggiornato sui nuovi post!

Nessun commento:

Posta un commento

Lascia un commento qui sotto, ti risponderò il prima possibile!

Altri Post