Ho cercato sul forum ma non sono stato in grado di trovare una risposta.
Ha senso utilizzare watchdog e ISR(WDT_vect) per fare un reset dell'intero hardware?
Collegando un uno dei pin con una resistenza al pin di reset e poi impostandolo a LOW si può emulare la pressione del bottone di reset sulla scheda.
Volendo effettuare un reset harware (non solo il riavvio del software) con watchdog è fattibile?
il led non lampeggia (forse non esegue quelle righe o lo stao low rimane per troppo poco tempo?).
Da quello che ho capito (poco) sarebbe possibile utilizzare ISR(WDT_vect), che viene chiamata allo scadere del tempo del wdt, per eseguire un qualcosa.
Questo perchè una componente esterna si impalla e con wdt non si sblocca mentre premendo il tasto di reset si.
Questa non credo abbia molto senso perchè prima resetti in modo "manuale" ,dopo di che finita la ISR avviene, o almeno dovrebbe avvenire, il reset del watchdog. In pratica sono due reset uno dietro l'altro.
Ma il reset fatto così digitalWrite(7, LOW); ti funziona? Quale componente si impalla?
ISR(WDT_vect)
{
pinMode(7, OUTPUT);
digitalWrite(7, LOW);
while (1) {};
}
funziona bene.
Si impalla una scheda di rete.
Mi pare di avere capito che wdt faccia ripartire lo sketch da zero (la parte software) ma non faccia il reset della scheda di rete. Il pin reset della scheda è collegato al pin reset di ardiuno. Collegandoli entrambi ad un'altro pin (7 nel mio caso) con una resistenza da 1K di mezzo e impostando il pin a LOW si resettano entrambe.
Il reset potrei farlo anche solo sul pin di reset della scheda di rete dovendo poi reinizializzarla e controllare altre cose...così facendo resetto tutto e, visto che non è un problema, non mi pongo altri pensieri. Il problema si presenta random, pare funzionare (per ora :-X :-X :-X ).
Mi pare di avere capito che wdt faccia ripartire lo sketch da zero (la parte software) ma non faccia il reset della scheda di rete. Il pin reset della scheda è collegato al pin reset di ardiuno
ok allora può avere senso. Il reset del watchdog è interno al micro e non mette in stato LOW il relativo pin reset.
Il reset tramite watchdog è l'UNICO modo corretto di effettuare un reset in software. Il reset tramite un pin del microcontrollore stesso collegato al suo reset potrebbe non funzionare o lasciare il microcontrollore in uno stato inconsistente.
mi intrometto nella disscusione, io ho un problema simile che Arduino Uno si blocca dopo due giorni, non sapevo di questo comando // watchdog e ISR(WDT_vect) //.
Pensate che potrei risolvere il problema?
non capisco, se il codice funziona per 100 volte in un tempo breve, perche non funziona in giorni in qui puo intervenire 3 o 4 volte al giorno.
Ovviamete sto parlando di un semplice Input creato da un pulsante e un Out creato da un rele con un transistor.
Non ci sono display, non uso neache il Serial.print.
Mi sorge un dubbio se facessi il semplice Blink come esempio di IDE Arduino, funzionerebbe all'infinito????
Conocordo in pieno con quanto dice sukko. Wdt è l'unico metodo consigliato e sicuro per un reset software. Giustissimo!!.
Purtoppo nel mio caso non è utile e sono costretto resettare l'hardware.
Pur alimentando la scheda nel modo corretto e non facendo questa niente di che, a volte si impalla (perfino con gli sketch di esempio allegati alla libreria) e anche con alimentazione esterna opportuna (come già conigliatomi in questo forum) oltre che alimentando da arduino. Anche rilanciando la routine di inizializzazione della scheda la cosa non si risolve (proprio in fase di inizializzazione si blocca). Ho letto da piu parti che è un problema che può accadere con queste schede e da alcune parti dicono sia un problema del chip stesso (ad esempio qui).
Questa "soluzione" sporca :o (o pezza) non è certamente la migliore ma al momento pare risolvere il problema (o perlomeno ridurlo...i blocchi avvengono ma per ora sono stati tutti superati...finora).
Anche sul sito di arduino stesso, nella sezione learnig, se ne accenna vedi qui
WDT reset -- seems to work the most reliably for resetting the AVR itself -- but does it really help with the Ethernet shield?
e subito sotto
connecting a wire to the "reset" pin from some other (output) Arduino pin -- apparently often works
(mi piace apparently often ...poco sotto è citato come horrible!!!)
Visto l'utilizzo non voglio impiegare la certamente piu stabile (e costosa ) ethernet shield originale anche se con questa il problema non si è mai presentato...ma verificherò meglio nei prossimi gg. Quindi per ora e per me (non consiglio nulla a nessuno...a che titolo poi non saprei proprio) pare un buon compromesso. Ciò non significa che la meta sia raggiunta. Ma per ora un piccolo sorrisino allo specchio me lo faccio e incoraggiato cerco di capirci di piu.
Quindi sukko/doppiozero, perdonate la blasfemia della soluzione e abbiate pietà. In ogni caso come sempre grazie.
Quindi sukko/doppiozero, perdonate la blasfemia della soluzione e abbiate pietà.
Va bene, perdonato! (scherzo ovviamente eh)
però penso: se si blocca la scheda di rete il watchdog non è necessario a questo punto. Quando Arduino si accorge che qualcosa non va richiama il reset digitalWrite(7, LOW); E forse per evitare eventuali problemi di reset su Arduino ti conviene resettare solo la scheda di rete
Il fatto è che quando si blocca si blocca e qualsiasi tentativo di utilizzo blocca lo sketch per un tempo indefinito (dall'esterno me ne posso accorgere perchè ad esempio non risponde piu al ping). Situazione da cui riesco ad uscire solo con il watchdog, almeno per i tentativi che ho fatto.
Avevo già implemetato una strada simile con in wdt "pulito" e scrivendo l'ultimo stato in eeprom per poi rileggerlo all'avvio ed eventualmente resettare (per un numero finito di tenativi) ma vorrei evitare i utilizzare la eeprom per non consumarla (magari perchè la scheda di ethernet è definitivamente morta...il problema lo posso riprodurre disalimentando la scheda).
Invece vorrei perseguire su questa strada e una volta entrato in ISR(WDT_vect) vorrei provare a resettare la sola scheda e reinizializzarla (magari facendo anche piu di un tentivo con un controllo) e, se la scheda torna in vita, interrompere il reset software uscendo con wdt_reset(). Da quello che ho capito finora potrebbe funzionare.