www.mikrocontroller.net

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


Autor: john francourd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Peter (Gast)
Datum:

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

Autor: john francourd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: fabs (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kachel-Heinz (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.