10.   Energiehaushalt und Schlafmodi

Die Schlafmodi ermöglichen der Applikation die unbenutzten Module des Mikrocontrollers abzuschalten und dadurch den Stromverbrauch zu senken. Der AVR-Mikrocontroller enthält fünf verschiedene Schlafmodi, um den Erfordernissen an den Stromverbrauch gerecht zu werden.

Wenn aktiviert, bleibt der Unterspannungsdetektor während des Schlafmodus' aktiv. Um die Stromaufnahme im Schlafmodus weiter abzusenken, besteht die Möglichkeit, in einigen Schlafmodi den Unterspannungsdetektor abzuschalten. Siehe unten für Details.

10.1   Schlafmodi

Bild 9-1 zeigt die verschiedenen Taktdomänen des ATmegaX8 und deren Verteilung. Das Bild ist hilfreich, um den passenden Schlafmodus auszuwählen. Tabelle 10-1 zeigt die verschiedenen Schlafmodi, deren Aufwecker und die Möglichkeit, den Unterspannungsdetektor abzuschalten.

Hinweis:
  1. Die Deaktivierung des Unterspannungsdetektors ist nur bei den PicoPower-AVRs möglich, nämlich ATmega48PA, ATmega88PA, ATmega168PA und ATmega32P.
Tablelle 10-1: Aktive Taktdomänen und Aufwecker der verschiedenen Schlafmodi
Aktive Taktdomänen clkXXXOszillatorenAufweckerUn­ter­span­nungs-De­tek­tor ab­schalt­bar?
CPUFLASHIOADCASYHaupt­taktZeit­geberINT1
INT0
Pin-
Pe­gel­wech­sel
TWI
Ad­ress­tref­fer
Zeit­ge­ber 2SPM
EEPROM
be­reit
ADUWatch­dogsons­ti­ge I/O
IdleXXXXX(2)XXXXXXX
ADU-StörreduktionXXXX(2)X(3)XX(2)XXX
Leistung wegX(3)XXja
Leistung sparenXX(2)X(3)XXXja
Standby(1)XX(3)XXja
Erweitertes Standby(1)X(2)XX(2)X(3)XXXja
Hinweise:
  1. Nur empfohlen für externen Quarz oder Keramikresonator als Taktquelle
  2. Falls Zähler/Zeitgeber 2 im asynchronen Betrieb läuft
  3. Für INT1 und INT0: Nur Pegel-Interrupt
Um einen der sechs Schlafmodi zu aktivieren muss das SE-Bit im MCUCR-Register mit einer logischen 1 beschrieben werden und ein SLEEP-Befehl ausgeführt werden. Die Bits SM2, SM1 und SM0 des MCUCR-Registers bestimmen, welcher Schlafmodus (Idle, ADU-Störreduktion, Leistung weg, Leistung sparen, Standby oder Erweitertes Standby) durch den SLEEP-Befehl aktiviert wird. Siehe Tabelle 10-2.

Wenn ein freigegebener Interrupt auftritt, während sich der Controller in einem Schlafmodus befindet, so wacht der Controller wieder auf. Der Controller wird dann für vier Takte und die Hochlaufzeit angehalten und führt anschließend die Interruptroutine aus. Nach dem Abschluss der Interruptroutine wird das Programm mit dem Befehl fortgesetzt, der dem SLEEP-Befehl folgt. Der Inhalt der Register und des SRAM werden durch das Aufwachen nicht verändert. Wenn während eines SLEEP-Modus ein Reset auftritt, wacht der Controller ebenfalls auf und führt das Programm ab dem Reset-Vektor aus.

10.2   BOD-Deaktivierung(1)

Wenn der Unterspannungs-Detektor (= BOD) durch Programmieren der BODLEVEL-Fuses aktiviert ist, siehe Tabelle 28-7 und folgende, ist dieser auch im Schlafmodus aktiv. Um die Stromaufnahme im Schlafmodus weiter abzusenken, besteht die Möglichkeit, in einigen Schlafmodi den Unterspannungsdetektor abzuschalten, siehe Tabelle 10-1 oben. Dann ist die Stromaufnahme im Schlafmodus genauso gering wie ohne programmierten Unterspannungsdetektor. Wenn durch Software kontrolliert, wird der Unterspannungsdetektor automatisch mit dem Eintritt in den Schlafmodus abgeschaltet und beim Verlassen reakitiviert. Dies stellt sicheren Betrieb nach Rückkehr aus dem Schlafmodus sicher, falls inzwischen die Speisespannung zu weit abgesunken ist.

War der Unterspannungsdetektor während des Schlafmodus' abgeschaltet, verlängert sich die Aufweckzeit um weitere ≈60 µs, um den korrekten Betrieb des Unterspannungsdetektors sicherzustellen, bevor Kode ausgeführt wird.

Die BOD-Deaktivierung wird durch das Bit 6, BODS (BOD Sleep) im Steuerregister MCUCR gesteuert, siehe MCUCR — Mikrocontroller-Kontrolle unten. Eine Eins aktiviert das BOD-Deaktivierungs-Feature, eine Null hält den Unterspannungsdetektor aktiv. Vorgabe ist ein permanent aktiver Unterspannungsdetektor, also BODS = 0.

Der Schreibzugriff auf BODS ist nur durch eine zeitbegrenzte Sequenz möglich, siehe unten.

Hinweis:
  1. Die BOD-Deaktivierung ist nur bei den PicoPower-AVRs ATmega48PA, ATmega88PA, ATmega168PA und ATmega32P möglich.

10.3   Idle

Wenn SM[2:0] auf 000 konfiguriert sind, zwingt ein Sleep-Befehl den Controller in den Idle-Mode. Dadurch wird die CPU gestoppt, aber sämtliche Peripherie wie das SPI, die USART, der ADU, der Analogvergleicher, die Zweidraht-Schnittstelle, die Zähler/Zeitgeber, der Watchdog und das Interruptsystem arbeiten weiter. Dieser Sleep-Modus hält lediglich den CPU-Takt clkCPU und den Flash-Takt clkFLASH an, während alle anderen Takte weiter laufen.

Das erlaubt dem Controller sowohl durch externe Ereignisse wie externe Interrupts als auch durch interne Ereignisse wie Zählerüberlauf, USART-Interrupt oder Watchdog wieder erweckt zu werden. Wenn das Aufwecken durch den Analogvergleicher unerwünscht ist, so kann dieser abgeschaltet werden, indem das ACD-Bit im ACSR-Register gesetzt wird. Dadurch kann man weiteren Strom im Idle-Modus sparen. Wenn der ADU freigegeben ist, wird eine Wandlung automatisch gestartet, wenn in den Idle-Modus geschaltet wird.

10.4   ADU-Störreduktion

Wenn SM[2:0] auf 001 konfiguriert sind, zwingt ein Sleep-Befehl den Controller in den ADU-Störreduktions-Modus. Dadurch wird die CPU gestoppt, aber der ADU, der externe Interrupteingang, die TWI-Adressüberwachung, der Zähler/Zeitgeber 2 und der Watchdog arbeiten weiter (wenn sie freigegeben sind). Dieser Sleep-Modus schaltet die Takte clkI/O, clkCPU und clkFLASH ab, während alle anderen Takte weiter laufen.

Das verbessert die Messumgebung des ADU und ermöglicht so Messungen mit höherer Auflösung. Wenn der ADU freigegeben ist, wird durch Einschalten des ADU-Störreduktions-Modus automatisch eine Wandlung gestartet. Abgesehen vom „ADU-fertig-Interrupt können nur ein externer Reset, der Watchdog, ein Unterspannungs-Reset, eine TWI-Adressübereinstimmung, der Zähler/Zeitgeber 2, ein „SPM/EEPROM-fertig“-Interrupt, ein externer Pegel-Interrupt an INT0 oder INT1 oder ein Pegelwechsel-Interrupt den Controller vom ADU-Störreduktions-Modus aufwecken.

10.5   Leistung weg

