Forum: Mikrocontroller und Digitale Elektronik Watchdog MSP430 mit TIMERB zurücksetzen


von Manuel (Gast)


Lesenswert?

Hallo,

ich möchte einen 1s Watchdog verwenden. Dazu initialisiere ich ihn so

WDTCTL = WDTPW + WDTIS0 + WDTSSEL + WDTCNTCL;
//Watchdog Interval = 1 s, Clock = ACLK

ACLK hat bei mit ein 32kHz Quarz, ergibt also 1s.

wenn ich ihn nun in der TimerB ISR alle 0,5s zurücksetzen will, kommt 
immer gleich nach dem zurücksetzen ein Reset... warum?

WDTCTL = WDTPW + WDTCNTCL;

Ich versteh das nicht... Gibt es Probleme mit dem LPM3 den ich 
dazwischen verwende? Da ist der ACLK ja noch an...

Gruß

Manuel

von Manuel (Gast)


Lesenswert?

Hab raus:

wie ich es hier im Forum gelesen habe geht nicht:

WDTCTL = WDTPW + WDTCNTCL;

Das führt zu einem Reset,

wenn ich allerdings

WDTCTL = WDT_ARST_1000;

verwende klappt es... warum auch immer

Gruß

Manuel

von lkmiller (Gast)


Lesenswert?

>...ich möchte einen 1s Watchdog verwenden. Dazu...
>...wenn ich ihn nun in der TimerB ISR alle 0,5s zurücksetzen will...

Es macht keinen Sinn einen WD in einer Timer-ISR zurückzusetzen.
Die ISR wird von Hardware ausgelöst und kann ohne weiteres auch
noch durchlaufen werden, wenn das Hauptprogramm (die Main-Loop)
sich festgefressen hat.

Im Allgemeinen sollte der WD in der Main-Loop zurückgesetzt werden.
Ob du so eine Main-Loop hast hängt allerdings von deiner SW-Strategie 
ab.

von genervter (Gast)


Lesenswert?

WDTIS0 setzt das Bit 0 auf 1, d.h. du hast dann einen Teiler von 8192.
Du wolltest aber WDTIS_0 machen. Das setzt Bit 1 und 0 auf 0.

Genau das was dein neues define auch macht:
1
#define WDT_ARST_1000       (WDTPW+WDTCNTCL+WDTSSEL)

von Ralf (Gast)


Lesenswert?

ich weiß, der Beitrag ist alt, aber hier fehlte einfach die Lösung des 
Problems (was mich den Nachmittag gekostet hat):

Das Triggern mit WDTCTL = WDTPW + WDTCNTCL; funktioniert nicht richtig, 
weil wir zuerst den ACLK gewählt haben (mit WDTSSEL beim Watchdogstart).
Wenn jetzt mit
WDTCTL = WDTPW + WDTCNTCL;
getriggert wird, so wird beim ersten Trigger plötzlich der SMCLK gewählt 
(weil WDTSSEL fehlt). Da SMCLK meist viel höher als ACLK ist, löst der 
Watchdog beim 2. mal seeeehr viel früher aus. Das liegt daran, dass das 
Triggern und Konfigurieren über das selbe Register WDTCTL geschieht.
WDTCTL |= WDTPW + WDTCNTCL; funktioniert auch nicht, weil das Lesen des 
WDTCTL-Registers 69..h liefert.
Am einfachsten nimmt man wirklich WDTCTL = WDT_ARST_1000 zum retriggern.

von Guliver L. (smithjnr)


Angehängte Dateien:

Lesenswert?

Was heißt hier "alter Beitrag"? Da gibt es aber ollere Kamellen im 
Forum. Für gute Tipps ist es nie zu spät. Danke Ralf, mir hat es sehr 
geholfen.
Zum besseren Verständnis habe ich ein kleine Projekt für den MSP430G2553 
in "TI CCSv5" unter "TI Grace" erstellt und hier angehängt.
Funktion:
1. Test: Der WD läuft mit ca. 700ms (12kHz/8192). Ein Timer läuft mit 
1000 ms und setzt den WD zurück (kick the dog). Da die Timerzeit nicht 
ausreicht, um den WD rechtzeitig zurückzusetzen, wird ein WD-Interrupt 
erzeugt und main neu gestartet. Angezeigt wird das durch periodisches 
Aufblitzen der LED1 (P1.0), die am Anfang von main programmiert ist.
2. Test: Die Zeit des Timers wird auf 100 ms verkürzt. Nun unterbleibt 
das periodische Blitzen der LED, weil der WD immer rechtzeitig 
zurückgesetzt wird. Main wird also nur noch einmal gestartet.

von Matthias P. (Firma: privat) (sogge)


Lesenswert?

Jo danke Ralf hat mir auch geholfen!

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
Noch kein Account? Hier anmelden.