Forum: Mikrocontroller und Digitale Elektronik ATMega8 Watchdog Timer in C


von Michael B. (laberkopp)


Lesenswert?

Hi Leute

Ich habe ein Problem mit dem ATmega8 (Modell nicht verhandelbar) und der 
Verwendung des Watchdog-Timers zum Stromsparen unter Atmel Studio C.
Der Prozessor wird also, nach dem er losgelaufen ist und kleine Dinge 
getan hat, am Ende von main mit


  WDTCR = (1<<WDE)|5; // watchdog reset every 0.5 sec
  power_all_disable();
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
  sleep_enable();
  sleep_mode();

in die Ruhezustand geschickt um nach Ablauf der Watchdog-Zeit (von ca. 
0.5 Sekunden) erneut aufzuwachen.
So wie ich die Beschreibung lese, kann der Watchdog bei ATmega8 nur 
einen RESET auslösen.

So wie ich das Programm ausprobiert habe, wird dann main erneut 
aufgerufen und es sind wieder alle globalen nicht-initialisierten 
Variablen auf 0 gesetzt, da der C-Startup-Code das BSS Segment wohl 
löscht, inklusive des WDE Bit im WDTCR Register.

Ausser über das EEPROM gibt es scheinbar keine Möglichkeit, Werte von 
einem sleep zum nächstn sleep rüberzuretten (und das EEPROM sollte man 
nun nicht so oft umprogrammieren).

Oder kennt jemand einen Weg, den ich übersehen habe ?

Ich habe jetzt nicht vor, auf Assembler umzusteigen, aber vielleicht 
gibt es ja startuop-Code Optionen.

von Peter D. (peda)


Lesenswert?

Michael B. schrieb:
> So wie ich die Beschreibung lese, kann der Watchdog bei ATmega8 nur
> einen RESET auslösen.

Richtig gelesen, erst der ATmega88 kann auch einen Interrupt auslösen.

Man kann aber Variablen, die bei einem Watchdogreset nicht initialisiert 
werden sollen, in die .noinit Section legen.
Dann nach dem Reset das WDRF-Bit prüfen und sie händisch initialisieren, 
wenn nicht gesetzt.

von Jim M. (turboj)


Lesenswert?

Michael B. schrieb:
> da der C-Startup-Code das BSS Segment wohl
> löscht, inklusive des WDE Bit im WDTCR Register.

Den C-Startup Code kann man ändern, wenn man etwas AVR Assembler 
schreiben kann. So könnte man bestimmte Bereiche nicht initalisieren.

Allerdings könnten tiefe Stromsparmodi dem RAM die Stromversorgung 
komplett klauen -> Handbuch lesen.

von Einer K. (Gast)


Lesenswert?

Jim M. schrieb:
> Den C-Startup Code kann man ändern, wenn man etwas AVR Assembler
> schreiben kann. So könnte man bestimmte Bereiche nicht initalisieren.

Da ist alles schon fertig.

Siehe:
Peter D. schrieb:
> .noinit Section

von Thomas E. (thomase)


Lesenswert?

Jim M. schrieb:
> Allerdings könnten tiefe Stromsparmodi dem RAM die Stromversorgung
> komplett klauen

Ja, aber nur im "Sleep-Power-Off".

von Michael B. (laberkopp)


Lesenswert?

Peter D. schrieb:
> Man kann aber Variablen, die bei einem Watchdogreset nicht initialisiert
> werden sollen, in die .noinit Section legen.

Danke für den Tipp, so funktioniert's.

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.