Go Down

Topic: Frage zum Watchdog (Read 81 times) previous topic - next topic

maverick1509

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ß

pylon

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.

Serenifly

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
http://www.desert-home.com/2012/05/arduino-mega2560-wrapping-up-bootloader.html

maverick1509

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ß

pylon

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.

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.
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ß

Serenifly

Entweder mit einem ISP Programmiergerät oder indem du einen UNO als Programmierer verwendest:
http://arduino.cc/en/Tutorial/ArduinoISP
http://www.gammon.com.au/forum/?id=11635

pylon

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?

maverick1509

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:
Code: [Select]
#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ß

Go Up