erstellt  04.02.2011
Strom sparen - Sleep Modus
Um beim Einsatz von Mikroprozessoren Strom zu sparen , in der Hauptsache wenn man gedenkt die Schaltung mit einer Batterie zu speisen, gibt es einige sehr nützliche
Hilfsmaßnahmen die z. Teil sogar schon vom Prozessor bereitgestellt werden.

Eine der Möglichkeiten beim Atmega 8 und auch beim Atmega 32 , und wohl auch bei einigen anderen ist der sogenannte Sleep-Modus ( Schlaf-Option).
Beim Sleep-Modus hat man die Möglichkeit Teile des Prozessors außer Funktion zu setzen wenn man sie nicht oder momentan nicht benötigt um sie bei Bedarf wieder zu aktivieren.
Der Atmega besteht in seinem Innern aus einer Vielzahl separater Funktionsblöcke, wie z.B. Timer, Schnittstellentreiber , A-D Wandler, Watchdog und vieles mehr.
Wenn z.B.  in der betreffenden Schaltung nicht alle Funktionsblöcke gebraucht werden, lassen sie sich  abschalten und senken so den Stromverbrauch.
Abschalten lassen sich diese Funktionen indem man sich des Register MCUCR bedient.
Ein Register ist ein bestimmter Adressbereich indem  durch eine 8 Bit Zahl einige Funktionen im inneren des Atmega's eingestellt werden können.
Durch folgende Anweisung lässt sich das Register einstellen:
MCUCR=&B00000000  
MCUCR steht für MCUControlRegister
das &B steht für Binärsystem , das heißt die folgende Zahl ist eine Binärzahl, es könnte z.B. auch &H stehen , was dann bedeutet das es sich um eine Hexadezimalzahl handelt.
Die folgenden acht Ziffern sind die 8 Bits mit der sich das Register einstellen lässt, die Zählweise fängt mit dem niedrigen Wert auf der rechten Seite an. Somit ist links der höhere Wert.
Also die ganz rechte Null ist BIT Null, die zweit Null von Rechts ist BIT 1, dann BIT3 Bit4 usw.
Register MCUCR
Die für den Stromsparfunktion notwendigen Einstellungen sind hier in Fetter Schrift dargestellt

BIT 7
BIT 6
BIT 5
BIT 4
BIT 3
BIT 2
BIT 1
BIT 0


SE
SM2
SM1
SM0
ISC11
ISC10
ISC01
ISC00

MCUCR = &B
0
0
0
0
0
0
0
0
Interrupt 0 wird durch Low dauerhaft ausgelöst







0
1
Interrupt 0 wird ausgelöst von H nach L und auch von L nach H Flanke
 






1
0
Interrupt 0 wird ausgelöst von H nach L Flanke







1
1
Interrupt 0 wird ausgelöst von L nach H Flanke





0
0


Interrupt 1 wird durch Low dauerhaft ausgelöst





0
1


Interrupt 1 wird ausgelöst von H nach L und auch von L nach H Flanke





1
0


Interrupt 1 wird ausgelöst von H nach L Flanke





1
1


Interrupt 1 wird ausgelöst von L nach H Flanke


0
0
0




Idle (Ruhemodus) CPU anhalten, alle Schnittstellen bleiben aktiviert


0
0
1




ADC Noise Reduction ( AD Wandler abschalten )


0
1
0




Power Down ( Taktquellen werden abgeschaltet, aufwecken mit Reset Watchdog-Reset, Interrupt )


0
1
1




Power Save( Taktquellen abgeschaltet, Timer 2 aber aktiv,aufwecken durch Timer 2 und wie bei Power Down)


1
1
0




Standby ( Wie Power Down aber Quarz taktet weiterhin)


1
1
1




Erweiterter Standby

1







Sleep Modus aktiviert , damit kann mit der Assembleranweisung !Sleep der Modus aktiviert werden

Der Sleep Modus wird mit der Assembler Instruktion " !Sleep" eingeleitet.
Das Ausrufezeichen gibt dem Compiler an das es sich um einen Assembler Befehl handelt, aufgeweckt wird das Programm auf jeden Fall durch einen Externen Interrupt INT0 oder INT1.
Strom sparen kann man auch durch diverse andere Maßnahmen, so z.B. das man den internen Oszillator und keinen Externen Quarz benutzt, oder indem man die Betriebsspannung möglichst
niedrig hält.
Auch bei niedriger Taktrate verringert sich die Stromaufnahme.
Angeschlossenen Led's sollte man nur möglichst kurz einschalten , es reichen schon Einschalt-Zeiten von ca. 5 Millisekunden. Die Stromaufnahme verringert sich auch wenn man nicht
benötigte Pins als Eingänge Konfiguriert und den PullUp Widerstand einschaltet.

Es gibt Atmega Prozessoren die besonders wenig Strom verbrauchen und mit einer sehr viel geringerer Betriebsspannung arbeiten können, diese Atmega's besitzen zu der
normalen Bezeichnung noch ein nachgestelltes V was auf eine geringen Stromverbrauch hindeutet.

Kleines Testprogramm
Benutzt wird der interne 1 Mhz Takt
Display an folgenden Ports:
Enable = Port C.4
RS     = Port C.5
DB7    = Port C.7
DB6    = Port C.6
DB5    = Port C.3
DB4    = Port C.2

Leds an folgenden Ports
Gelb an A.6
Blau an A.7

Externer Interrupt0  an Input D.2
Programmzeile
$baud = 9600 
$regfile "m32def.dat" 
$crystal = 1000000
$hwstack = 32
$swstack = 10
On Int0 Wecken                                          

Portd = &B00000100                                      
Mcucr = &B10000010
Gicr = &B01000000                                      
Sreg.7 = 1                                            
Ddra = &B11111111                                      
Config Lcd = 16 * 2                                     
Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.6 , Db7 = Portc.7 , Rs = Portc.5 , E = Portc.4
Dim A As Byte
Do

   Do
If A = 20 Then Exit Do
A = A + 1
Porta.6 = 1
Waitms 500
Porta.6 = 0
Loop
!Sleep
Loop
Wecken:
Porta.7 = 1
Wait 1
Porta.7 = 0
A = 0
Return
Funktion
Nach dem Einschalten blinkt die gelbe Led und der Wert der in der Variable A enthalten ist erscheint auf dem Display.
Nach 20 maligem Blinken der gelben Led wird der Atmega in den Schlafmodus versetzt.
Durch einen Externen Interrupt am Anschluss INT0  wird der Prozessor wieder geweckt und die gelbe Led blinkt erneut.
!Sleep ist eine Assembler Instruktion was durch das vorangegangen Ausrufungszeichen verdeutlicht wird Im Schlafzustand bleiben die Inhalte
des SRAM und alle Register erhalten.
Es gibt auch noch den IDLE Modus, auch das ist ein Stromsparmodus bei dem der Systemtakt der CPU abgekoppelt wird , allerdings bleibt der Serielle Port
und die Timer aktiv.
Der Idle Modus wird durch externe Interrupts, ADC,Timer Watchdog oder Reset wieder aufgehoben.

PowerDown: Im Powerdown Modus wird der externe Quarz gestoppt er kann wieder aktiviert werden durch den Watchdog, externen Reset oder externen Interrupt.
Entweder es wird über das Register Mcucr eingegeben oder als Bascom Anweisung "PowerDown".
Powersave -Modus ist nicht in allen Atmegas vorhanden wohl aber im Atmega 8. Als Bascom Anweisung gibt man einfach "Powersave" ein.

aktualisiert am 27.01.2019
Copyright by Manfred Schrod 2009