Frage zum Watchdog

Hallo,
ich habe über die Befehle
#include <avr/wdt.h>
wdt_enable(WDTO_2S);
wdt_reset();
den Watchdog auf einem UNO getestet.
Funktioniert alles so wie es soll.
Jetzt trau ich mich aber nicht, das auf einen Mega zu spielen, da ich gelesen habe das der Mega dann abstürzt.
Ist das so?? Und wenn ja wie muss ich verfahren, um auch auf dem Mega den Watchdog zum laufen zu bringen.
Gruß

Beim Mega würde ich einfach den Wert auf 4 oder 8 Sekunden einstellen, weil der Bootloader ca. 2 Sekunden auf einen Upload wartet. Spricht der Watchdog also einmal an, wird er resetten, bekommt vom Bootloader keinen Update in den ersten 2 Sekunden und resettet gleich wieder. Daraus kommst Du dann fast nicht mehr raus. Also entweder den Sketch mit ICSP Programmer hochladen (Bootloader überschreiben -> keine Startverzögerung) oder einen Wert >2s nehmen.

Das Problem auf dem Mega ist das der Bootloader einen Bug hat(te) bei dem der Watchdog nach einem Reset noch aktiv bleibt. Und dieser Bug bestand glaube ich auch noch nach einigen angeblichen Patches. Es kann sein, dass der Bootloader in der aktuellen IDE Version funktioniert, aber den musst du auch erst mal installieren.

Ansonsten ist hier ein Bootloader der geht

Das mit den 8s wäre kein Problem, das würde mir völlig reichen.
Aber einen neuen Bootlader habe ich noch nicht installiert, ist das schwierig??
Wie gesagt, 8s ok, aber wenn das nicht gegen den Bug hilft und ich schreibe den Sketch auf den Mega was dann?
gruß

Der "Bug" ist eben, dass der Watchdog im Bootloader nicht deaktiviert wird. Da der Bootloader "nur" ca. 2 Sekunden aktiv ist, hängt es von Deinem Sketch ab, ob er danach gleich den Watchdog korrekt versorgt. Tut er das, solltest Du keine weiteren Problem kriegen. In jedem Fall kannst Du in den 2 Sekunden einen neuen Sketch (der z.B. sehr kurz ist und nur den Watchdog deaktiviert) hochladen, Du bist also nicht ausgesperrt.

So hab 8s eingestellt und sowohl bei einem Mega 1280 als auch einem 2560 getestet.
Sketch 30sec. laufen lassen und dann in ein 10 sec delay.
Fazit geht bei beiden nicht, die LED "L" fängt heftig an zu blinken und der Mega hängt sich auf.
Keinerlei Reaktion mehr. Wenn ich dann nach stromlos machen einfach einen leeren Sketch hochlade ist zumindest der Mega wieder ansprechbar.
Wie kann man denn den Bootlader wechseln?
gruß

Entweder mit einem ISP Programmiergerät oder indem du einen UNO als Programmierer verwendest:

maverick1509:
So hab 8s eingestellt und sowohl bei einem Mega 1280 als auch einem 2560 getestet.
Sketch 30sec. laufen lassen und dann in ein 10 sec delay.
Fazit geht bei beiden nicht, die LED "L" fängt heftig an zu blinken und der Mega hängt sich auf.

Kannst Du den Testsketch posten?

Schlecht, das ist meine komplette Heizungssteuerung, die ist seitenlang.
Ich kann das aber auch mal mit einem ganz kurzen Sketch machen.
So hab ich, hier ist er:

#include <avr/wdt.h>
long startzeit, start;
int aktuell;
boolean flag, onoff;
#define LedA 13
void setup(){
 wdt_enable(WDTO_8S);
  Serial.begin(9600);
  pinMode(LedA, OUTPUT);
  startzeit=millis(); // setzt die Startzeit
}
void loop(){
 aktuell = ((millis()-startzeit)/3000); // alle 3 Sekunden wird aktuell von Null aus um 1 erhöht, also wird alle 30 Sek Blinkfrequenz höher
wdt_reset();
Serial.println(millis());

if(millis() > 30000) delay(10000);

 if(aktuell < 6)  {
   if (flag){
    flag=false;start=millis();
   }
   if (millis()-start < (6-aktuell)*100){
    if (onoff)
      digitalWrite(LedA,HIGH);
     else  
      digitalWrite(LedA,LOW);
   }
   else{
    onoff = !onoff; flag=true;
  }
 }
 else
 digitalWrite(LedA,HIGH);
}

Ist einfach eine blinkende LED, nach 30 sec. wird durch das delay unterbrochen und dann stürzt er ab.
gruß

Ist einfach eine blinkende LED, nach 30 sec. wird durch das delay unterbrochen und dann stürzt er ab.

Kannst "stürzt er ab" etwas genauer umschreiben? Hast Du einen Freeze (Endlos-Schleife)? Macht er einen Reset und beginnt nach ca. 3 Sekunden wieder zu blinken?
Lass mal die komplizierte Logik mit dem "aktuell" und so weg und blinke einfach die LED. "flag" wird z.B. nicht initialisiert, womit Dein Code nach einem Reset nicht in einem klaren State ist. "start" wird auch nicht initialisiert und somit kann es sein, dass der Arduino korrekt funktioniert, aber Dein Code einfach von Annahmen ausgeht, die bei einem Reset nicht gegeben sind.

Hallo,

#include <avr/wdt.h>
long aktuell;
#define LedA 13
void setup(){
 wdt_enable(WDTO_8S);
  Serial.begin(9600);
  pinMode(LedA, OUTPUT);
}
void loop(){
wdt_reset();
Serial.println(millis());

if(millis() > 30000) delay(10000);
 digitalWrite(LedA,HIGH);
}

Auch dieser einfache Code läuft nicht.
Wenn die 30sec erreicht sind wartet er 10sec und dann fängt die LED13 an sehr schnell zu blinken.
Dann “hängt” der Prozessor, d.h. ich kann nichts mehr uploaden, auch ein reset hilft nicht.
Einzig ein komplettes Stromlos schalten bringt den Mega wieder zum laufen.
gruß

Ich habe mich nochmal durch das Datasheet gelesen und das Problem erkannt. Beim Reset durch den Watchdog Timer wird auch das Watchdog-Register (WDTCSR) auf die Default-Werte gesetzt und die sind leider 16ms. Der Code, der im neueren Bootloader drin ist, überprüft, ob der Reset durch den Watchdog ausgelöst wurde und springt in einem solchen Fall direkt in den Sketch, ohne auf neuen Code zu warten.

Wenn Du den Watchdog also brauchen willst, kommst Du nicht darum herum, entweder den neuen Bootloader aufzuspielen oder den Sketch direkt per ICSP-Programmer hochzuladen (und somit den Bootloader zu umgehen).

Danke dir!
Dann muss ich mich wohl mal damit befassen.