Forum: Mikrocontroller und Digitale Elektronik Avr -> Sleep Modus aus einem anderen Interrupt


von john francourd (Gast)


Lesenswert?

Hallo,
funktioniert es einen AVR aus einer Interrupt Service Routine in den 
SleepModus zu schicken? Bedingt das "nested" Interrupts? Weil der 
Interrupt der den Sleepmodus aktiviert ja noch nicht abgeschlossen ist.

von Peter (Gast)


Lesenswert?

der avr, geht doch erst schlafen wenn der Sleep befehl kommt. Ob er in 
einem Interrupt ist oder nicht sollte ihm egal sein.

von john francourd (Gast)


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 :)

von fabs (Gast)


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

von Kachel-Heinz (Gast)


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

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.