Forum: Mikrocontroller und Digitale Elektronik WDT benutzen im PIC


von Thomas M. (xt-fahrer)


Lesenswert?

Hallo,
in meinem Programm für den 16F84A möchte ich mal den Watchdog benutzen, 
wenn es diese Funktion schon gibt. So wie ich das sehe, muß ich das 
PSA-Bit setzen, aber dann geht TMR0 nicht mehr, oder? Ich brauche aber 
den Timer. Wenn ich dann auch noch das entsprende config-Bit setze, mußt 
der WDT eingeschaltet sein. Und wie geht es dann weiter? Muß ich dann in 
zyklischen Abständen im Programm das \TO-Bit abfragen?
Ein kurzer Beispielcode wäre sehr hilfreich

Gruß
Thomas

von Anja (Gast)


Lesenswert?

Thomas M. schrieb:
> So wie ich das sehe, muß ich das
> PSA-Bit setzen,

Nein du mußt nicht. mit dem Bit wird lediglich festgelegt ob der Timer 
den Prescaler verwendet oder der Watchdog. (Beides geht nicht).

Thomas M. schrieb:
> Wenn ich dann auch noch das entsprende config-Bit setze, mußt
> der WDT eingeschaltet sein.

richtig.

Thomas M. schrieb:
> Muß ich dann in
> zyklischen Abständen im Programm das \TO-Bit abfragen?
nein, du rufts in zyklischen Abständen im Hauptprogramm (nicht 
Interrupt) CLRWDT auf. Das ganze sollte so gestaltet sein daß der Aufruf 
nur dann erfolgt wenn alle wichtigen Programmteile auch zyklisch 
abgearbeitet werden.

Gruß Anja

von Thomas M. (xt-fahrer)


Lesenswert?

Anja schrieb:
> Thomas M. schrieb:
>> So wie ich das sehe, muß ich das
>> PSA-Bit setzen,
>
> Nein du mußt nicht. mit dem Bit wird lediglich festgelegt ob der Timer
> den Prescaler verwendet oder der Watchdog. (Beides geht nicht).

Ist es ein Problem, wenn der Timer den Prescaler benutzt und der 
Watchdog nicht? Wie ich schon schrieb, ich brauche den Prescaler für den 
Timer.

> nein, du rufts in zyklischen Abständen im Hauptprogramm (nicht
> Interrupt) CLRWDT auf. Das ganze sollte so gestaltet sein daß der Aufruf
> nur dann erfolgt wenn alle wichtigen Programmteile auch zyklisch
> abgearbeitet werden.

Ok, und in welchen Abständen, bzw. wie kriegt man die raus? Ich schätze 
mal, das hängt an der Quarzfrequenz

Thomas

von Anja (Gast)


Lesenswert?

Thomas M. schrieb:
> Ok, und in welchen Abständen, bzw. wie kriegt man die raus? Ich schätze
> mal, das hängt an der Quarzfrequenz

Steht im Datenblatt. Ohne Prescaler warens glaub ich so minimal 7 ms.

Gruß Anja

von Stefan (Gast)


Lesenswert?

Alle 18ms wird er ausgelöst. Hat mit dem externen
Quarz nichts zu tun.
Siehe Datenblatt.

von Carsten S. (dg3ycs)


Lesenswert?

Hi,

Stefan schrieb:
> Alle 18ms wird er ausgelöst. Hat mit dem externen
> Quarz nichts zu tun.
> Siehe Datenblatt.

Naja, indirekt hat es schon mit dem externen Quarz zu tun.
Der WDT hat freilich seinen eigenen, völlig unabhängigen, internen 
Oszillator der dafür sorgt das ungefähr alle 18ms? (nicht selbst ins DB 
geschaut) ein impuls ausgelöst wird. Dieser kann dann wahlweise durch 
den Teiler geleitet werden oder würde ohne rücksetzen direkt einen Reset 
auslösen. Dieser absolute Zeitabstand ist also völlig vom Quarz 
unabhängig.

Je schneller aber der externe Quarz ist, um so schneller werden die 
BEfehle abgearbeitet. Übersetzt bedeutet das, das man mehr sonstige 
Befehle zwischen zwei "clrwdt" belassen kann.

Es ist also die Frage ob es zu schaffen ist das in dem Program zwischen 
zwei CLRWDT egal in welchem "normalen" Betriebszustand niemals mehr als 
18ms liegen. Klappt das, so kann man problemlos den WDT ohne Vorteiler 
betreiben.
Bei 4Mhz oder mehr Taktfrequenz ist das oft überhaupt kein Problem. 
Betreibt man den Pic aber nur mit 37KHz Uhrenquarz (bei den allerersten 
"L" Typen z.B. üblich gewesen wenn man wirklich "LowPower" haben wollte) 
kann es schon verdammt eng werden. Gerade wenn man viel mit 
Verzweigungen arbeitet die sich letztendlich ja nur mit btfsc/btfss 
befehlen realisieren lassen und eine gewisse Abfolge von Befehlen in 
zwingender ununterbrochender Reihenfolge von Flag Manipulationen und 
Befehlsaufrufen erfordern ein echter Knackpunkt ;-)

Gruß
Carsten

von Thomas M. (xt-fahrer)


Lesenswert?

Vielen Dank!
Stimmt, ich habe die 18 ms gefunden. Bei meiner Schleifendauer von 100µs 
reicht tatsächlich ein einziges clrwdt am Anfang der mainloop, egal 
welche Verzweigung mein Programm nimmt

Gruß
Thomas

von Anja (Gast)


Lesenswert?

Thomas M. schrieb:
> Stimmt, ich habe die 18 ms gefunden.

das ist nur die typische Zeit. Wenn Du sichergehen willst daß der 
Watchdogreset nicht versehentlich getriggert wird solltes Du immer die 
minimum Zeit von 7 ms als Kriterium verwenden.

Gruß Anja

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.