Wie wäre es denn, das Programm nach jeder Mainloop-Runde sowiso in den
Sleep fallen zu lassen. Im Normalbetrieb ist Sleep-Mode Idle vorgewählt,
wodurch die Timer weiter laufen und den AVR regelmäßig wecken. Besteht
die Notwendigkeit, den AVR in den stromsparenden Power-Down-Sleep zu
versetzen, so aktiviert man den Weck-Interrupt, schaltet den Sleep-Mode
(in mcucr) auf Power-Down um und kehrt wie gewöhnlich in die Mainloop
zurück. An deren Ende fällt der AVR in den Tiefschlaf und schaltet
selbsttätig seine Timer und ADC aus. In der Weck-ISR wird nur der
Weck-Interrupt deaktiviert und der Sleep-Mode auf idle zurückgeschaltet
und schon läuft der AVR wieder normal und kan per Timer-Interrupt Tasten
abfragen (und entprellen) und auf seinen Mais-Teer hören.
Hält man sich an diese Vorgehensweise, kann man die
Deep-Sleep-Vorbereitungen auch in einer ISR treffen, z.B. in einer
Timer-ISR, die neben anderen Aufgaben auch noch einen Nixtu-Timeout
verwaltet, der den AVR dann in den Tiefschlaf schickt, wenn sein
Mais-Teer lange nix mehr von ihm wollte.
KH