AVR-Watchdog-Timer. Gibt es eine Möglichkeit, den Watchdog-Timer aus dem Code heraus zu lesen?
Beabsichtigter Anwendungsfall: Um eine ungefähre Vorstellung (sehr grob, +/- 1 Sek.) davon zu bekommen, wie lange es her ist, seit der Watchdog-Timer das letzte Mal zurückgesetzt wurde. Dies würde es meinem Code ermöglichen, zu erraten, wie lange er geschlafen hat, ohne eine externe RTC oder ähnliches.
Ich habe versucht, im attiny85-Datenblatt nachzusehen, und es nicht gefunden. Irgendwelche Ideen Leute?
Stellen Sie den Watchdog auf 1 Sekunde und dann in den Interrupt-Modus, wenn der Interrupt auftritt, setzt sich der Watchdog wieder in den Reset-Modus und dann muss Ihr Code ihn manuell in den Interrupt-Modus versetzen, auf diese Weise können Sie den Watchdog-Timer als 1 verwenden zweiten Timer und der hat den Watchdog immer noch funktionsfähig, denn wenn nach der Interrupt-Ausführung ein Zeitfenster von einer Sekunde vorhanden ist, um den Watchdog in den Interrupt-Modus zu versetzen, bevor der Timer abläuft, und das Mikro zurückzusetzen. Ich habe den Watchdog auf diese Weise in einem attiny10 verwendet
Soweit ich das Datenblatt verstehe, ist der WDT-Reset ein UND-verknüpftes Signal von einem Satz geteilter 128-kHz-Takte, die durch den WDT-Prescaler laufen, und wird als solches nicht in einem Register gespeichert, das Sie lesen können.
Wenn ich das wäre, würde ich meinen eigenen Timer verwenden, der jedes Mal zurückgesetzt wird, wenn der WDT war. Ich könnte dies dann abfragen, um die seit dem letzten Zurücksetzen verstrichene Zeit abzuschätzen. Dies ist hardwareunabhängiger und damit portabler.
Beachten Sie, dass ich diese Lösung nicht befürworte, sondern nur zeige, dass ich sie für möglich halte. Ich denke, dass die Antwort von Kvegaoro praktischer ist und wahrscheinlich sogar weniger Strom für fast alle Anwendungsfälle im wirklichen Leben verbraucht.
Ich denke, du könntest so etwas tun ...
Gehen Sie in einer Schleife durch die Prescaller-Werte vom höchsten zum niedrigsten.
D. Löschen Sie das Watchdog-Interrupt-Flag
A. Stellen Sie den Prescaler auf den Schleifenwert ein.
B. Prüfen Sie, ob das Watchdog-Interrupt-Flag gesetzt wurde.
C. Schieben Sie das Bit aus dem vorherigen Test in ein Schieberegister.
Am Ende von all dem sollte das Schieberegister nun die oberen Bits des Wertes innerhalb des Prescaller-Zählers haben.
Beachten Sie, dass ich nicht getestet habe, ob das Ändern des Werts des Vorteilers den Wert von WDIF asynchron aktualisiert, selbst wenn der Watchdog nicht läuft, aber basierend darauf vermute ich , dass dies der Fall ist. Auch wenn dies nicht der Fall ist, kann diese Methode dennoch funktionieren. Sie müssen lediglich einen Watchdog-Interrupt-Handler erstellen, der irgendwo ein Flag setzt, das anzeigt, dass er aufgerufen wurde. Überprüfen Sie dann einfach dieses Flag nach jedem Prescaler-Update, um zu sehen, ob der Interrupt ausgelöst wurde.
Wenn Sie mich davon überzeugen können, dass Sie einen der unwahrscheinlichen Anwendungsfälle haben, in denen dies tatsächlich Sinn macht, dann werde ich etwas Code spinnen, um die Details herauszuarbeiten!
Der Watchdog-Timer wird verwendet, um den Mikrocontroller zurückzusetzen, wenn er in eine Endlosschleife eintritt. Sie können WDT nur mit bevorzugter Zeit aktivieren oder deaktivieren. Sie können den Wert des Watchdog-Timers nicht lesen .
Sie können den normalen Timer verwenden, um Ihren AVR aus dem Schlafmodus zu wecken, wenn er überläuft.
FarO