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(); }
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
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!
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
Ä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
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?
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.