PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Watchdog richtig anwenden



SteffenJ
29.11.2006, 13:32
Hallo zusammen,

ich möchte mein Programm mit einem Watchdog überwachen. Also habe ich diesen über

#pragma config WDT = ON
#pragma config WDTPS = 128

eingeschalten und den Postscaler auf 1:128 gesetzt. Das bedeutet doch, dass der WD nun 18ms*128 = 2,304s ausgelöst wird.
Soweit so gut. Zu Beginn des Programms leuchtet während einer Init-Routine eine rote LED auf. Während der Init ist eine 10s Warteschleife, also muss die LED am Start mindestens 10s leuchten. In der Schleife lösche ich mit

_asm CLRWDT _endasm

immer mal wieder den WD. Die LED leuchtet auch nie auf, also gehe ich davon aus, dass kein Reset ausgelöst wurde.

Jetzt das Problem:

Wenn ich den WD wie oben beschrieben implementiere, dann liefern mir die Rechroutinen falsche Ergebnisse. Ohne funktioniert's, mit nicht. Jetzt ist meine Vermutung, dass der WD-Reset doch irgendwo ausgelöst wird und der PIC dort weitermacht, wo er aufgehört hat und zwischenzeitlich irgendwas am Stack geändert hat. Oder aber umgekehrt: er startet von vorn und im Stack stehen noch alte Variablen. Aber das kann ja auch nicht sein, da ich die Variablen immer mit nem Wert initialisiere...
Also kurz: Ich habe keine Ahnung, wieso der mit aktivierten WD auf einmal falsch rechnet... Weiss jemand Rat bei diesem Problem?

Grüsse
SteffenJ

Mr.T
30.11.2006, 21:05
ich kenne mich mit deinem pic so gut wie nicht aus, aber erstell doch mal sicherheitskopie von deinem programm und lass es mal den WDT zu löschen.

ich meine, bevor du keine antwort bekommst, will ich dir wenigstens sagen, wie ich das zu lösen versuchen würde.

mfg

soeren

r.moshage
30.11.2006, 21:20
Wie kommst du auf 18 ms ? Bei 4 MHz sind 18 ms die Zeit die bei Vorteiler=128 rauskommt, der WD-Interupt wird also viel öfter ausgelöst wie du berechnet hast.

SteffenJ
01.12.2006, 06:54
@Mr. T: Was ist das Ziel, wenn ich den WDT nicht lösche? Also bringt mir das etwas? Kann Deinen Gedanken momentan nicht folgen.

@r.moshage: Der Watchdog wird unabhängig von der externen Frequenz betrieben. Laut Handbuch wird der typischerweise alle 18ms ausgelöst.

gunzelg
02.12.2006, 14:52
Hallo Steffen

hast du schon versucht den Code mit MPLAB-SIM zu testen ? MPLB erkennt auch, wenn du den Watchdog eingeschaltet hast und zeigt dir das an, wenn der Watchdog aktiv wird.

gerhard

Mobius
02.12.2006, 16:06
Was ist das Ziel, wenn ich den WDT nicht lösche? Also bringt mir das etwas? Kann Deinen Gedanken momentan nicht folgen. Das Zeil des Watchdogs ist, den µC nach Ablauf einer bestimmten Zeit zu Reseten und so in einen vordefinierten Zustand (sprich Reset, Sprung zur Adresse 0x00, etc.) zu bringen, wenn dieser sich wegen extrener (odr interner) Einflüsse in einer Unendlichschleife aufgehängt hat.


Der Watchdog wird unabhängig von der externen Frequenz betrieben. Laut Handbuch wird der typischerweise alle 18ms ausgelöst. Schon richtig und du kannst maximal ~2,3s erreichen, wenn du den Prescale auf 128 stellst. Aber der Watchdog teilt sich diesen mit T0. Schau mal, in dem Simulator von MPLab oder der Bit 3 (PSA) des OPTION_REG Registers auf 1 gesetzt ist. Weil wenn es nicht ist, dann hat der Timer0 den Prescaler und der Watchdog läuft mit einem 1:1 (und du hast alle 18ms einen overflow und ein Reset).
En Plus kannst du noch den Bit TO des STATUS Register beim Start des Programms auf einen Pin schreiben lassen. Wenn dann dort ein LED leuchtet, hat sich der PIC gerae mit einem Watchdog TimeOut resetet.

Ansonsten, schau mal, ob du nicht dein Programm auch ohne einen Watchdog betreiben kannst, weil eigentlich hab ich bisher bei allen meinen Projekten nur ein einziges Mal den Watchdog gebraucht und zwar für einen Low-Power Uhr, bei dem dieser den Chip aus dem SLEEP geholt hatte.
MfG
Mobius

SteffenJ
04.12.2006, 07:26
Hallo Mobius,

das PSA ist nicht gesetzt, der Timer0 hat also den Prescaler. Diesen Timer benutze ich für eine interne Uhr.

Heisst das, wenn der Timer0 den Prescaler benutzt, dass ich den Watchdog nicht mehr verzögern kann, weil der Prescaler entweder für den Watchdog oder den Timer0 benutzt wird?

Den Prescaler habe ich auf 1:256 für Timer0 gesetzt.

Grüsse
SteffenJ

Mobius
04.12.2006, 10:39
Heisst das, wenn der Timer0 den Prescaler benutzt, dass ich den Watchdog nicht mehr verzögern kann, weil der Prescaler entweder für den Watchdog oder den Timer0 benutzt wird?Ganz genau, der Timer0 und der Watchdog teilen sich den Prescaler. Steht im Datenblatt, bei dem Register OPTION_REG, wird, glaub ich, auch bei dem Timer0-Kapitel angesprochen.

MfG
Mobius