Hallo, ich habe hier einen Webserver mit dem Pollinboard und einem ATMega 644p laufen. Ich hätte jetzt gerne die möglichkeit von der Website aus, den Webserver zu resetten. Eigentlich bietet sich ja dafür der Watchdog an. Wenn ich jetzt ein Reset-Kommando per TCP bekomme dann starte ich den WDT mit wdt_enable(WDTO_15MS). Wenn ich es richtig verstanden habe, müsste das schon reichen. Aber der Webserver startet nicht wie erwartet neu, sondern ist danach einfach nicht mehr zu erreichen. Irgendwo hier im Forum hatte ich gelesen wenn Interrupts im Spiel sind, sollte ich die vorher disablen. Habe ich auch gemacht aber das Verhalten ist dasselbe. Ich habe auch in der ersten Programmzeile meiner main.c den Wdt mit wdt_disable() wieder disabled, (stand hier auch irgendwo) funktioniert aber leider auch nicht. Auch die WDTON fuse habe ich schon gesetzt und gelöscht, haut aber auch nicht hin. Hat irgendjemand eine Idee was ich hier noch falsch mache, oder eine art Checkliste worauf man noch achten muss ? Gruß GH
Entsorgst du denn den Wachhund nach dem Reset fachgerecht? Datenblatt, Abschnitt 10.2, Suche nach "WDRF". Einleitung in: http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html
Hallo Jörg, ich dachte das macht die Funktion wdt_disable() ! Da heisst ich muss das WDRF bit noch auf 0 setzen. Ist die reihenfolge so korrekt ? 1. Http funktion empfängt das Resetkommando 2. cli(); 3. wdt_enable(WDTO_15MS) 4. while(1); 5. Watchdog löst aus 6. Sprung zu main.c 1.zeile 7. MCUSR &= ~(1<<WDRF); 8. wdt_disable(); 9. ....Start des eigenlichen Programms Brauche ich in diesem Fall die WDTON fuse ? Ich will nur über die HTTP Funktion den Reset auslösen, ansonsten brauche ich den WDT nicht. Gruß GH
Greenhorn wrote: > ich dachte das macht die Funktion wdt_disable() ! Nein, das hätte keinen Sinn. wdt_disable() will man ja u. U. mehrfach innerhalb einer Applikation benutzen können, dieses Prozedere dagegen muss man nur genau einmal nach einem Watchdog-Reset erledigen, und dies möglichst schnell nach dem Reset (damit nicht aus Versehen die 15 ms des initialen Timeouts bereits verstrichen sind). > Da heisst ich muss das WDRF bit noch auf 0 setzen. Ja. > 6. Sprung zu main.c 1.zeile > 7. MCUSR &= ~(1<<WDRF); > 8. wdt_disable(); Im Prinzip schon, aber du kannst auch das Beispiel aus der Doku einfach übernehmen. Durch das Spiegeln von MCUSR in einer Variablen kannst du später noch auswerten, ob dein Reset vom Watchdog kam oder nicht. (Das attribute da im Beispiel muss aber vorn und hinten zwei Unterstriche haben, das ist ein Bug, der bereits im Sourcecode repariert ist.) > Brauche ich in diesem Fall die WDTON fuse ? Die ist nur dafür da, dass du den Watchdog nie abschalten kannst. Ich glaube, das ist nicht das, was du willst. :-)
Hallo Jörg, danke für den Schubser, ich habs einfach ausprobiert, nu lööpts. Gruß GH
Greenhorn wrote:
> ich dachte das macht die Funktion wdt_disable() !
Nein, die ist eigentlich überflüssig und sogar gefährlich, da nicht
interruptfest.
Es hat auch keinen Sinn, das Setzen des Sleep-Modus und Enable
Sleep-Modus getrennt zu machen.
Üblicher Weise stellt ja ein Timerinterrupt fest, wann es Zeit zum Sleep
ist und setzt + enabled den Modus, das Main macht dann Sleep.
Und nach dem Aufwachen ist es wieder ein Interrupt (z.B. Pin-Change),
der Sleep disabled.
Nimmt man dann im Main die Funktionen wdt_enable(), wdt_disable(), ist
der MC irgendwann tot (wacht nie mehr auf).
Ich benutze daher immer das direkte Setzen des MCUSR-Registers, dann
gibts keine Probleme mit den Interrupts.
Peter
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.