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.
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.
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.
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
Jim M. schrieb: > Allerdings könnten tiefe Stromsparmodi dem RAM die Stromversorgung > komplett klauen Ja, aber nur im "Sleep-Power-Off".
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.