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.
Gast
#5154796
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.