concept wrote:
> Im aktuellen Datenblatt steht zwar unter 6.1.5
>
> "Both internal RC oscillator and PLL are switched off in power down and
> stand-by sleep modes."
Das ist korrekt...
>
> Aber ich stelle fest, dass die PLL nur im Power-Down ausgeschaltet wird,
> nicht in idle.
Warum sollte er im IDLE deaktiviert werden? Wo steht das? IDLE ist doch
was Anderes als Power-Down oder Standby.
> Sie wird nicht automatisch wieder angeschaltet.
Vermutlich doch, wenn man es richtig macht. Ich vermute mal, dass Du
Dich mit Deinem Konzept festgefahren hast und in einer Sackgasse
steckst.
Ich habe mit dem Sleep und dessen Modi keinerlei Probleme, gehe aber
nach folgendem Konzept vor:
- Jedes Programm hat mindestens einen Timer-Interrupt, in dem Dinge
wie Tastenabfrage erledigt bzw. synchronisiert werden.
- Die Mainloop fällt nach getaner Arbeit grundsätzlich in den Sleep und
wird durch Timer, ADC, UART oder andere Ereignisse geweckt.
- Im Normalfall ist Sleep-Mode Idle vorgewählt, Timer-, ADC- und
I/O-Takt laufen also weiter, nur der MCU-Takt wird eingefroren
- Im Fall der Nichtbedienung läuft ein Count-down ab (es kann auch per
Menüpunkt "aus" ausgelöst werden), der dafür sorgt, dass der externe
Interrupt (zum Wecken aus dem Tiefschlaf) aktiviert wird und der
Sleepmode auf Power-down umgeschaltet wird. Nach Rückkehr des
Programms in die Mainloop wird Sleep aufgerufen, worauf der Power-
down-Mode greift und alle Taktquellen abschaltet. Nun kann nur noch
der ext. Interrupt (Low-Level) bzw. PCI (bei manchen AVRs auch TWI)
den AVR aus dem Tiefschlaf wecken.
- In der ISR des Weck-Interrupts wird sofort der zuständige Interrupt
deaktiviert und der Sleep-Mode auf Idle umgeschaltet. Die ISR wird
beendet, das Programm fällt in die Mainloop, da ist noch nix zu tun,
weil noch keine Semaphores (Jobflags) gesetzt wurden und fällt in den
Sleep. Nun ist aber Sleep-Mode Idle aktiv, worauf alle Takte außer
MCU-Takt aktiv sind und deren Interrupts in der Lage sind, Ereignisse
der Peripherie zu erkennen und der Mainloop (evtl. nach Sichern
flüchtiger Werte) per Semaphores mitzuteilen.
Dieses Verfahren geht natürlich nur, wenn man im AVR keine Uhrzeit
mitführen muss, denn wenn die Timer stehen, können sie keine Zeit
zählen. Es gibt aber auch AVRs mit einem asynchronen Timer, der während
des Tiefschlafs mit einem externen Uhrenquarz klappert und dessen
Interrupt den AVR aus dem Tiefschlaf weckt. Der Tiny45 hat den aber wohl
nicht.
Wenn Du schon beim ultimativen Stromsparen bist, hast Du auch an das
Deaktivieren des AC gedacht (ACD in ACSR setzen)? Zum richtigen
Stromsparen sind die AVRs aber sowiso nicht optimal, da solltest Du auf
MSP430 ausweichen. Den AVRs laufen mit aktiviertem BOD stabiler
(verhindert die Absturz-Probleme in Deinen anderen Threads), BOD kostet
aber Strom. Ich baue z.B. kein AVR-Gerät mehr ohne Batterieschalter.
>
> Leider steht das nirgendwo. Grmbl!
Es kann nicht für jeden Fall eine "Dienstanweisung" geben, man sollte
schon selbst etwas mitdenken und versuchen, die Architektur des
verwendeten MCs zu verstehen.
...