Forum: Mikrocontroller und Digitale Elektronik power down mode


von Wolfgang Gigerl (Gast)


Lesenswert?

hallo
wenn ich den ATmega8 von der ISR des output compare interrupt1A in den
Power down modus schalte, funktioniert das reaktivieren des controllers
nicht!!
kann mir jemand erklären warum das so ist?

SIGNAL(SIG_OUTPUT_COMPARE1A)
{

   sleep_mode();

}

von Stefan Kleinwort (Gast)


Lesenswert?

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

von Fritz Ganter (Gast)


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!

von Stefan Kleinwort (Gast)


Lesenswert?

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

von Hagen (Gast)


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

von Wolfgang Gigerl (Gast)


Lesenswert?

Stimmt genau, der AVR wacht nie mehr auf, aber warum genau?
Ist es unmöglich, den AVR über eine ISR in den Sleep Modus zu setzen?

von Stefan Kleinwort (Gast)


Lesenswert?

Nochmal: über welches Signal willst Du aufwecken?

Stefan

von Hagen (Gast)


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

von Stefan Kleinwort (Gast)


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

von Hagen (Gast)


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

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.