autoReset con ponticello

Salve

Stavo vedendo delle soluzioni per fare un reset "software".... ho cercato sul forum e ho trovato più soluzioni. Quella che più mi interessa è usare un pin qualsiasi di arduino (da settare HIGH) e collegarlo al pin Reset.

Quando il mio codice entra nella condizione che deve resettare, arduino va in panico e il led al pin13 blinkeggia....

    if (count>3)
    {
      digitalWrite(3,HIGH);

      digitalWrite(9, HIGH);   // set the LED on
      delay(1000);              // wait for a second
      digitalWrite(9, LOW);    // set the LED off

      digitalWrite(3,LOW);
    }

skaxxo: Salve

Stavo vedendo delle soluzioni per fare un reset "software".... ho cercato sul forum e ho trovato più soluzioni. Quella che più mi interessa è usare un pin qualsiasi di arduino (da settare HIGH) e collegarlo al pin Reset.

Quando il mio codice entra nella condizione che deve resettare, arduino va in panico e il led al pin13 blinkeggia....

    if (count>3)
    {
      digitalWrite(3,HIGH);

      digitalWrite(9, HIGH);   // set the LED on       delay(1000);              // wait for a second       digitalWrite(9, LOW);    // set the LED off

      digitalWrite(3,LOW);     }

guarda che c'è il modo di reset software.. fammi googlare e torno ;)

Non ti va bene farlo solo via Software ??? Non ha senso usare un pin.. puoi farlo in due modo.. bloccare il micro ed aspettare il watch dog oppure con un istruzione scritta in asm che leo sa bene ed ora scriverà perchè non la ricordo :P

asm volatile ("jmp 0x0000");

metti questo dove vuoi fare il reset.

comunque non è un vero e proprio reset in quanto non libera la ram a quanto ho capito ma fa ricominciare il codice, in pratica torna all'inizio inizio inizio...

__asm__("jmp 0x0000");

Cmq era già stato affrontato il discorso tempo ed era venuto fuori che un pin non può essere usato per autoresettare il micro perché l'impulso di reset, affinché il reset sia efficace, deve durare un certo periodo di tempo. http://arduino.cc/forum/index.php/topic,55011.0.html

oppure :

{
....
  asm volatile ("  jmp 0");
...
}

sostanzialmente fà ripartire l’esecuzione del programma, così sovrascrive i dati già caricati in ram :slight_smile:
Lol prova a farlo in un PC nella posizione 0 e vedrai come ti crasha… cè il bios li :slight_smile:

Via software l'atmel dice così: http://support.atmel.no/bin/customer.exe?=&action=viewKbEntry&id=21

e funziona bene con la macro... forse meglio via software, lascerò perdere il ponticello :)

skaxxo:
Via software l’atmel dice così: http://support.atmel.no/bin/customer.exe?=&action=viewKbEntry&id=21

e funziona bene con la macro… forse meglio via software, lascerò perdere il ponticello :slight_smile:

Magari funziona ma così ti risparmi un pin e magari casini non voluti :wink:

Cmq io resto dell’avviso che se un programma ha bisogno di un reset secondo me (IMHO) è strutturato male perché se per riprenderne il controllo devi resettare il micro c’è qualcosa a livello di logica che non va.

@skazzo:
il reset necessita di un segnale LOW, non HIGH. Inoltre, come scritto in quel documento che hai linkato, con un pin non può funzionare perché nel momento in cui mandi un segnale LOW sul pin RST si avvia la procedura di reset, ma il segnale di reset deve durare un tot di tempo, come detto. Siccome col reset l’Atmega mette tutti i pin in stato ad alta impedenza, il segnale di reset di fatto si interrompe. Il led 13 lampeggia perché l’Atmega8U2 non riesce più a comunicare con l’Atmega328, che è andato in blocco dato che, immagino, non ha terminato correttamente la procedura di reinizializzazione.

leo72: Cmq io resto dell'avviso che se un programma ha bisogno di un reset secondo me (IMHO) è strutturato male perché se per riprenderne il controllo devi resettare il micro c'è qualcosa a livello di logica che non va.

Hai ragione, ma in verità sto testando un pò l'ethernet shield. In pratica apro una connessione e faccio un pò di get finchè la connessione non cade da sola.... ho notato che dopo aver aperto la connessione (in client mode) essa dura qualche secondo e poi cade. Dato che mi sembrava un pò "lento" aprire e chiudere una connessione ad ogni get ho pensato di tenerla aperta finchè va... Se dopo TOT tentativi di connessione non riesco ad instaurare una connessione la faccio resettare.... in pratica: if !client.connected() Reset... questo perchè ogni tanto si impalla e non riesce a connettersi. Tutto qui...

leo72:
ma il segnale di reset deve durare un tot di tempo, come detto. Siccome col reset l’Atmega mette tutti i pin in stato ad alta impedenza, il segnale di reset di fatto si interrompe.

