software reset arduino due

Ciao a tutti volevo sapere come fosse possibile afre un software reset di arduino due.
Cioe emulare con alcune righe di codice la pressione del tastino di reset.
Grazie mille in anticipo

Usa il watchdog per generare un segnale di reset.
Se cerchi sul mio sito (link in calce) ho fatto una lib per alcune funzioni avanzate della Due, tra cui la gestione del watchdog.
Puoi creare una funzione con un ciclo infinito e con quelle resettare il micro.

Leo, a proposito delle tue note sul watchdog, giustamente indichi che la procedura non funziona con la MEGA che lo lascia abilitato e suggerisci di modificare il bootloader.

Mi sembra di aver letto che questo inconveniente è stato risolto con le successive release dell'IDE: ne sai niente o ricordo male io?

grazie mille per la risposta...ho scaricato la libreria ma non capisco come possa fare a fare eseguire il setup() una seconda volta dopo un certo periodo di tempo.
In avr assembler quello che vorrei fare sarebbe dopo per esempio 10s rjmp Reset dove Reset e la lable che gestisce il Reset del dispositivo.
Ho provato con al funzione goto() ma non va.
Grazie mille ancora

@ale:
il watchdog è una periferica integrata nel chip che può resettare il microcontrollore se il suo contatore interno non viene reimpostato a zero prima di un certo periodo di tempo (timeout).
Se hai visto l'esempio allegato alla lib, noterai che c'è in fondo al loop() la chiamata alla funzione wdt.restart(). Questa non fa altro che rimettere a zero quel contatore.

Per capire come usarlo nei tuoi programmi, includi la lib, istanziala ma non inizializzarla nel setup.
Poi aggiungi al codice una funzione che chiamerai ad esempio resetMcu(), con il codice allegato qui:

void resetMcu() {
    wdt.enable(500); // mezzo secondo prima del reset
    while(1); //ciclo infinito - da qui non esce se non col reset
}

A questo punto non devi fare altro che richiamare resetMcu() dal tuo programma quando vuoi resettare la scheda.
Ah, ti consiglio di aggiungere wdt.disable() come prima istruzione del setup, per disattivare il watchdog (dovrebbe pensarci il bootloader ma abbondare non fa male).

cyberhs:
Leo, a proposito delle tue note sul watchdog, giustamente indichi che la procedura non funziona con la MEGA che lo lascia abilitato e suggerisci di modificare il bootloader.

Mi sembra di aver letto che questo inconveniente è stato risolto con le successive release dell'IDE: ne sai niente o ricordo male io?

Non ho ricontrollato, ad esser sincero.
Comunque il problema non riguarda tanto l'IDE quanto le schede che sono in circolazione, che magari non contengono ancora l'eventuale bootloader con la modifica.

