power down mode

Gast #86685
Lesenswert?

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 #86687
Lesenswert?

Ä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 #86690
Lesenswert?

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 #86691
Lesenswert?

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 #86692
Lesenswert?

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

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