Avr -> Sleep Modus aus einem anderen Interrupt

Gast #947078
Lesenswert?

Ok, ich dachte es gibt Probleme mit dem aufwachen. Da ein neuer 
Interrupt von der Hardware ja erst akzeptiert wird, wenn nicht gerade 
ein anderer IRQ aktiv ist.

Und da ich dann ja in einem Interrupt sleep aufrufe, geht der avr 
schlafen und dieser irq ist nicht beendet, und dadurch kann er auch 
nicht durch einen z.b. externen Interrupt geweckt werden.

Aber wenn diese Sorge unbegründet ist, ist ja alles gut :)
Gast #947079
Lesenswert?

Das Problem ist eher dass du ihn dann nimmer geweckt bekommst, ausser 
vieleicht durch den Watchdog.
Prinzipiell ist es bei AVR so, dass der Befehl nach dem Sleep noch 
ausgeführt wird, man kann also nach dem sleep noch ein reti machen. Wie 
man das in C hinbekommt weiss ich aber nicht.
Lieber im Interrupt ein Flag setzen und im Main drauf reagieren.

Gruß
Fabian
Gast #947203
Lesenswert?

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

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