4

Reset da software e WatchDog

In questa pagina vediamo come far riavviare Arduino tramite software senza premere quindi il tastino fisico di Reset.

 

Iniziamo con il dire che potrebbe capitare che Arduino si blocchi per vari motivi, ad esempio se siamo giunti per sbaglio in un ciclo che si rivela essere infinito e perchè abbiamo fatto qualche errore nella programmazione.

Tralasciando il fatto che questo non dovrebbe accadere, se volessimo evitare situazioni simili vi sono più modi per “emulare” da software la pressione del bottone di Reset che normalmente fa riavviare Arduino.

 

Ecco i modi per riavviare Arduino da software:

  1. Si può chiudere e riaprire la porta seriale e in questo modo resettiamo il processore;
  2. Si può collegare un piedino digitale al pin Reset sulla scheda ma la Atmel non garantisce che questa operazione vada a buon fine. Per questa tecnica un modo a mio parere utile è di collegare un Pin digitale (ad esempio il Pin digitale 2) al Pin Reset e, quando si vuole fare il reset si pone il Pin 2 come output:
    pinMode(2, OUTPUT);

    Lo schema del circuito è il sottostante:
    Reset Arduino

  3. Si può forzare il processore a fare goto $00 però questo lascia la RAM, i timer e gli interrupt com’erano prima di fare il “Reset” e quindi il nostro sketch potrebbe non partire correttamente (a seconda di quel che dovrebbe fare) come se partisse per la prima volta;
  4. La soluzione migliore è impostare il WatchDog Timer e attendere che si azzeri e, una volta azzerato, che si riavvii automaticamente Arduino. Il WatchDog, il cosiddetto “Cane da Guardia” appunto, spesso chiamato WD in breve, è un timer che serve a resettare un processore che si sia bloccato in un punto a causa di un problema legato al software (cattiva programmazione o comunque problemi di varia natura). Il timer, una volta attivato, resetta il processore a meno che tale timer non venga fatto ripartire da capo. Se un’applicazione dovesse mai bloccarsi allora dopo pochi millisecondi il processore si resetta.
    Per usare il WD si deve aggiungere all’inizio dello sketch:

    #include <avr/io.h>
    #include <avr/wdt.h>

    poi per impostare il timer inserisci:

    wdt_enable(WDTO_30MS);

    per impostare il timer a 30 ms (ad esempio). Al posto di questo tempo se ne possono inserire altri: WDTO_15MS;

    WDTO_30MS;

    WDTO_60MS;

    WDTO_120MS;

    WDTO_250MS;

    WDTO_500MS;

    WDTO_1S;

    WDTO_2S;

    WDTO_4S;

    WDTO_8S.

    Per azzerare poi il timer inserisci:

    wdt_reset();

Share This:

Simone

Studente Data di nascita: 12/07/1990 - Parma, IT Hobbies: Informatica, acquariofilia, viaggi, tecnologia, aria aperta, sport, web.

4 Comments

  1. Ciao Simone, io ho provato ad utilizzare il Wd ms dopo svermi caricato lo sketch per la prima volta arduino mi da sempre
    avrdude: stk500_getsync(): not in Sync; resp=0x00,
    sai dirmi perchè?
    dove ho sbagliato?.

    #include
    #include //inizio

    #include
    #include
    #include

    wdt_enable(WDTO_1S);//in setup

    case ‘$’://in loop
    Serial.println(“Riavvio…”);
    delay(100);
    wdt_reset();
    break;

    Ciro. napoli.

    • Ciao Ciro, il codice che hai riportato è completo o hai tagliato appositamente dei pezzi per inserire il commento?
      Perchè mancano degli include (la libreria da includere), manca il loop e il setup.

  2. Ciao Simone, grazie per il sito che gestisci dove ci sono idee interessanti specie per beginner come me. Avrei una informazione da chiederti. Volendo “allungare i tempi per il WatchDog (ad esempio a 16 secondi). Posso usare nel loop due wdt consecutivi? Mi spiego meglio, qualcosa come:

    #include
    #include
    void setup()
    {
    //qualcosa
    }

    void loop()
    {
    wdt_enable(WDTO_8S);
    //eseguo qualcosa…
    delay(3000);
    //resetto il watchdog
    wdt_reset();
    //riabilitoil WD
    wdt_enable(WDTO_8S);
    //eseguo di nuovo qualcosa…
    delay(3000);
    //resetto nuovamente il watchdog
    wdt_reset();
    }
    Ti ringrazio
    Gabriele

    }

    • Ciao, direi che ciò che dici è possibile. Arduino non calcola con precisione il tempo, quindi il delay(3000) non sarà esattamente 3 secondi. Però non si avvicina certamente agli 8 secondi. Quindi direi che si possa fare come dici.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.