4.2  Watchdog-Timer

Mit dem Watchdog-Timer (deutsch: Wachhund) wird die komplexe Timer-Funktionalität des MSP430 erweitert. Die wesentliche Aufgabe dieses Timers besteht darin, die Systemfunktionen des Mikrocontrollers zu überwachen. Das heißt, es wird wie bei einem Zugführer einer Lokomotive regelmäßige Bedienung erwartet (sog. Totmannschalter). Bleibt diese aus, so kann davon ausgegangen werden, dass ein ungültiger Systemzustand eingetreten ist und entsprechend reagiert werden muss (RESET). Er ist beim Start des Controllers


PIC

Bild 4.12.: Blockschaltbild des Watchdog-Timers [Tex06c].


(zum Beispiel nach einem Power-On-Reset (POR) ) immer eingeschaltet, so dass wir ihn in den Programmierbeispielen der vorherigen Kapitel immer gleich in der ersten Programmzeile deaktiviert haben.

Der Watchdog-Timer überwacht zunächst die Versorgungsspannung. Die Abarbeitung eines Benutzerprogramms erfolgt erst, nachdem sichergestellt ist, dass der Mikrocontroller ordnungsgemäß gestartet wurde. Bild 4.12 skizziert das Blockschaltbild des Watchdog-Timers. Wir werden im Folgenden auf die wichtigsten Funktionseinheiten näher eingehen.

4.2.1  Funktionalität

Die wesentliche Funktionalität des Watchdog-Timers kann man sich wie eine Art Reset-Generator mit einem Timeout vorstellen. Dabei verfügt der Watchdog-Timer über ein internes 16 Bit breites Zählregister WDTCNT, das per Software nicht direkt angesteuert werden kann. Bei jedem Takt von der dem Watchdog-Timer zugewiesenen Taktquelle wird das Zählregister inkrementiert. Bei einem Überlauf von WDTCNT löst der Watchdog-Timer einen Reset aus. Der Entwickler ist also gezwungen, das Register WDTCNT im Hintergrund regelmäßig, immer rechtzeitig vor einem Überlauf, auf 0 zu setzen. Dieses Rücksetzen des Watchdog-Timers sollte günstigerweise in einer Funktion durchgeführt werden, die regelmäßig aufgerufen wird, nachdem alle wichtigen periodischen Programmschritte ausgeführt wurden. In Task-gesteuerten Betriebssystemen wird dies zum Beispiel in der so genannten ”idle loop” also der Schleife, die bis zum nächsten Event wartet, getan.

Im Umkehrschluss führt eine Endlosschleife in einem Programmteil oder eine überlange Auslastung eines Tasks dazu, dass der Prozessor nicht mehr auf neue Rechenanforderungen reagieren kann. Um diesen Zustand wieder kontrolliert verlassen zu können und ein dauerhaftes „Hängenbleiben“ des Mikrocontrollers zu verhindern, führt der Watchdog einen Reset aus. Damit erhält man wieder einen definierten Systemzustand und kann entsprechende Maßnahmen einleiten. Um nach dem Reset herauszufinden, ob der Watchdog der Auslöser war, kann man das WDTIFG-Bit im Interrupt-Flag-Register 1 (IFG1) abfragen. Ist es gesetzt, hat der Watchdog den Reset ausgelöst.

Watchdog-Funktionalität sollte immer dann eingesetzt werden, wenn sicherheitskritische Systeme (der Mikrocontroller muss auf kritische Zustände reagieren können) oder Systeme mit hoher Verfügbarkeit (selbst nach kapitaler Fehlfunktion wird wieder ein kontrollierter Zustand erreicht) entworfen werden sollen.

4.2.2  Watchdog-Timer-Control-Register

Der Timer lässt sich mit Hilfe des 16 Bit breiten Watchdog-Timer-Control-Register, WDTCTL, kurz WDTCTL, konfigurieren. Eine Besonderheit des Registers ist, dass der Schreibzugriff nur mit Hilfe des Watchdog-Passworts WDTPW (hexadezimaler Wert: 0x05A) erfolgen darf. Erfolgt ein schreibender Zugriff auf das Register WDTCTL mit einem von WDTPW abweichenden Passwort, löst der Watchdog einen Reset aus. So soll verhindert werden, dass der Watchdog-Timer unabsichtlich falsch konfiguriert wird.


PIC

Bild 4.13.: Bitbelegung des Watchdog-Timer-Control-Registers


Die Bitbelegung des WDTCTL-Registers ist in Bild 4.13 dargestellt. Aus der Abbildung geht hervor, dass der Wert WDTPW beim lesenden Zugriff auf das Watchdog-Timer-Control-Register den Wert 0x069 zurückgibt. Setzt man das Flag WDTHOLD, so wird der Watchdog-Timer gestoppt (vgl. Kapitel 4.2.2).

Das Flag WDTTMSEL bestimmt, in welchem Modus der Watchdog-Timer betrieben wird. Ist das Flag gelöscht, ist die oben beschriebene Watchdog-Funktionalität ausgewählt und jeder Überlauf führt zu einem Reset. Ist das Flag gesetzt, operiert der Watchdog im Wesentlichen wie ein normaler Timer und es wird kein Reset ausgelöst. Bei Überlauf wird das Watchdog-Interrupt-Flag (WDTIFG) im Interrupt-Flag-Register 1 (IFG1) gesetzt und es wird, sofern das WDTIE-Bit im Interrupt-Enable-Register 1 (IE1) gesetzt ist, ein Interrupt ausgelöst.

Mit WDTSSEL weist man dem Watchdog-Timer eine Taktquelle zu (0: SMCLK und 1: ACLK). Wie bei allen anderen Timern kann das Taktsignal der Quelle noch durch einen Vorteiler WDTISx gesteuert werden (Tabelle 4.11).


WDTISxTeiler
00 32768
01 8192
10 512
11 64

Tabelle 4.11.: Vorteiler WDTISx für den Watchdog-Timer

Mit den Flags WDTNMIES und WDTNMI kann man die Funktion des Reset-/NMI- Pins sowie die Watchdog-Funktion einstellen. Ist WDTNMI auf 0, führen sowohl Watchdog als auch das Nullsetzen des Reset-Pins zu einem Reset des Prozessors. Ist WDTNMI auf 1, wird ein NMI-interrupt ausgelöst (natürlich nur, wenn das NMIIE-Bit im IE1-Register auch gesetzt ist). Das WDTNMIES-Bit bestimmt, ob der Interrupt bei steigender (WDTNMIES=0) oder fallender (WDTNMIES=1) Flanke ausgelöst wird.

Watchdog-Timer zurücksetzen

Das Flag WDTCNTCL ist ein logischer Schalter. Setzt man das Flag, so wird das Watchdog-Timer-Zählerregister WDTCNT auf 0 gesetzt. Das Flag wird danach automatisch wieder gelöscht. Das Watchdog-Timer-Zähleregister ist 16 Bit breit und kann nicht per Software ausgelesen werden.

Wenn der Watchdog-Timer den Systemstatus überwacht, muss das Zählerregister WDTCNT in regelmäßigen Abständen (und zwar schneller als die Zeit, die zum Überlauf von WDTCNT führt) gelöscht werden. Bei einem Überlauf löst der Watchdog sonst einen Reset aus. Ein Beispiel für eine Verwendung des Watchdog-Timers zeigt das folgende Listing 4.8

#include <msp430x16x.h> 
void main() 
{ // Watchdog-Timer konfigurieren: 
  WDTCTL=WDTPW+WDTIS1;   // SMCLK/512 
 
  while (1) { 
  // ... hier weiterer Programmcode 
  WDTCTL=WDTPW+WDTCNTCL; // Reset Watchdog 
  } 
}
Listing 4.8: Verwendung des Watchdog-Timers zur Überwachung

Watchdog-Timer ausschalten

Häufig kommt es zu einem zunächst unerklärlichen Reset bei der Abarbeitung eines Benutzerprogramms. In vielen Fällen wird dieser Reset durch den Watchdog-Timer ausgelöst. Das liegt vielfach daran, dass der Benutzer vergisst, den Watchdog-Timer zu den entsprechenden Zeitintervallen zurückzusetzen.

#include <msp430x16x.h> 
void main() 
{ // Watchdog-Timer ausschalten: 
  WDTCTL=WDTPW+WDTHOLD; 
 
  // ... hier weiterer Programmcode 
}
Listing 4.9: Watchdog-Timer beim Programmstart stoppen

Vielen Anfängern ist gar nicht bewusst, dass diese Systemüberwachungsfunktion im Gegensatz zu den meisten anderen Mikrocontrollern per Default eingeschaltet ist. Daher wird der Watchdog-Timer häufig beim Programmstart im ersten Befehl gestoppt (Listing 4.9). So vermeidet man Fehler und das lästige Rücksetzen des Watchdog-Timers. Bei fast allen Beispielprogrammen in diesem Buch wird dies so gemacht.