EthShield, watchdog, issue 605 e considerazioni varie.

brunol949: E Banzi cosa dice ??

Cosa vuoi che dica .... risolverà il problema sulla prossima versione, Questo non è un bug che appare quando vai a fare una cosa particolare e mostruosa, ma appena l'accendi. Mi chiedo quando l'hanno testata, non se ne sono accorti? Chi li fa i test TOPOGIGIO? :grin: :grin:

il reset con il pin digitale non era inteso er l'uso da remoto ma solo locale, nel senso che deve essere arduino a controllare la responsività dello shield ed in caso, resettarlo automaticamente.

Comunque ho voluto per sfizio isolare i 2 reset quello dell Icsp e quello vicino a 3.3 v non si resettano più insieme ma non parte nemmeno piu lo sketch.....

devi inserire il reset a mano adesso.

DanielaES:

pitusso:
in realtà, se tu non resetti il wd, al termine del tempo stabilito avviene il reset.
Per resettare il wd utilizzi la funzione:

 wdt_reset();

Ora ho capito anche se, questa impostazione, è assai limitante.
Poniamo il caso io abbia un while per un menu dove setto le impostazioni, può essere che io rimanga in questo while anche per qualche minuto.
Se metto il reset semplicemente nel loop… il menu non potrò mai utilizzarlo perché dopo 8 secondi max si resetta tutto.

e perchè?
Ti è sufficiente richiamare la funzione di reset all’interno del while.

DanielaES:
Devo quindi fare qualcosa tipo un sotto ciclo con un counter.

void setup (){

MCUSR = 0;
wdt_disable();  //disable wd  }

void loop() {
int cnt = 0;
cnt++
If ( cnt > 10 ) { wdt_enable(WDTO_15MS);
delay (30);
}
}




E' corretto il mio ragionamento?
Domanda MCURS=0 cos'è?
Credo il flag del reset, ma che valori restituisce e come si comporta?

allora, MCUSR=0 dovrebbe pulire lo status register dell’ATMega.
Sicuramente Astro è in grado di dare una spiegazione migliore…

Il codice che hai scritto, sinceramente non l’ho capito molto :stuck_out_tongue:
Il wd lo abiliti solo nel setup (a meno di esigenze particolari), la sola cosa necessaria poi è resettarlo nel loop e nelle funzioni che vengono richiamate (e anche altrove, dove necessario).

DanielaES:
Due ultime domande sul wdt.
Il link di pitusso consiglia di disabilitare il prima possibile il wdt così:

   #include <stdint.h>

#include <avr/wdt.h>

uint8_t mcusr_mirror attribute ((section (".noinit")));

void get_mcusr(void)
      attribute((naked))
      attribute((section(".init3")));
    void get_mcusr(void)
    {
      mcusr_mirror = MCUSR;
      MCUSR = 0;
      wdt_disable();
    }




Mentre il codice di pitusso lo disabilita nel setup.
Magari nel blink fa poca differenza ma io ho un setup bello pieno, meglio spostare il disable fuori?
Ho letto che se non lo disabilito a dovere incappo in un loop eterno di reset...

nel tuo caso, è sufficiente fare un disable all’inizio del setup, e poi l’enable alla fine del setup :stuck_out_tongue:
Anche io ho dei setup belli gonfi, che richiamano pure altre funzioni.
Anzi, per tutelarmi da problemi relativi a queste funzioni, la prima cosa che faccio è proprio abilitare il wd, per poi resettarlo nelle varie funzioni richiamate.

Posto qualche altro link per approfondimento, sicuramente più chiari di me:
http://tushev.org/articles/electronics/48-arduino-and-watchdog-timer
http://www.zipfelmaus.com/blog/arduino-quickie-add-watch-dog-application/

pitusso: e perchè? Ti è sufficiente richiamare la funzione di reset all'interno del while.

Perché sono pigra :P Ho un interfaccia con tanti sotto menu... e tanti while, andare a metterci dentro un reset per ognuno era un lavoraccio che volevo evitarmi.

Il codice che hai scritto, sinceramente non l'ho capito molto :P

Il codice che ho scritto, nell'intenzione, serviva ad evitare di dover andare a mettere dieci reset in giro per il listato ma, soprattutto, per impostare un wdt superiore agli 8 secondi. Abilitandola in una sottofunzione con un contatore indipendente. Prendi ad esempio un codice per la eth shield. Semplice e lineare senza while ma solo con un:

if ( client.connect (myserver, 80) ) { 
Serial.print("OK"); 
} 
else {
Serial.print("fail");
}

Se la connessione ad internet è assente, il client.connect impiega 15 secondi a verificare la condizione ed a restituire FALSE. E qui non ci sarebbe reset che tenga, il wdt riavvierebbe tutto dopo 8 secondi.

Posto qualche altro link per approfondimento, sicuramente più chiari di me: http://tushev.org/articles/electronics/48-arduino-and-watchdog-timer http://www.zipfelmaus.com/blog/arduino-quickie-add-watch-dog-application/ http://www.logicaprogrammabile.it/arduino-resettare-automaticamente-la-scheda-utilizzando-il-watchdog-timer/

Fidati che sei chiarissimo e competente :) I link sono ottimi, grazie!

Oggi ho provato a mettere watchdog in uno sketch che usa l'ethernet e la differenza c'è Sembra più stabile e veloce mentre prima dopo un po' si impallava

Se non erro molti di questi problemi saranno risolti nella prossima versione dell'IDE, la 1.0.1, che adesso è in fase di test.

Qui: http://arduino.cc/forum/index.php/topic,94572.msg775236.html#msg775236 si propone una soluzione.