Hallo Forum, um Strom zu sparen möchte ich den AVR über 32kHz betreiben und den Power-Down-Mode verwenden. Ich habe einen 32kHz Quarz angeschlossen und den Timer2 entsprechend konfiguriert. Jede Sekunde wird ein Interrupt ausgelöst, super. In diesem ISR möcht ich dann in den Sleep gehen. Wenn ich Sleep ausführe wacht er nie wieder auf. Wie kann ich dem Controller sagen, dass er durch den Overflow-ISR vom Timer2 wieder aufwachen soll? DANKE
@Max Wau >um Strom zu sparen möchte ich den AVR über 32kHz betreiben und den >Power-Down-Mode verwenden. 32 kHz ist gut, Power-Down ist schlecht. Denn dann ist wirklich ALLES deaktiviert, incl. dem Oszillator. Du musst den Idle-Mode verwenden, dan laufen der Oszillator und die Timer. >Ich habe einen 32kHz Quarz angeschlossen und den Timer2 entsprechend >konfiguriert. Jede Sekunde wird ein Interrupt ausgelöst, super. In >diesem ISR möcht ich dann in den Sleep gehen. Nöö, du solltest in der Hauptschleife in den Sleep gehen (Idle Mode). Wenn dann der Timer klingelt, wird der Interupt ausgeführt, der setzt dann ein Flag für die Hauptschleife,. welche dann entsprechende Aktionen ausführt und sich dann wieder schlafen legt. MfG Falk
Oder Du betreibst den AVR mit dem internen RC-Oszillator und schickst ihn in der Mainloop in den Power-Down-Sleep (Controllertakt und Timer aus). Timer2 klappert aber mit seinem Uhrenquarz weiter und weckt den AVR aus dem Tiefschlaf. Nun kann der AVR (mit internem RC-Oszillator) seine Arbeit tun, bis alle Jobs abgearbeitet sind und fällt dann wieder in den Tiefschlaf, aus dem er von Timer2 geweckt wird. ...
Ich dachte immer nur ein Level_Interrupt kann den Controller aus dem Power-Down holen?
RTFM, funktioniert immer wieder. Power-down Mode When the SM2..0 bits are written to 010, the SLEEP instruction makes the MCU enter Power-down mode. In this mode, the External Oscillator is stopped, while the External interrupts, the Two-wire Serial Interface address watch, and the Watchdog continue operating (if enabled). Only an External Reset, a Watchdog Reset, a Brown-out Reset, a Two-wire Serial Interface address match interrupt, an External level interrupt on INT0 or INT1, or an External interrupt on INT2 can wake up the MCU. This sleep mode basically halts all generated clocks, allowing operation of asynchronous modules only. Power-save Mode When the SM2..0 bits are written to 011, the SLEEP nstruction makes the MCU enter Power-save mode. This mode is identical to Power-down, with one exception: If Timer/Counter2 is clocked asynchronously, i.e., the AS2 bit in ASSR is set, Timer/Counter2 will run during sleep. The device can wake up from either Timer Overflow or Output Compare event from Timer/Counter2 if the corresponding Timer/Counter2 interrupt enable bits are set in TIMSK, and the Global Interrupt Enable bit in SREG is set. MFG Falk
Frank wrote: > Ich dachte immer nur ein Level_Interrupt kann den Controller aus dem > Power-Down holen? Das trifft aber nicht für alle AVRs zu. Beim Mega8 z.B. kann das auch Timer2 im Asyncron-Modus mit Uhrenquarz (siehe Anhang). Da der Fragesteller seinen AVR-Typ nicht genannt hat (oder ich es überlesen habe), kann ich nicht sagen, ob das in seinem Fall geht. Da muss dann schon das betreffende Datenblatt befragt werden. ...
SLEEP in der ISR? Merkwürdig. Braucht man vorher ein SEI (was sonst der RETI erledigt), und den Stackpointer muss man auch von Hand zurücksetzen.
Danke für die super Tips! Natürlich möchte ich ergänzen, dass ich mit dem ATmega8 arbeite und Hannes brachte mir den richtigen Hinweis, DANKE. Die entgültige Version (im Anhang) arbeitet im Power-Save (danke Falk) mit 8MHz internen CLK und im Sleep mit 32kHz extern. Die Daten (AS5030 ist ein Winkelsensor) werden einmal in der Sekunde mit 8MHz gelesen. DANKE an alle!
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.