Datum:
Hallo, ich habe folgendes Problem: Ich betreibe einen ATtiny13 mit dem Watchdog. Hier mein Code:
#include <avr/io.h> // Pins #include <avr/wdt.h> // Watchdog #include <util/delay.h> // Verzögerung int main() { DDRB |= (1 << DDB4); // PB4 als Ausgang schalten _delay_ms(1000); // 1 Sekunde warten wdt_enable(WDTO_2S); // Watchdog auf 2 Sekunden stellen int on = 0; while (1) // Mit 10Hz blinken { _delay_ms(100); if (on) { PORTB |= (1 << PB4); on = 0; } else { PORTB &= ~(1 << PB4); on = 1; } } } |
Außer der LED zwischen PB4 und GND und dem Pullup (4.7k) zwischen RESET und GND habe ich nichts angeschlossen. Die Schaltung zeigt folgendes verhalten: - Nach dem Einschalten passiert eine Sekunde nichts (wie geplant, siehe Code) - Die Schaltung blinkt mit 10Hz für 2 Sekunden - Die Schaltung blinkt nicht mehr Erwartet hätte ich, dass die Schaltung nach einer weiteren Sekunde wieder anfängt zu blinken, da der Watchdog das Programm zurückgesetzt hat. Es fühlt sich allerdings so an, als habe er es nur gestoppt. Wo liegt der Fehler? Danke im Voraus für die Hilfe! :-)
Datum:
Lies Dir nochmal den Abschnitt Watchdog im Datenblatt durch. Was passiert mit dem Prescaler bei einem Watchdogreset? Peter
Datum:
Ich finde den entsprechenden Abschnitt leider nicht im Datenblatt. Aber selbst wenn dieser, wie ich aufgrund der hinweisenden Frage vermute, zurückgesetzt wird, so sollte dies doch keine Auswirkung haben, da ich den Watchdog doch erst nach dem Delay von einer Sekunde aktiviere?
Datum:
Nach dem ersten Delay nach einem Power-On-Reset.
Datum:
> Nach dem ersten Delay nach einem Power-On-Reset.
Mit diesem Hinweis kann ich nun leider garnichts anfangen. Ich verstehe
den Satz einfach nicht.
Datum:
sandmann wrote:
> Ich finde den entsprechenden Abschnitt leider nicht im Datenblatt.
8.3 Watchdog Timer
"WDE is overridden by WDRF in MCUSR. This means that WDE is always set
when WDRF is set. To clear WDE, WDRF must be cleared first."
Peter
Datum:
>Mit diesem Hinweis kann ich nun leider garnichts anfangen. Ich verstehe >den Satz einfach nicht. Setz den WDT-Enable einfach mal vor das Delay.
Datum:
Hallo,
ich habe gerade einen Blick in das Datenblatt des Tiny13 geworfen.
Dort steht, dass dessen Watchdog 3 verschiedene Modi kennt:
a) Interrupt bei Auslösen,
b) System-Reset bei Auslösen,
c) beides hintereinander.
Nun stellt sich die Frage, welchen dieser Modi der Befehl
> wdt_enable(WDTO_2S); // Watchdog auf 2 Sekunden stellen
aktiviert. Sollte er den Interrupt-Modus einschalten, ohne dass der
zugehörige Vektor gesetzt ist, kann das Programm "hängen", ohne dass ein
Reset ausgelöst wird. :-(
Datum:
Also, so funktioniert es jetzt schonmal ganz gut:
// [...] int main() { wdt_enable(WDTO_2S); // Watchdog auf 2 Sekunden stellen DDRB |= (1 << DDB4); // PB4 als Ausgang schalten _delay_ms(1000); // 1 Sekunde warten // [...] |
Wenn ich es richtig verstanden habe, dann lag es daran, dass nach dem Reset der Watchdog-Prescaler zurückgesetzt wurde und der Watchdog weiterhin aktiv war. Daher wurde das Programm immer vor ablauf des ersten Delays zurückgesetzt. So funktioniert es allerdings auch nicht:
// [...] int main() { wdt_disable() // Watchdog ausschalten DDRB |= (1 << DDB4); // PB4 als Ausgang schalten _delay_ms(1000); // 1 Sekunde warten wdt_enable(WDTO_2S); // Watchdog auf 2 Sekunden stellen // [...] |
Und ich verstehe nicht, wieso. Schließlich sollte der Watchdog ja zuallererst deaktiviert werden und somit das Programm nicht mehr neustarten, unabhängig von seinem zurückgesetzten Prescaler.
Datum:
sandmann wrote: > Und ich verstehe nicht, wieso. Schließlich sollte der Watchdog ja > zuallererst deaktiviert werden und somit das Programm nicht mehr > neustarten, unabhängig von seinem zurückgesetzten Prescaler. Nochmal gaaanz langsam: To clear WDE, WDRF must be cleared first. Peter
Datum:
Wenn der Hund losgelassen wurde, rennt er, bis er angeleint wird. D.h. wenn du deinen Watchdog startest läuft er, wenn er einen Reset auslöst läuft er immer noch. Du stopst ihn nicht und setzt ihn nicht zurück. Im Datenblatt unter System Control and Reset ist es beschrieben. gruß hans
Datum:
Doch! Ich stoppe ihn mit wdt_disable()! Deshalb verstehe ich es ja nicht!
Datum:
Willst Du was über den Watchdog lernen oder ernsthaft Deine Programmschleife mit Hilfe des Watchdog timen? Ersteres: Dir wurden alle Hilfen angeboten, lesen und verstehen muß Du selbst. Zweiteres: Ist nicht Dein ernst?
Datum:
Hallo Leute, ich bin verzweifelt. Mein Rechner zeigt mir sowie ich die Tastatur bediene, das Problemberichtfenster und will, dass ich sende oder nicht sende. Bei allen Programmen, auch Foxmail, Word u. v. a. m. Wer kann mir einen Rat geben woran kann das liegen? Danke im voraus, Moni