Forum: Mikrocontroller und Digitale Elektronik PIC16F737 ungültige Timeout von WDT when uC im SLEEP


von Sebastian O. (osa)


Lesenswert?

Hallo Kollegen,

seit drei Tage kämpfe ich mit dem folgenden Problem:

ich möchte dass mein System von Sleep durch WDT aufgeweckt wird, jede 
ca. 1 Minute.
Diesbezüglich habe ich den Vorteiler und Nachteiler auf 1:64 gesetzt, 
dann den Vorteiler von TMR0 für WDT zugeordnet:

...
// set WDT
WDTCON      = 0x02;   // WDT Postscaler=1:64, WDT OFF
OPTION_REG  = 0xA6;   // prescaler assigned to timer0, prescaler=1:64
TMR0        = 0x00;
OPTION_REG  = OPTION_REG | 0x08; // assign prescaler to WDT
CLRWDT();
....

Danach, später im Kode setze ich das System in SLEEP:

...
SWDTEN      = 0x01; // enable watchdog timer (to wakeup every 1minute)
RB4         = 0x00; // DEBUG only!
SLEEP();            // system low power mode enabled
NOP();
SWDTEN      = 0x00;
RB4         = 0x01; // DEBUG only!
....

Wenn ich mit meinem (analogen) Oszi nachmesse wie lange ist RB4 auf 0, 
dann bekomme ich immer ein Wert ~100ms.
Es heisst, der WDT wacht das System immer nach ca. 100ms auf. Die ganze 
ist dann in eine Schleife.

Ich frage mich was ich falsch machen kann...

Euch, bedanke ich mich schon für eure Antworten/Hilfe.

Grüße,
Sebastian.

von chris (Gast)


Lesenswert?

wdtcon mit .10 laden anstelle von 0x02

von Sebastian O. (osa)


Lesenswert?

Hm, ja, guter Punkt!

Ich probiere es aus, dann berichte ich am Nachmittag.
Trotzdem stört mich dass auch so, mit WDTCON=0x02, hätte ich mindestens 
1Sekunde Timeout erwartet.

Danke und Grüße,
Sebastian.

von chris (Gast)


Lesenswert?

mit wdcon = 2 (128 postscaler) hast du 260ms timeout.
Die 160ms verbrauchst du warscheinlich im Programm vom clrwdt zum sleep
und die restlichen 100ms misst du dann.

von Sebastian O. (osa)


Lesenswert?

Vielleicht vermisse ich da was:
laut PIC Spec, nominaler Timeout des WDTs=16ms.
Des, mal 64 Vorteiler=1024ms (~1s).

Auch laut PIC Spec, die SLEEP() Funktion löscht den WDT Zähler

Der PIC ist mit einem 16MHz Quarz getaktet.

von chris (Gast)


Lesenswert?

stimmt, aber nur wenn du nicht das WDCON verànderst.
32 uS * 512 = 16.384 mS , 32uS ist der 31.5 khz Ringoszillator und
512 ist der Default postscaler von WDCON.
Wenn man nun 1 Minute braucht, dann muss man einen postscaler von 2^15
nehmen, also der Wert dezimal 10 im WDCON, dann hat man mit dem
prescaler vom Optionregister (/64) ein Timeout von 67.1 Sekunden.

von Sebastian O. (osa)


Lesenswert?

Es funktioniert jetzt wie es soll.
Es war mein Fehler gewesen weil ich den Spec falsch verstanden habe: 
statt 32us WDT Periode habe ich 16ms verstanden.

Danke Chris für die Hilfe!

Grüße,
Sebastian

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.