Un modo c’è, il pin comanda un servo digitale con failsafe automatico, quando necessario il servo preme il tasto di reset e non appena scompare il segnale di controllo il suo fail safe lo riporta al centro rilasciando il reset, il tempo necessario è di gran lunga superiore all’intervallo massimo per ottenere un reset valido
Ok lo ammetto ho giocato per troppo tempo con “the incredible machine” :grin:

Oppure che comanda la Most Useless Machine :stuck_out_tongue_closed_eyes:

leo72: @skazzo:

:stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

menniti:

leo72: @skazzo:

:stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes: :stuck_out_tongue_closed_eyes:

Uh... ho sbagliato, non l'ho fatto apposta... ma anche lui ha un nick.... :sweat_smile:

ciao

Hai ragione, ma in verità sto testando un pò l'ethernet shield. In pratica apro una connessione e faccio un pò di get finchè la connessione non cade da sola.... ho notato che dopo aver aperto la connessione (in client mode) essa dura qualche secondo e poi cade. Dato che mi sembrava un pò "lento" aprire e chiudere una connessione ad ogni get ho pensato di tenerla aperta finchè va... Se dopo TOT tentativi di connessione non riesco ad instaurare una connessione la faccio resettare.... in pratica: if !client.connected() Reset... questo perchè ogni tanto si impalla e non riesce a connettersi.

la soluzione di cui tu parli ad inizio post, l'ho adottata anche io. Sostanzialmente la Eth Shield, in determinati casi, si freeza. Non succede lo stesso per Ardino, in quanto lo sketch continua a girare. Addirittura, la vecchia versione dell'Eth Shield andava pure resettata dopo l'accensione (cosa risolta con l'aggiunta di un condensatore , nell'ultima versione). Cosa riportata in questa vecchia discussione e in altre: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1225354009/41

La soluzione era di pilotare il reset dello shield Eth, non di Arduino intera. Quindi si "storgeva" il piedino del reset dello shield, e questo piedino si attaccava ad un pin: via sw era quindi possibile intervenire sullo shield, come se si stesse effettivamente premendo il pulsante di reset. Qui un'applicazione pratica del concetto: http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1282231155/27#27

La versione di reset via sw, proposta in un thread da Astro (funzione che mi son trovato a dover utilizzare poco tempo fa, ed è stata di grande aiuto!) fa una cosa di diverso tipo.

Per "riabilitare" l'eth shield non serve infatti riavviare tutto lo sketch.

Pero' il discorso del reset via software è molto importante a me servirebbe parecchio, dovro' farlo usando un pin ed eventualmente un circuito timer RC, se necessario un secondo controllore o un combinatore gsm .... non posso fare 30 km per premere un reset o sentirmi dire qui non funziona piu' un caxxo ehehehehhe la mia ethernet shield per partire dopo un assenza di tensione, un crash del software, o modifica dello sketch necessita sempre di 2 reset consecutivi altrimenti ciccia non c'e' verso di farla partire ormai sono 2 mesi che ci lavoro e ci ho fatto il callo. Del resto i migliori impianti di automazione sono composti da una cpu master e una cpu slave identica di riserva :)

Dipende sempre da cosa uno deve fare. Skaxxo non aveva specificato che in realtà non doveva resettare l'Arduino per sbloccarlo ma voleva farlo per sbloccare l'Ethernet soprastante.

Tu che devi farci, con il reset? Riavviare sempre la Ethernet? Col pin non funziona, te l'ho già spiegato il motivo. Se parli di reset software, ricordati che non è un vero reset nel senso che vengono solo reinizializzati i registri interni riportando lo stato della sola CPU a quello di avvio, ma il microcontrollore inteso come il resto del chip resta com'è. Per resettare via hardware il micro ti serve un circuito ausiliario. Ma questo circuito devi attivarlo... cosa lo attiva? Un pin del 328? E se è bloccato in un loop per un ciclo scritto male?

Tu che devi farci, con il reset? Riavviare sempre la Ethernet? Col pin non funziona, te l'ho già spiegato il motivo.

..non sono d'accordo. Funziona, se fatto come ho scritto nel mio precedente post.

infatti per questo ti dico che una cpu slave gemella risolve molti problemi, cosa sono 50 euri per avere un reset ? niente se devo partire con urgenza mollare tutto perchè una villa è rimasta paralizzata :)

e poi non si tratta di loop fatto male .... perchè il mio loop è solo una riga di skatch e sono 13 file javascript e 4 html, a volte puo' succedere che si inchioda

pitusso:

Tu che devi farci, con il reset? Riavviare sempre la Ethernet? Col pin non funziona, te l'ho già spiegato il motivo.

..non sono d'accordo. Funziona, se fatto come ho scritto nel mio precedente post.

Funziona per la Ethernet, non per l'Arduino. Per questo chiedevo cosa doveva farci con il reset, se riavviare l'Ethernet o l'Arduino.

EDIT: anche tu, Pablos... lo dici dopo che stiamo parlando di Ethernet... :sweat_smile: