Fatto, mi spiace, non va neanche questo. Meno male che la manovra di emergenza va quasi sempre alla prima. :~
Lascia stare Leo anche se ormai mi sa che per te è diventata una questione personale e di completezza :). Purtroppo non so come aiutarti non conosco i micro così nel dettaglio.
ciao
PS.
Ho cercato un po' qua e la "mega 2560 WDTO reset" e sono capiato qui http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=7318&start=0
in fondo c'e' un pezzetto di sketch
e ho messo su questo velocemente che funziona ... fa il reset della Mega 2560 quando chiamo la reset(), non credo proprio faccia il controllo del blocco tramite watchdog.
non è la stessa cosa di quella che hai fatto tu, ma potrebbero esserci dati che possono indirizzarti o adattarlo alla tua lib, ad esempio perchè usa 0x000000 invece di 0x0000 non so se cambia molto
oppure cos'è quell EIND=0 (che ho provato a levarlo e resetta lo stesso )
//#include <io.h>
const byte LED = 40;
void setup() {
delay(1000);
Serial.begin(9600);
Serial.println("Sono nel void setup");
pinMode(LED, OUTPUT); //pin as output
blink3times();
}
void blink3times() {
for (byte i=0; i<3; i++)
{
digitalWrite(LED, HIGH);
delay(250);
digitalWrite(LED, LOW);
delay(250);
Serial.println((String)i);
}
reset();
}
void loop() {
}
void reset( void )
{
Serial.println("Sono nel void reset");
delay(500);
//EIND = 0;
((void (*)())0x000000)();
Serial.println("Non dovrebbe stampare niente"); //infatti di qui non ci passa .. non stampa
}
wow FUNZIONA!!
Ho pasticciato un po' la tua lib cercando quale riga dava noia, nostante abbia messo #define ARDUINO_MEGA nello sketch ho come l'impressione che passasse lo stesso da quel #else che è messo per gli altri arduini, mi si inchiodava sempre. Però e tardino, ci ripasso domani.
//reset the MCU
void leOS2::reset(void) {
SREG &= ~(1<<SREG_I);
//wdt_reset(); //<<<<<<<<<<<<<<<<<<<<QUESTA lo fa schiantare
wdt_disable();
//for the Arduino MEGA 2560 we must use a software reset
//because its bootloader leads to a board freeze!
//#ifdef ARDUINO_MEGA
__asm__ __volatile__ ("jmp 0x000000"); //<<<<<<<<<<<<<<< ho aggiunto 2 zeri
//#else
//wdt_enable(WDTO_1S);
//SREG |= (1<<SREG_I);
//while(1){}; //wait for reset
//#endif
}
fa 3 lampeggi, attende 10 secondi e si resetta!!!! E' quello che volevi no?
Ma questo reset lo dovrebbe fare anche se si inchioda l'MCU per i fatti suoi usando l'interrupt del watchdog ?
Riciao