power down mode

Gast
Durch welches Signal willst Du wieder aufwecken?

Ich tippe mal, dass Dein Problem damit zu tun hat, dass Du im IR den
Sleep-Befehl gibst.

Stefan
Gast
Laut Datenblatt hast du nicht mehr viel mit dem du ihn aufwecken kannst.
Entweder durch Level 0 auf INT0 oder durch Timer 2 wenn er durch
einen externen Quarz getaktet ist. ASSR muss auch gesetzt sein.

Also, Datenblatt genau lesen!
Gast
Nicht ganz: INT0 und auch INT1.
Und alle Arten von Reset.
Letzteres kann dann interessant sein, wenn der Watchdog-Timer zum
zyklischen Aufwachen benutzt werden soll.

Stefan
Gast
Ähm, aber der Sleep Mode wurde INNERHALB einer ISR aufgerufen, und die
Interrupts sind doch da gesperrt. Eigentlich dürfte der AVR niemals
mehr aufwachen, auch nicht durch INT0/INT1 ??

Das sollte man mal testen, es sei denn ich liege absolut falsch und
jemand kann das Gegenteil bestätigen.

Der ASR-Timer2 kann nicht den Power Down verlassen, dazu darf der AVR
nur den Power Save Mode nutzen.

Gruß Hagen
Gast
Ist doch erstmal egal.

Der AVR befindet sich in einer Interrupt Service Routine und diese
setzt den AVR in den Sleep Mode -> Power Down, OHNE vorher die IRQ's
zu enablen.

Kann dann der AVR über einen externen Interrupt wie INT0 aus dem Power
Down Mode aufgeweckt werden ??

Gruß Hagen
Gast
unter Power-Management and sleep-modes steht:

"if an enabled IR occurs while the mcu is in a sleep mode, the mcu
wakes up."

Das interpretiere ich so, dass
1. die Interrupt-Logik zum Aufwecken benutzt wird
2. die IR global freigegeben sein müssen (SEI),
3. der zum Aufwecken benutzte IR freigegeben sein muss.

Wenn man sleep im IR ausführen will, müssen also mindestens die IRs
wieder enabled werden. Allerdings würde ich sleep im IR vermeiden, weil
ich mir vorstellen kann, dass es dabei noch andere unangenehme
Überraschungen geben kann. Beispiel: das Hauptprogramm schreibt gerade
was ins EEPROM, der AD-Wandler wird ausgelesen, etc.

Stefan
Gast
Nicht nur das, in der ISR werden ja auch der Stack, einige Register und
Flags benutzt und gepusht. Da man im allgemeinen die Interrupt Logik
beim AVR nur 1 Level tief benutzt, könnte es nun zu Problemen kommen.
Man müsste dann nämlich ein Multi-Level IRQ System aufbauen, d.h.
Interrupts innerhalb Interrupt-Routinen müssten möglich sein.
Nach obigem Code würde also der Sleep bei einem Wakeup mit der ISR
fortfahren, nachdem die INT0/INT1 ISR ausgeführt wurde.

Ich würde den Sleep Mode nur innerhalb der Main-Loop setzen, abhängig
vom globalen Status des Systemes. Es gibt bei dieser Logik im gesammten
Program nur eine einzigste Stelle in der Mainloop in der SLEEP
aufgerufen wird. Vor dieser Stelle wird der entsprechende Sleep Mode
ausgewählt.

Gruß Hagen

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 22 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.