WDTON und SleepMode - beißt sich das?

Gast #1110160
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.
Gast #1110180
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"
Gast #1110214
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?
Moderator Persönliche Seite #1110239
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).
Moderator Persönliche Seite #1110264
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren