Forum: Mikrocontroller und Digitale Elektronik WDTON und SleepMode - beißt sich das?


von M.B. (Gast)


Lesenswert?

Ich habe an meinem ATmega88 den Hardware Watchdog eingeschaltet (Fuse 
WDTON)
Im Programm habe ich die Zeit auf 500ms gestellt und resette den 
Watchdog regelmäßig - alles kein Problem.

Irgendwann schicke ich meinen µC in Schlafmodus:
1
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
2
    wdt_reset();
3
    sleep_mode();
Jedoch scheint mein Prozessor vom Watchdog wieder aufzuwachen. Ist das 
möglich?
Wenn ja, das soll nicht so sein! Er soll aufwachen wann ich das will und 
zwar nach dem Einschaltvorgang.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

M.B. wrote:

> Wenn ja, das soll nicht so sein! Er soll aufwachen wann ich das will und
> zwar nach dem Einschaltvorgang.

Dann musst du vor dem ,,Gute Nacht!''-Sagen noch den Wachhund
einschläfern.

von Jan M. (mueschel)


Lesenswert?

Ja, der Watchdog hat die hoehere Prioritaet, es koennte ja sein, dass du 
vor dem sleepmode die Interrupts nicht richtig gesetzt hast, und dein uC 
dann im sleep gefangen waere.

Du musst also vor dem sleep den watchdog ausschalten.

von M.B. (Gast)


Lesenswert?

OK, den Watchdog ausschalten.
Aber geht das überhaupt?

In einem anderen Thread wurde mir gesagt:
>
>Fuse WDTON gesetzt --> Watchdog von Anbeginn des Programms
>eingeschaltet;
>                       nicht per Software abschaltbar ("fail safe mode")
>
>Fuse WDTON nicht gesetzt --> Watchdog per Software ein- und ausschaltbar
>                             (einschalten einfach, ausschalten nur mit
>                             spezieller Befehlssequenz)
>
>Siehe Datenblatt.

Noch mal für mich:
Wenn der Watchdog an ist (nicht abgeschaltet) und der Prozessor dann in 
Power Down geht (Resets kommen ja dann nicht mehr), wacht der Prozessor 
durch den Watchdog wieder auf?

Jan M. wrote:
>Ja, der Watchdog hat die hoehere Prioritaet, es koennte ja sein, dass du
>vor dem sleepmode die Interrupts nicht richtig gesetzt hast, und dein uC
>dann im sleep gefangen waere.
>
>Du musst also vor dem sleep den watchdog ausschalten.

Mein Prozessor soll im Sleep gefangen bleiben!
Erst nach anlegen der Versorgungsspannung soll er wieder "rennen"

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Du mußt in dem Fall die WDTON-Fuse deaktivieren, sonst bleibt der 
Watchdog an und läßt sich zur Laufzeit nicht deaktivieren.

von M.B. (Gast)


Lesenswert?

Super - Programm rennt!

Das wars, danke euch allen.
Man, ist der Watchdog kompliziert - zumindest komplizierter als ich 
dachte.

Ich fasse noch mal zusammen (bitte verbessert mich wenn etwas nicht 
stimmt)

* Es gibt einen HW und SW - Watchdog
- HW - die Fuse
- SW - wdt_enable(X)
* Den HW Watchdog kann man nicht deaktivieren außer über die Fuse
* Den SW Watchdog kann man ein- und ausschalten
* Wenn der Prozessor im Sleep-Modus ist überwacht ein eingeschalteter 
Watchdog weiter - und wenn kein Reset kommt, wacht der µC wieder aus dem 
Schlafmodus auf, wenn der Timer abgelaufen ist!
(Heißt: Man kann den Watchdog "missbrauchen", um den Schlafmodus zu 
beenden)
* Wenn man den Sleep-Modus haben möchte, und die Aufweckfunktion durch 
andere Bedingungen erfüllt werden soll (Taster über Interrupt) muss man 
den Watchdog vorher ausschalten.

Ist das korrekt?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

M.B. wrote:

> * Es gibt einen HW und SW - Watchdog
> - HW - die Fuse
> - SW - wdt_enable(X)

Nein, es gibt nur einen Watchdog, aber zwei Möglichkeiten, ihn zu
aktivieren.  Davon kann man eine der beiden (Aktivierung via Fuse)
nicht per Software ausschalten.  Das hat reine security-Aspekte:
es gibt selbst nichtmal mehr die minimale theoretische Chance,
dass eine ,,wild gewordene'' Software ,,aus Versehen'' den Watchdog
abklemmen kann, wenn er per Fuse aktiviert worden ist (da die
Software nicht in der Lage ist, die Fuse umzuprogrammieren).

> (Heißt: Man kann den Watchdog "missbrauchen", um den Schlafmodus zu
> beenden)

Ja, und das ist bei einigen kleinen AVRs die einzige Möglichkeit, aus
einem Tiefschlaf doch hin und wieder geweckt zu werden ohne äußeren
Interrupt (weil sie keinen separaten 32-kHz-Oszillator haben und damit
keinen powersave-Schlaf kennen).

von M.B. (Gast)


Lesenswert?

Vielen Dank für die Information.

Ich hoffe, dass ich für die Zukunft die Watchdog-Funktion korrekt 
verstanden habe. Ich denke ja - aber wir werden sehen.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Denk noch an den Standardfehler: nach einem Watchdog-Reset kann
man den Watchdog nur wieder abschalten, wenn man auch das WDRF-Bit
(das den durch den Watchdog eingeleiteten Reset anzeigt) zuvor
löscht.  Standardmäßig akkumulieren all die *RF-Bits im entsprechenden
Register, d. h. sie würden erst bei einem power cycle sonst wieder
zurück gesetzt.

Die Doku zu <avr/wdt.h> enthält Beispielcode, wie man damit umgehen
kann.

von M.B. (Gast)


Lesenswert?

Danke schön für diesen Zusatzhinweis!

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.