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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.