Wenn SM[2:0] auf 010 konfiguriert sind, zwingt ein Sleep-Befehl den Controller in den Leistung-weg-Modus. In diesem Modus wird der externe Oszillator gestoppt, während die externen Interrupts, die TWI-Adressüberwachung und der Watchdog ihre Arbeit fortsetzen (sofern sie freigegeben sind).

Nur ein externer Reset, der Watchdog, ein Unterspannungs-Reset, eine TWI-Adressübereinstimmung, ein externer Pegel-Interrupt an INT0 oder INT1 oder ein Pegelwechsel-Interrupt können den Controller aus dem Leistung-weg-Modus aufwecken. Dieser Sleep Modus hält alle generierten Takte an, so dass nur noch die asynchronen Module arbeiten.

Hinweis:
  • Wenn der Controller durch einen Pegel-Interrupt geweckt werden soll, muss der entsprechende Zustand an den Pins so lange anliegen, bis der Controller seine Hochlaufzeit hinter sich hat. Verschwindet der Interrupt auslösende Pegel, bevor die Hochlaufzeit abgelaufen ist, wird der Befehl nach SLEEP abgearbeitet, ohne die Interruptroutine ausgeführt zu haben. Siehe Externe Interrupts. Die Hochlaufzeit ist durch die SUT- und CKSEL-Fuses festgelegt, siehe Systemtakt und Takteinstellungen.
  • Beim Aufwachen tritt eine Verzögerung entsprechend den Aufwachkonditionen auf, bis das Aufwachen abgeschlossen ist. In dieser Zeit wird der Takt neu gestartet und stabilisiert sich. Die Aufwachzeit wird mit den gleichen CKSEL-Fuses definiert wie die Hochlaufzeit nach Reset, siehe Taktquellen.

    10.6   Leistung sparen

    Wenn SM[2:0] auf 011 konfiguriert sind, zwingt ein Sleep-Befehl den Controller in den Leistung-spar-Modus. Dieser Modus ist mit einer Ausnahme identisch mit dem Power-down Modus:

    Wenn der Zähler/Zeitgeber 2 asynchron getaktet wird, d.h. das AS2 Bit im ASSR Register ist gesetzt, läuft er auch im Power-save Modus weiter. Der Controller kann also entweder durch einen Zählerüberlauf oder durch einen Output Compare aufgeweckt werden, wenn die entsprechenden Interrupts im TIMSK-Register freigegeben sind und das Globale Interrupt Flag im Statusregister gesetzt ist.

    Wenn der asynchrone Timer nicht läuft, dann ist der Leistung-weg-Modus dem Leistung-spar-Modus vorzuziehen.

    Der Zähler/Zeitgeber 2 kann im Leistung-Spar-Modus synchron oder asynchron getaktet werden. Wenn nicht der asynchrone Takt verwendet wird, wird der Zähler/Zeitgeber 2 bei Sleep automatisch gestoppt. Wenn nicht der synchrone Takt verwendet wird, wird dit Taktquelle bei Sleep angehalten. Selbst wenn der synchrone Takt im Leistung-weg-Modus läuft, ist der Takt nur für Zähler/Zeitgeber 2 verfügbar.

    Was für ein Wirrwarr! Merke: Power-Save wird nur benötigt, wenn Zähler/Zeitgeber 2 — typischerweise mit einem 32768-Hz-Uhrenquarz — als Echtzeituhr verwendet wird, sonst nie.

    10.7   Standby

    Wenn SM[2:0] auf 110 konfiguriert sind und ein Quarz- oder Keramikresonator-Oszillator ausgewählt wurde, zwingt ein Sleep-Befehl den Controller in den Standby-Modus. Dieser Modus ist mit der Ausnahme, dass der Oszillator weiter läuft, identisch mit dem Leistung-weg-Modus. Aus dem Standby-Modus wacht die CPU innerhalb von sechs Taktzyklen auf.
    Der asynchrone Takt für Zähler/Zeitgeber 2 ist abgeschaltet, sodass dieser Modus für den Betrieb jenes Zählers als Echtzeituhr nicht in Frage kommt. Die Hauptanwendung dieses Schlafmodus' dürften kurze Unterbrechungen bei vergleichsweise niedrigen Quarzfrequenzen sein.

    10.8   Erweitertes Standby

    Wenn SM[2:0] auf 111 konfiguriert sind und ein Quarz- oder Keramikresonator-Oszillator ausgewählt wurde, zwingt ein Sleep-Befehl den Controller in den Erweiterten Standby-Modus. Dieser Modus ist mit der Ausnahme, dass der Oszillator weiter läuft, identisch mit dem Leistung-spar-Modus. Aus dem Erweiterten Standby-Modus wacht die CPU innerhalb von sechs Taktzyklen auf.
    Der asynchrone Takt für Zähler/Zeitgeber 2 bleibt laufen, sodass dieser Modus für den Betrieb jenes Zählers als Echtzeituhr das Richtige ist, sonst nicht. Die Hauptanwendung dieses Schlafmodus' dürften kurze Unterbrechungen bei vergleichsweise niedrigen Quarzfrequenzen sein.

    10.9   Das Leistungs-Reduktions-Register

    Das Leistungs-Reduktions-Register PRR bietet die Möglichkeit, einzelne Peripheriebaugruppen von der Taktversorgung abzutrennen und die Stromaufnahme weiter zu reduzieren. Der momentane Zustand des Peripheriemoduls wird eingefroren und die I/O-Register können weder gelesen noch beschrieben werden. Ressourcen, die durch die Baugruppe eingenommen wurden bleiben okkupiert. Daher ist empfohlen, die entsprechende Baugruppe vor dem Abtrennen des Takts zu deaktivieren. Das Wiederanschließen des Takts durch Löschen des zugehörigen Bits im PRR bringt die Baugruppe in den selben Zustand wie vor der Taktabtrennung.

    Taktabtrennung kann im Idle-Modus und aktiven Betrieb die Gesamtstromaufnahme deutlich absenken. In allen übrigen Schlafmodi ist der Takt bereits angehalten.

    10.10   Minimieren des Stromverbrauchs

    Es sind verschiedene Möglichkeiten zu betrachten, wenn der Stromverbrauch im AVR-System gesenkt werden soll. Grundsätzlich können so oft wie möglich die verschiedenen Schlafmodi verwendet werden, wobei diese so ausgewählt werden können, dass so wenig wie möglich Funktionen des Bausteins aktiv sind. D.h. alle Funktionen, die nicht benötigt werden, sollten abgeschaltet werden. Im Einzelfall müssen für nachfolgende Module spezielle Betrachtungen durchgeführt werden, um den geringsten möglichen Stromverbrauch zu erreichen.

    10.10.1   Analog-Digital-Wandler

    Wenn der ADU freigegeben ist, so arbeitet er auch in allen Sleep-Modi. Um den Stromverbrauch zu reduzieren muss der ADU also vor dem Eintritt in einen Sleep-Modus deaktiviert werden. Beim Wiedereinschalten des ADU wird die erste Wandlung eine erweiterte Wandlung sein, so wie es bei Analog-Ditital-Wandler beschrieben wird.

    10.10.2   Analogvergleicher

    Im Idle- und im ADU-Störunterdrückungs-Modus kann der Analogvergleicher abgeschaltet werden, in allen anderen Schlafmodi ist er automatisch abgeschaltet. Wenn die interne Spannungsreferenz für den Analogvergleicher verwendet wird, kann der Analogvergleicher in allen Modi abgeschaltet werden, andernfalls ist die interne Spannungsreferenz in allen Modi aktiviert. Details sind bei Analogvergleicher beschrieben.

    10.10.3   Unterspannungsdetektor

    Wenn der Unterspannungsdetektor in der Schaltung nicht verwendet wird, so kann dieses Modul abgeschaltet werden. Die Freigabe der Unterspannungserkennung geschieht durch Programmieren der BOLEVEL-Fuses, somit ist die Spannungsabfallerkennung in allen Sleep-Modi aktiv, d.h. sie verbraucht permanent Strom. In den unteren Sleep-Modi bedeutet dies, dass ein signifikanter Anteil des gesamten Stromverbrauchs auf die Spannungsabfallerkennung entfällt. Siehe Unterspannungs-Reset.

    10.10.4   Interne Spannungsreferenz

    Die interne Spannungsreferenz kann für die Unterspannungserkennung, den Analogvergleicher und den Analog-Digital-Wandler verwendet werden. Wenn diese Module wie zuvor beschrieben abgeschaltet werden, so kann auch die interne Spannungsreferenz abgeschaltet werden, um den Stromverbrauch weiter zu reduzieren. Beim Wiedereinschalten benötigt die interne Spannungsreferenz eine gewisse Zeit zur Stabilisierung. Bleibt sie während eines Sleep-Modus eingeschaltet, so kann sie nach dem Aufwachen sofort wieder verwendet werden. Siehe Interne Spannungsreferenz unten.

    10.10.5   Watchdog-Zeitgeber

    Wenn der Watchdog in einer Applikation nicht benötigt wird, so sollte der Watchdog abgeschaltet werden. Andernfalls ist der Watchdog Timer auch in allen Sleep-Modi aktiv und verbraucht somit permanent Strom. In den unteren Sleep-Modi kann dies einen großen Anteil des gesamten Stromverbrauchs ausmachen. Siehe Watchdog-Zeitgeber unten.

    10.10.6   Portpins

    Wenn ein Schlafmodus eingeschaltet wird, können alle Port Pins so eingestellt werden, dass sie möglichst wenig Strom verbrauchen. Am wichtigsten dürfte dabei sein, dass die Port Pins keine ohmschen Lasten treiben. In den Schlafmodi, in denen der I/O-Takt cklI/O und der ADU-Takt clkADC angehalten werden, werden auch die Eingangspuffer des Bausteins abgeschaltet. Dadurch ist sichergestellt, dass kein Strom durch die Eingangslogik verbraucht wird, wenn es nicht notwendig ist. In einigen Fällen wird die Eingangslogik aber benötigt, um Aufwachbendingungen zu erkennen und bleibt daher eingeschaltet. Im Punkt „Freigabe digitaler Eingänge und Schlafmodi“ sind weitere Details beschrieben. Wenn der Eingangspuffer freigegeben ist und das Eingangssignal ständig schwankt oder ein Analogsignal mit einer Spannung über UCC/2 ist, dann verbrauchen die digitalen Eingangspuffer sehr viel Strom.

    Für analoge Eingangspins sollten die digitalen Eingangspuffer grundsätzlich abgeschaltet werden. Ein Analogsignal bei ungefähr halber Betriebsspannung berursacht erheblichen Strom sogar im aktiven Betrieb. Digitale Eingangspuffer können durch Beschreiben von DIDR1 und DIDR0 deaktiviert werden.

    10.10.7   Integriertes Debug-System

    Wenn das integrierte Debug-System durch Programmieren der DWEN-Fuse aktiviert wurde und die Software einen Schlafmodus aktiviert, läuft der Haupttakt dennoch weiter und verbraucht Strom. In tieferen Schlafmodi ist dieser Anteil signifikant gegenüber der Gesamtstromaufnahme.

    11   Register-Beschreibung

    11.1   SMCR — Schlafmodus-Kontrolle

    Das Schlafmodus-Kontrollregister enthält Steuerbits für die Leistungsmanagement.

    Bit76543210
    (0x53)----SM2SM1SM0SESMCR
    ZugriffRRRRR/WR/WR/WR/W
    Startwert00000000
    Diese Bits sind ungenutzt und werden immer als 0 gelesen. Mit diesen Bits wird eingestellt, in welchen Schlafmodus geschaltet werden soll.
    Tabelle 10-2: Schlafmodus-Auswahl
    SM2SM1SM0Schlafmodus
    000Idle
    001ADU-Störreduktion
    010Leistung weg
    011Leistung sparen
    100reserviert
    101
    110Standby(1)
    111Erweitertes Standby(1)
    Hinweis:
    1. Standby-Modi sind nur verfügbar, wenn Quarze oder Resonatoren verwendet werden.
    Das SE-Bit muss gesetzt werden, um den Controller in den Schlafmodus zu setzen, wenn der Sleep-Befehl ausgeführt wird. Um zu verhindern, dass der Schlafmodus unkontrolliert eingeschaltet wird, sollte das Bit erst unmittelbar vor dem Sleep-Befehl gesetzt und nach dem Aufwachen gelöscht werden.

    11.2   MCUCR — Mikrocontroller-Kontrolle

    Bit76543210
    (0x55)-BODS(1)BODSE(1)PUD--IVSELIVCEMCUCR
    ZugriffRR/W↓R/WR/WRRR/WR/W
    Startwert00000000
    BODS muss auf 1 gesetzt werden, um den Unterspannungsdetektor während des Schlafmodus' auszuschalten, siehe Tabelle 10-1. Das Schreiben des BODS-Bits ist durch eine zeitbeschränkte Sequenz mit einem Freigabe-Bit, BODSE, eingeschränkt. Um den Unterspannungsdetektor in den relevanten Schlafmodi zu deaktivieren, muss zunächst sowohl BODS als auch BODSE auf 1 gesetzt werden. Dann muss, um BODS zu setzen, BODSE innerhalb von vier Taktzyklen auf 0 gesetzt werden.

    Das BODS-Bit ist drei Taktzyklen nach dem Setzen aktiv. Innerhalb dieser Zeit muss der Sleep-Befehl ausgeführt werden, damit der Unterspannungsdetektor schließlich abgeschaltet wird. BODS löscht sich automatisch nach drei Takten.

    BODSE gibt den Schreibzugriff auf das BODS-Bit frei, wie oben bei BODS angegeben. Die Aktivierung des Unterspannungsdetektor-Schlafs ist durch eine zeitbegrenzte Sequenz auszuführen.
    Hinweis:
    1. BODS und BODSE sind nur bei den PicoPower-AVRs ATmega48PA, ATmega88PA, ATmega168PA und ATmega32P verfügbar.

    11.3   PRR — Leistungs-Reduktion

    Bit76543210
    (0x64)PRTWIPRTIM2PRTIM0-PRTIM1PRSPIPRUSART0PRADCPRR
    ZugriffR/WR/WR/WRR/WR/WR/WR/W
    Startwert00000000
    Eine logische Eins in PRTWI hält die Zweidraht-Schnittstelle an, indem die Taktversorgung abgetrennt wird. Bei Reaktivierung sollte die Schnittstelle für korrekte Funktion reinitialisiert werden. Eine logische Eins in PRTIM2 hält den Zähler/Zeitgeber 2 im synchronen Betrieb (AS = 0) an. Bei Reaktivierung setzt dieser an der Stelle vor dem Anhalten fort. Eine logische Eins in PRTIM0 hält den Zähler/Zeitgeber 0 an. Bei Reaktivierung setzt dieser an der Stelle vor dem Anhalten fort. Dieses Bit sind reserviert und wird stets als 0 gelesen. Eine logische Eins in PRTIM1 hält den Zähler/Zeitgeber 1 an. Bei Reaktivierung setzt dieser an der Stelle vor dem Anhalten fort. Wenn debugWire verwendet wird, sollte dieses Bit nie auf Eins gesetzt werden. Eine logische Eins in PRSPI hält die SPI-Schnittstelle an, indem die Taktversorgung abgetrennt wird. Bei Reaktivierung sollte die Schnittstelle für korrekte Funktion reinitialisiert werden. Eine logische Eins in PRUSART0 hält die serielle Schnittstelle an, indem die Taktversorgung abgetrennt wird. Bei Reaktivierung sollte die Schnittstelle für korrekte Funktion reinitialisiert werden. Eine logische Eins in PRADC hält den A/D-Wandler an. Vorher muss der A/D-Wandler ausgeschaltet sein (ADEN = 0). Der Analogvergleicher kann den Eingangsmultiplexer des A/D-Wandlers nicht verwenden, wenn der A/D-Wandler mit diesem Bit angehalten ist.