Ich versuche, meinen Kopf um den Watchdog-Timer der ATTinyX5-Serie zu legen. Ich habe also gelesen, dass Sie es verwenden könnten, um das Programm N Sekunden lang zu etwas Bestimmtem zu bewegen, aber nie wirklich gezeigt, wie. Andere ließen es so aussehen, als würde es nur den Chip zurücksetzen, wenn in der Zwischenzeit nichts im Code zurückgesetzt wird (was die "normale" Verwendung zu sein scheint).
Gibt es eine Möglichkeit, das WDT wie TIMER1_COMPA_vect oder ähnliches zu verwenden? Mir ist aufgefallen, dass es einen 1-Sekunden-Timeout-Modus gibt, und ich würde das sehr gerne nutzen, um alle 1 Sekunde in meinem Code etwas passieren zu lassen (und am liebsten dazwischen zu schlafen).
Gedanken?
* Update: * Da es gefragt wurde, beziehe ich mich auf Abschnitt 8.4 des ATTinyX5-Datenblattes . Nicht, dass ich es vollständig verstehe, was mein Problem ist ...
Antworten:
Das können Sie mit Sicherheit. Laut Datenblatt kann der Watchdog-Timer so eingestellt werden, dass die MCU zurückgesetzt wird oder ein Interrupt ausgelöst wird. Es scheint, dass Sie mehr an der Interrupt-Möglichkeit interessiert sind.
Der WDT ist aus dem gleichen Grund, aus dem er weniger nützlich ist: weniger Optionen, einfacher einzurichten als ein normaler Timer. Es läuft mit einem intern kalibrierten 128-kHz-Takt, was bedeutet, dass das Timing nicht durch die Haupttaktrate der MCU beeinflusst wird. Es kann auch im Tiefschlafmodus weiterlaufen, um eine Weckquelle bereitzustellen.
Ich werde ein paar Datenblattbeispiele sowie einen Code durchgehen, den ich verwendet habe (in C).
Enthaltene Dateien und Definitionen
Zu Beginn möchten Sie wahrscheinlich die folgenden zwei Header-Dateien einbinden, damit die Dinge funktionieren:
Außerdem verwende ich das Makro <_BV (BIT)>, das in einem der Standard-AVR-Header wie folgt definiert ist (was für Sie möglicherweise vertrauter ist):
Beginn des Codes
Wenn die MCU zum ersten Mal gestartet wird, initialisieren Sie in der Regel die E / A, richten Timer ein usw. Hier ist ein guter Zeitpunkt, um sicherzustellen, dass der WDT keinen Reset verursacht, da er dies erneut ausführen kann, und Ihr Programm dabei belässt eine instabile Schleife.
WDT-Setup
Nachdem Sie den Rest des Chips eingerichtet haben, wiederholen Sie den WDT. Das Einrichten des WDT erfordert eine "zeitgesteuerte Sequenz", aber es ist wirklich einfach zu tun ...
Natürlich sollten Ihre Interrupts während dieses Codes deaktiviert sein. Vergessen Sie nicht, sie danach wieder zu aktivieren!
WDT-Interrupt-Serviceroutine Das nächste, worüber Sie sich Sorgen machen müssen, ist die Behandlung des WDT-ISR. Dies geschieht so:
MCU-Schlaf
Anstatt die MCU innerhalb des WDT-ISR in den Ruhezustand zu versetzen, empfehle ich, einfach den Ruhezustand am Ende des ISR zu aktivieren und die MCU dann vom MAIN-Programm in den Ruhezustand zu versetzen. Auf diese Weise verlässt das Programm den ISR tatsächlich, bevor es in den Ruhezustand wechselt, und wird aufgeweckt und kehrt direkt in den WDT-ISR zurück.
quelle
Laut Datenblatt ist es möglich. Sie können sogar sowohl einen Interrupt als auch das Zurücksetzen aktivieren. Wenn beide aktiviert sind, löst das erste Watchdog-Timeout den Interrupt aus, wodurch das Bit Interrupt Enable deaktiviert wird (Interrupt deaktiviert). Das nächste Timeout setzt dann Ihre CPU zurück. Wenn Sie den Interrupt direkt nach seiner Ausführung aktivieren, löst das nächste Timeout (erneut) nur einen Interrupt aus.
Sie können den Interrupt auch nur aktivieren und das Zurücksetzen überhaupt nicht aktivieren. Sie müssen das WDIE-Bit jedes Mal setzen, wenn der Interrupt ausgelöst wurde.
quelle
Dies ist viel einfacher als oben und anderswo vorgeschlagen.
Solange die
WDTON
Sicherung nicht programmiert ist (es ist nicht standardmäßig programmiert), brauchen Sie nur ...Hier ist ein Codebeispiel, das eine ISR einmal pro 16 ms ausführt ...
Das ist es wirklich. Da wir den Watchdog-Reset niemals aktivieren, müssen wir nie mit den zeitgesteuerten Sequenzen herumspielen, um ihn zu deaktivieren. Das Watchdog-Interrupt-Flag wird automatisch gelöscht, wenn der ISR aufgerufen wird.
Wenn Sie eine andere Periode als jede Sekunde wünschen, können Sie diese Werte hier verwenden, um die entsprechenden Bits in
WDTCR
...Beachten Sie, dass Sie die zeitgesteuerte Sequenz ausführen müssen, um das Timeout zu ändern. Hier ist Code, der das Timeout auf 1 Sekunde setzt ...
quelle