prima di tutto grazie...l` esempio nella libreria..pero se ho capito se io non faccio il restart del watch dog il programma si blocca finche io non premo il tasto di reset...ma quello che voglio afre io e fare in modo di non premere il tasto di reset ma fare tutto via software...cioe io voglio che dopo un certo tempo o evento il micro esegua da capo tute le operazioni come se lo avessi appena alimentato.

No, è l'opposto. Se non azzeri il watchdog, questo ti resetta l'MCU. Come se premessi il pulsantino di reset sulla scheda.

Comunque, mi pare che a te non serva il watchdog.

ale16289:
io voglio che dopo un certo tempo o evento il micro esegua da capo tute le operazioni come se lo avessi appena alimentato.

Basta mettere in una funzione da richiamare quando vuoi tutte le cose da far fare al programma e poi chiamare questa funzione dopo che è passato un certo lasso di tempo. Poi, che operazioni sarebbero?

io sto usando un arduino due piu il modulo xbee S6.
Quello che vorrei fare e il reset di arduino da remoto, cioe quando invio un comando di reset dal ricevitore ardino si deve resettare.
ho provato con questo esempio preso dalla tua libreria

//include the library
#include "advancedFunctions.h"

const byte ledPin = 13;
byte ledStatus = 1;

//set up the sketch
void setup() {
  Serial.begin(57600);  
  //wdt.enable(1000); //1000 ms of survival
    pinMode(ledPin, OUTPUT);
    Serial.println("I' m in setup function");
}
void resetMcu(){
  wdt.enable(1000); //1000 ms of survival  
  Serial.println("Resetting");
  while(1);
}


//main loop
void loop() {
    static byte counter = 0;
    digitalWrite(ledPin, ledStatus);
    delay(500);
    ledStatus ^= 1;
    counter++;
    if (counter > 10) { //after 10 timer, we freeze the code into an infinite loop
        Serial.println(counter);
        resetMcu;
    }
}

quello che vorrei vedere e che dopo circa 7 s il dispositivo dovrebbe ristampare sulla seriale I'm in setup function.
Sper di essermi spiegato e grazie ancora.

Di solito un reset nel 99% dei casi non serve. Se ti serve un reset, spesso è perché c'è un errore nella logica del programma.
Se vuoi solo vedere quella scritta ricomparire, non devi fare altro che creare un loop diverso in cui, ogni 7 secondi, ti viene riscritta quella frase.

Tornando al reset software, se comunque lo vuoi fare, devi scriverti la funzioncina come ti ho già illustrato 2 post sopra. Quando ricevi il comando da remoto, la chiami e questa ti resetta la scheda.

scusa ma se io voglio resettare da remoto e dico che quando rivevo il comando il dispositivo entra in quella funzione io non vedo il dispositivo resettarsi ma solo che entra in quel ciclo infinito (while 1) e ci esce solo se io premo il tastino di rese presente su aruino. la roba della stamap su seriale la ho usata solo come debug e vorrei che venisse stampata n volte per capire che arduino sta rieseguendo n volte la funzione di setup.

Il reset te lo fa il watchdog che hai attivato prima di entrare nel while(1).
Altrimenti perché ti parlavo di usare il watchdog? :wink:
Siccome da un ciclo while(1) non ci esci più (a meno di non fare un break), non puoi resettare il contatore del watchdog. Questo, quando andrà in overflow, resetterà la scheda.
http://www.leonardomiliani.com/2013/impariamo-ad-usare-il-watchdog-1/

ciao...quello che non capisco io e che dal ciclo while 1 ,una volta entrato, non ci esce mai piu.
Ho provato a mettere una stampa seriale dentro il ciclo e ho visto che arduino continua a stare in quel ciclo all`infinito senza resettarsi mai.(il comando di wdt.enable era di 1000 cioe 1s)

Secondo me stiamo parlando di 2 cose diverse. Io mi riferisco a questo codice:

leo72:

void resetMcu() {

wdt.enable(500); // mezzo secondo prima del reset
    while(1); //ciclo infinito - da qui non esce se non col reset
}



A questo punto non devi fare altro che richiamare resetMcu() dal tuo programma quando vuoi resettare la scheda.

Da while(1) ci esci per via del reset che viene generato dal watchdog dopo 500 ms.

Probabile...Quello che sto dicendo io e che dal while dovrei uscirci per via del reset dovuto all`overflow del watchdog ma in realta lanciando lo sketch di prova presente nella tua libreria con la funzione che mi hai postato vedo che dal while non ci esce mai, come se non avessi abiliato il watch dog(wdt.enable()).
Cioe che io abiliti il watchdog o no non cambia niente, perche in entrambi i casi dal while non ci esce mai.

Che versione dell'IDE stai usando?

mettere LOW il pin reset tramite un digitalWrite può funzionare??

No. Il pin di reset deve essere tenuto low per un certo periodo di tempo, ma quando inizia il reset i pin vengono rimessi in input per cui il segnale low potrebbe durare meno del necessario e lasciare il reset a metà.

allora mettere low il pin di reset ci ho provato ma hio riscontrato i problemi sopra detti.
La versione che sto usando e la 1.5.2.
Ieri mi sono messo a vedere bene il datasheet del micro della due e ho trovato questo bit PROCRST nel registro RSTC_CR che messo a 1 , cion la dovuta chiave, mi resetta il micro e sembra funzionare.
Anche se non ancora capito perche con il watchdig non funziona.

ale16289:
Anche se non ancora capito perche con il watchdig non funziona.

Ma tu hai fatto la modifica che ho scritto nel file docs/WDT_MODULE.txt allegato alla mia libreria?
Siccome il watchdog può essere regolato 1 sola volta dopo l'avvio della MCU e non può più essere cambiato fino al successivo reset e siccome il code Arduino cambia lo stato del watchdog all'avvio, se non togli quest'ultima le modifiche fatte dalla lib non hanno effetto.