<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=213.193.73.110</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=213.193.73.110"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/213.193.73.110"/>
	<updated>2026-04-10T21:47:29Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Power_Management&amp;diff=86031</id>
		<title>AVR-Tutorial: Power Management</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Power_Management&amp;diff=86031"/>
		<updated>2014-12-02T10:46:04Z</updated>

		<summary type="html">&lt;p&gt;213.193.73.110: /* Analog to Digital Converter */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ACHTUNG!&#039;&#039;&#039;&lt;br /&gt;
Dieser Artikel befindet sich noch im Aufbau!&lt;br /&gt;
&lt;br /&gt;
Vorallem in batteriebetriebenen Systemen spielt die Leistungsaufnahme eine wichtige Rolle, d.h. sie soll so niedrig wie möglich gehalten werden um eine lange Laufzeit zu erreichen. Den sparsamen Umgang mit der verfügbaren el. Ladung nennt man &#039;&#039;&#039;Power Management&#039;&#039;&#039; (dt. Energiesparen).&lt;br /&gt;
&lt;br /&gt;
Im Rahmen des Power Managements stehen uns beispielsweise die Sleep-Modi zur Verfügung, mit denen wir bestimmte Module zeitweise deaktivieren können. Andere garnicht genutzte Module können wir durch entsprechende Konfiguration (z.B. in den Fuses) auch komplett deaktivieren.&lt;br /&gt;
&lt;br /&gt;
== Theorie ==&lt;br /&gt;
&lt;br /&gt;
Der Stromverbrauch einer CMOS-Schaltung (was auch Mikrocontroller sind) hängt letztlich nur davon ab, wie viele Gates bei welcher Spannung umgeladen werden. Zur Reduktion steht demnach zur Verfügung:&lt;br /&gt;
* Reduktion der Umladevorgänge pro Sekunde, also Reduktion der Taktfrequenz&lt;br /&gt;
* Reduktion der beteiligten Kapazitäten, also Abschalten nicht benutzter Funktionsblöcke&lt;br /&gt;
* Reduktion der Speisespannung (bei manchen Controllern ist das die &#039;&#039;Kernspannung&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Den statischen Reststrom kann man heutzutage vernachlässigen, auch wenn an dieser Stelle die Anmerkung fallen muss, dass AVRs da eher schlecht abschneiden. Hingegen muss Strom durch ohmsche Lasten, etwa Pull-Up-Widerstände oder LEDs, unbedingt beachtet werden! Außerdem dürfen keine offenen (CMOS!-)Eingänge „herumfliegen“ sondern müssen allesamt an definiertem Potenzial liegen. In der Regel können Mikrocontroller unbenutzte Eingänge im Schlafmodus oder Analogeingangsbetrieb automatisch abtrennen.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich sollte für Stromsparbetrieb die niedrigstmögliche Taktfrequenz gewählt werden, die möglich ist. Übliche Mikrocontroller können direkt von einem Uhrenquarz mit 32,768 kHz gespeist werden. Macht natürlich auch nur maximal 32768 Befehle pro Sekunde. Die Stromaufnahme ist dabei sehr gering und im Gegensatz zu Sleep-Mode-Tricksereien ohne hohe Spitzen.&lt;br /&gt;
&lt;br /&gt;
Da das Antwortverhalten bei derart geringen Taktfrequenzen leidet, wird man eine höhere Frequenz wählen und den Prozessor bei Nicht-Bedarf schlafen schicken. Die Strom-Spitzen sind dementsprechend höher, die Gesamtstromaufnahme bleibt jedoch gering.&lt;br /&gt;
&lt;br /&gt;
Viele Mikrocontroller können einzelne Funktionsblöcke abschalten. Bei den AVRs schlägt da vor allem der 16-Bit-Timer 1 zu Buche. Aber auch die Referenzspannungsquelle für den A/D-Wandler, Analogvergleicher oder den Brown-Out-Detektor kann man abschalten.&lt;br /&gt;
&lt;br /&gt;
Für die Kontrolle der Stromaufnahme aus einer Batterie ist ein Digitalmultimeter mit vielen Strommessbereichen bis 20 µA (Auflösung 10 nA) vorteilhaft. Außerdem ein Plättchen einer doppelseitigen Leiterplatte mit dünnen Drähtchen, das man unter die Batteriekontaktierung schieben kann. Weicht die Stromaufnahme vom Datenblatt ab, hat man wohl noch irgendetwas vergessen.&lt;br /&gt;
&lt;br /&gt;
=== Sleep Modi ===&lt;br /&gt;
&lt;br /&gt;
Welche Sleep-Modi es gibt, hängt vom verwendeten µC ab, dieser Artikel nimmt jedoch Bezug auf den ATmega32. Um einen der verfügbaren Sleep-Modi des ATmega32 zu betreten müssen folgende Schritte ausgeführt werden&lt;br /&gt;
&lt;br /&gt;
# Das SE-Bit im MCUCR-Register wird auf 1 gesetzt&lt;br /&gt;
# Die SMx-Bits im MCUCR-Register je nach gewünschtem Modus setzen&lt;br /&gt;
# Der SLEEP-Befehl wird ausgeführt&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller geht dann sofort in den SLEEP-Modus, d.h. noch vor eventuell anstehenden Interrupts, und wacht erst wieder auf wenn ein Signal eines geeigneten Moduls (je nach Modus) ihn aufweckt.&lt;br /&gt;
&lt;br /&gt;
Die Arbeit wird dann mit der ersten Anweisung hinter dem SLEEP-Befehl wieder aufgenommen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ MCUCR - MCU Control Register&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! Bit&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 7&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 6&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 5&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 4&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 3&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 2&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
| SE&lt;br /&gt;
| SM2&lt;br /&gt;
| SM1&lt;br /&gt;
| SM0&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC11&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC10&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC01&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Bit 7 - SE: Sleep Enable&lt;br /&gt;
:Mit diesem Bit wird bestimmt ob der Sleep-Befehl ausgeführt wird (1) oder nicht (0).&lt;br /&gt;
&lt;br /&gt;
;Bit 6..4 - SM2..0: Sleep Mode Select&lt;br /&gt;
:Mit diesen drei Bits wird der gewünschte Sleep-Modus gewählt&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! SM2&lt;br /&gt;
! SM1&lt;br /&gt;
! SM0&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Sleep Modus&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Idle&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | ADC Noise Reduction&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-down&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-save&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Reserved&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Reserved&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Extended Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt; Nur verfügbar mit externem Taktgeber&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Modi Übersicht====&lt;br /&gt;
&lt;br /&gt;
Generell ist der Modus zu wählen, der die meisten nicht benötigten Module abschaltet.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Aktive Takte &lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Aktive Oszillatoren&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot; | Weckquellen&lt;br /&gt;
|- style=&amp;quot;background-color:#f0f0f0&amp;quot;&lt;br /&gt;
| Sleep Modus&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;CPU&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;FLASH&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;IO&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;ADC&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;ASY&amp;lt;/sub&amp;gt;&lt;br /&gt;
| Haupttaktgeber&lt;br /&gt;
| Timer Oszillator&lt;br /&gt;
| INT2&amp;lt;br /&amp;gt;INT1&amp;lt;br /&amp;gt;INT0&lt;br /&gt;
| TWI Address Match&lt;br /&gt;
| Timer2&lt;br /&gt;
| SPM/EEPROM Ready&lt;br /&gt;
| ADC&lt;br /&gt;
| Andere I/O&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Idle&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | ADC Noise Reduction&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-down&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-save&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Extended Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt; Nur verfügbar bei externer Taktquelle&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt; Wenn AS2-Bit in ASSR-Register gesetzt&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt; Nur INT2 oder Level Interrupt INT1 und INT0&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manuelles Deaktivieren ===&lt;br /&gt;
Einzelne Module können auch manuell deaktviert werden um Strom zu sparen, das bietet sich vorallem an wenn bestimmte Module im gegebenen Projekt generell nicht benötigt werden und damit deaktiviert werden können.&lt;br /&gt;
&lt;br /&gt;
==== Analog to Digital Converter ====&lt;br /&gt;
Der ADC ist standardmäßig aktiviert. Um ihn zu deaktivieren, muss man ADEN (Bit 7) im Register ADCSRA auf Null setzen.&lt;br /&gt;
&lt;br /&gt;
==== Analog Comparator ====&lt;br /&gt;
Der Analogkomparator ist standardmäßig aktiviert. Um ihn zu deaktivieren, muss man ACD (Bit 7) im Register ACSR setzen.&lt;br /&gt;
&lt;br /&gt;
==== Brown-Out Detector ====&lt;br /&gt;
Der Brown-Out Detector lässt sich entweder durch das BODEN-Bit in den Fuses oder mit entsprechenden Befehlen aktivieren oder deaktivieren. Das Fuse-Bit ist standardmäßig gesetzt (Achtung: Umgekehrte Logik!) und der BOD damit deaktiviert.&lt;br /&gt;
&lt;br /&gt;
==== Watchdog ====&lt;br /&gt;
Auch der Watchdog-Timer lässt sich in den Fuses standardmäßig aktivieren/deaktivieren, hier über das WDTON-Bit.&lt;br /&gt;
Natürlich geht auch das softwareseitig [http://www.mikrocontroller.net/articles/AVR-Tutorial:_Watchdog]&lt;br /&gt;
&lt;br /&gt;
== Praxis ==&lt;br /&gt;
&lt;br /&gt;
=== Assembler ===&lt;br /&gt;
Hier mal etwas Code der nicht aufgeräumt ist aber sich gut eignet für Versuche und funktioniert.&lt;br /&gt;
Verbesserungen folgen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
;**********&lt;br /&gt;
;* Dateibeschrieb:&lt;br /&gt;
;* Interrupttest_Eingängexx.ASM&lt;br /&gt;
;* Autor Martin Kuch&lt;br /&gt;
;* V02 23.10.2014 mit Sleep und LED Blink in Go raus aus ISR ST:OK!&lt;br /&gt;
;* V03 23.10.2014 cli und sei in Go - nur 1x Flanke erkennen nach Schlußdelay ST: OK!&lt;br /&gt;
;* V04 23.10.2014 sbic warten bis alle Taster wieder frei sind ST:OK!&lt;br /&gt;
;**********&lt;br /&gt;
;* Funtionen:&lt;br /&gt;
;* 4 Taster an PB0 ... PB3 zur Eingabesteuerung&lt;br /&gt;
;* Interrupt 0B (PinChangeInt)&lt;br /&gt;
;* PB4 LED&lt;br /&gt;
;**********&lt;br /&gt;
;* Hardware Zielschaltung:&lt;br /&gt;
;* Test-Board mit ATTiny2313 PU&lt;br /&gt;
;* Steckernetzgerät Sek: 6VAC 350mA&lt;br /&gt;
;* Netzteil eingenbau: Brückengleichrichter, 330uF, 7805CT, 220uF, 6,8nF 2x, LED + 261R&lt;br /&gt;
;**********&lt;br /&gt;
;* Anschlussschema:&lt;br /&gt;
; ATTiny2313&lt;br /&gt;
; Port Pin - Pin Funktion&lt;br /&gt;
; PB1 12 - Eingang Schalter 1 mit Pullup(+LED) gegen Masse (Set)&lt;br /&gt;
; PB2 13 - Eingang Schalter 2 mit Pullup(+LED) gegen Masse (Back)&lt;br /&gt;
; PB3 14 - Eingang Schalter 3 &amp;quot; (vor)&lt;br /&gt;
; PB4 15 - Eingang Schalter 4 &amp;quot; (zurück)&lt;br /&gt;
; PB0 16 - Ausgang Lüfter Ein, LED mit Widerstand gegen +5VDC (Kathode gegen Ausgang)&lt;br /&gt;
&lt;br /&gt;
;* Controllertyp&lt;br /&gt;
.device ATtiny2313   ;für Gasm   .include Headerdatei für at2313.asm bei Gasm nicht nötig &lt;br /&gt;
;* Definitionen&lt;br /&gt;
.def temp1 = r16 ;Allzweckregister und für LCD_Routines3&lt;br /&gt;
.def temp2 = r17 ;für LCD_Routines&lt;br /&gt;
.def temp3 = r18 ;für LCD_Routines&lt;br /&gt;
.def TM = r19 ;Allzweckregister Programm&lt;br /&gt;
.def TM1 = r20 ;Allzweckregister 2&lt;br /&gt;
.def TMz = r21 ;Zähler allg.&lt;br /&gt;
.def Ct0 = r24 ;Couter Delay Vorgabe, Übergabewert für Zeitschleife&lt;br /&gt;
.def Ct1 = r25 ;Conter Delay intern&lt;br /&gt;
&lt;br /&gt;
;* Flash Programm&lt;br /&gt;
.cseg ;Flash Segment&lt;br /&gt;
; Interrupt-Handler&lt;br /&gt;
.org 0x0000&lt;br /&gt;
rjmp Main	;0x00 Reset&lt;br /&gt;
reti;rjmp SInt	;0x01 INT0 PD2 (6)&lt;br /&gt;
reti;rjmp SInt	;0x02 INT1 PD3 (7)&lt;br /&gt;
reti;rjmp SInt	;0x03 Tim1_Capt&lt;br /&gt;
reti;rjmp SInt	;0x04 Tim1_CompA&lt;br /&gt;
reti;rjmp SInt	;0x05 Tim1_OVF&lt;br /&gt;
reti;rjmp SInt	;0x06 Tim0_OVF&lt;br /&gt;
reti;rjmp SInt	;0x07 Uart0_rxc&lt;br /&gt;
reti;rjmp SInt	;0x08 Uart0_dre&lt;br /&gt;
reti;rjmp SInt	;0x09 Uart0_txc&lt;br /&gt;
reti;rjmp SInt	;0x0A ANA_Comp&lt;br /&gt;
rjmp IntPC	;0x0B PinChangeInt&lt;br /&gt;
reti;rjmp SInt	;0x0C Tim1_CompB&lt;br /&gt;
reti;rjmp SInt	;0x0D Tim0_CompA&lt;br /&gt;
reti;rjmp SInt	;0x0E Tim0_CompB&lt;br /&gt;
reti;rjmp SInt	;0x0F USI_Start&lt;br /&gt;
reti;rjmp SInt	;0x10 USI_OVERFLOW&lt;br /&gt;
reti;rjmp SInt	;0x11 EE_READ&lt;br /&gt;
reti;rjmp SInt	;0x12 WDT_OVERFLOW&lt;br /&gt;
nop&lt;br /&gt;
&lt;br /&gt;
;* Main Programm Endlos Steuerung Taster&lt;br /&gt;
Main:&lt;br /&gt;
;Stack init&lt;br /&gt;
         ldi TM, RAMEND&lt;br /&gt;
         out SPL, TM&lt;br /&gt;
;*Init&lt;br /&gt;
		ldi TM, 0b00010000           ;Port B Bit0...3 =&amp;gt; Eingang B4 =&amp;gt; Ausgang&lt;br /&gt;
		out DDRB, TM&lt;br /&gt;
		nop&lt;br /&gt;
;*Hallo blinken testen, LED-Test und schauen ob uC läuft&lt;br /&gt;
	cbi PortB,4	;LED an&lt;br /&gt;
	ldi Ct0, 100&lt;br /&gt;
	rcall delayms&lt;br /&gt;
	sbi PortB,4	;LED aus&lt;br /&gt;
	rcall delayms&lt;br /&gt;
	ldi Ct0, 255&lt;br /&gt;
&lt;br /&gt;
;*Init Interrupt PCINT&lt;br /&gt;
		ldi TM, 0b00100000	;=32 dez. &lt;br /&gt;
		out MCUCR, TM		;Bit5 = EN enable Sleep&lt;br /&gt;
		out GIMSK, TM		;PCIE PC.Int.Enable&lt;br /&gt;
		ldi TM, 0b00001111&lt;br /&gt;
		out PCMSK, TM		;Maske Int. Pin zulassen&lt;br /&gt;
		sei					;Interrupts zulassen&lt;br /&gt;
Go:&lt;br /&gt;
	sleep		;Schlafen legen = Energiesparen&lt;br /&gt;
	nop&lt;br /&gt;
	cli&lt;br /&gt;
	cbi PortB,4	;LED an&lt;br /&gt;
	rcall delayms&lt;br /&gt;
&lt;br /&gt;
Go_1:&lt;br /&gt;
	sbis PINB,0	;Taste noch gedrückt? = 0 =&amp;gt; warten&lt;br /&gt;
rjmp Go_1&lt;br /&gt;
	sbis PINB,1	;Taste noch gedrückt? = 0 =&amp;gt; warten&lt;br /&gt;
rjmp Go_1&lt;br /&gt;
	sbis PINB,2	;Taste noch gedrückt? = 0 =&amp;gt; warten&lt;br /&gt;
rjmp Go_1&lt;br /&gt;
	sbis PINB,3	;Taste noch gedrückt? = 0 =&amp;gt; warten&lt;br /&gt;
rjmp Go_1&lt;br /&gt;
&lt;br /&gt;
	sbi PortB,4	;LED aus&lt;br /&gt;
;	rcall delayms&lt;br /&gt;
	sei             ;Interrupts einschalten&lt;br /&gt;
rjmp Go&lt;br /&gt;
&lt;br /&gt;
;*ISR für PinChangeInt. (0x0B)&lt;br /&gt;
IntPC:&lt;br /&gt;
;	push TM&lt;br /&gt;
;	in TM, SREG&lt;br /&gt;
	nop&lt;br /&gt;
;	out SREG, TM&lt;br /&gt;
;	pop TM&lt;br /&gt;
reti&lt;br /&gt;
&lt;br /&gt;
; Pause Count * 5ms&lt;br /&gt;
delayms:&lt;br /&gt;
         mov Ct1, Ct0&lt;br /&gt;
delayms_:&lt;br /&gt;
         rcall delay5ms&lt;br /&gt;
         dec Ct1&lt;br /&gt;
         brne delayms_&lt;br /&gt;
         ret&lt;br /&gt;
&lt;br /&gt;
 ; Längere Pause für manche Befehle&lt;br /&gt;
delay5ms:                               ; 5ms Pause&lt;br /&gt;
           Push temp2&lt;br /&gt;
           ldi  temp1, ( XTAL * 5 / 607 ) / 1000&lt;br /&gt;
WGLOOP0:   ldi  temp2, $C9&lt;br /&gt;
WGLOOP1:   dec  temp2&lt;br /&gt;
           brne WGLOOP1&lt;br /&gt;
           dec  temp1&lt;br /&gt;
           brne WGLOOP0&lt;br /&gt;
           pop temp2&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
&lt;br /&gt;
Ein simples Testprogramm, um mit sleep modi im AVR zu spielen. Es funktioniert sehr gut mit dem ATmega8 und ist auch auf andere AVRs portierbar. Teilweise sind weitere Modi verfügbar.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, daß die Interruptroutine für den &amp;quot;Weckruf&amp;quot; vorhanden sein muss. Es müssen nicht zwingend Aktionen in ihr durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* ATmega8 with internal 4Mhz clock (6cycle + 64ms) */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   DDRC |= (1 &amp;lt;&amp;lt; PC2) | (1 &amp;lt;&amp;lt; PC1); // leds for testing&lt;br /&gt;
&lt;br /&gt;
   DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD2); // INT0: input...&lt;br /&gt;
   PORTD |= (1 &amp;lt;&amp;lt; PD2); // ...with pullup.&lt;br /&gt;
&lt;br /&gt;
   // level interrupt INT0 (low level)&lt;br /&gt;
   MCUCR &amp;amp;= ~((1 &amp;lt;&amp;lt; ISC01) | (1 &amp;lt;&amp;lt; ISC00));&lt;br /&gt;
&lt;br /&gt;
   // infinite main loop&lt;br /&gt;
   while (1)&lt;br /&gt;
   {&lt;br /&gt;
      // trigger leds for testing&lt;br /&gt;
      PORTC ^= (1 &amp;lt;&amp;lt; PC1);&lt;br /&gt;
      _delay_ms(500);&lt;br /&gt;
      PORTC ^= (1 &amp;lt;&amp;lt; PC1);&lt;br /&gt;
&lt;br /&gt;
      // enable external interrupt&lt;br /&gt;
      GICR |= (1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
&lt;br /&gt;
      // set sleep mode&lt;br /&gt;
      set_sleep_mode(SLEEP_MODE_PWR_DOWN);&lt;br /&gt;
&lt;br /&gt;
      // sleep_mode() has a possible race condition&lt;br /&gt;
      sleep_enable();&lt;br /&gt;
      sei();&lt;br /&gt;
      sleep_cpu();&lt;br /&gt;
      sleep_disable();&lt;br /&gt;
&lt;br /&gt;
      // waking up...&lt;br /&gt;
      // disable external interrupt here, in case the external low pulse is too long&lt;br /&gt;
      GICR &amp;amp;= ~(1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
&lt;br /&gt;
      // disable all interrupts&lt;br /&gt;
      cli();&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ISR(INT0_vect)&lt;br /&gt;
{&lt;br /&gt;
   // ISR might be empty, but is necessary nonetheless&lt;br /&gt;
   PORTC ^= (1 &amp;lt;&amp;lt; PC2); // debugging&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
[http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf ATMEL AVR ATmega32 Datenblatt]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{{Navigation_zurückhoch|&lt;br /&gt;
zurücktext=Power Management|&lt;br /&gt;
zurücklink=AVR-Tutorial: Power Management|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: AVR-Tutorial|Power Management]]&lt;/div&gt;</summary>
		<author><name>213.193.73.110</name></author>
	</entry>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Power_Management&amp;diff=86030</id>
		<title>AVR-Tutorial: Power Management</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR-Tutorial:_Power_Management&amp;diff=86030"/>
		<updated>2014-12-02T10:45:25Z</updated>

		<summary type="html">&lt;p&gt;213.193.73.110: /* Analog to Digital Converter */ ersetzte &amp;quot;todo&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;ACHTUNG!&#039;&#039;&#039;&lt;br /&gt;
Dieser Artikel befindet sich noch im Aufbau!&lt;br /&gt;
&lt;br /&gt;
Vorallem in batteriebetriebenen Systemen spielt die Leistungsaufnahme eine wichtige Rolle, d.h. sie soll so niedrig wie möglich gehalten werden um eine lange Laufzeit zu erreichen. Den sparsamen Umgang mit der verfügbaren el. Ladung nennt man &#039;&#039;&#039;Power Management&#039;&#039;&#039; (dt. Energiesparen).&lt;br /&gt;
&lt;br /&gt;
Im Rahmen des Power Managements stehen uns beispielsweise die Sleep-Modi zur Verfügung, mit denen wir bestimmte Module zeitweise deaktivieren können. Andere garnicht genutzte Module können wir durch entsprechende Konfiguration (z.B. in den Fuses) auch komplett deaktivieren.&lt;br /&gt;
&lt;br /&gt;
== Theorie ==&lt;br /&gt;
&lt;br /&gt;
Der Stromverbrauch einer CMOS-Schaltung (was auch Mikrocontroller sind) hängt letztlich nur davon ab, wie viele Gates bei welcher Spannung umgeladen werden. Zur Reduktion steht demnach zur Verfügung:&lt;br /&gt;
* Reduktion der Umladevorgänge pro Sekunde, also Reduktion der Taktfrequenz&lt;br /&gt;
* Reduktion der beteiligten Kapazitäten, also Abschalten nicht benutzter Funktionsblöcke&lt;br /&gt;
* Reduktion der Speisespannung (bei manchen Controllern ist das die &#039;&#039;Kernspannung&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
Den statischen Reststrom kann man heutzutage vernachlässigen, auch wenn an dieser Stelle die Anmerkung fallen muss, dass AVRs da eher schlecht abschneiden. Hingegen muss Strom durch ohmsche Lasten, etwa Pull-Up-Widerstände oder LEDs, unbedingt beachtet werden! Außerdem dürfen keine offenen (CMOS!-)Eingänge „herumfliegen“ sondern müssen allesamt an definiertem Potenzial liegen. In der Regel können Mikrocontroller unbenutzte Eingänge im Schlafmodus oder Analogeingangsbetrieb automatisch abtrennen.&lt;br /&gt;
&lt;br /&gt;
Grundsätzlich sollte für Stromsparbetrieb die niedrigstmögliche Taktfrequenz gewählt werden, die möglich ist. Übliche Mikrocontroller können direkt von einem Uhrenquarz mit 32,768 kHz gespeist werden. Macht natürlich auch nur maximal 32768 Befehle pro Sekunde. Die Stromaufnahme ist dabei sehr gering und im Gegensatz zu Sleep-Mode-Tricksereien ohne hohe Spitzen.&lt;br /&gt;
&lt;br /&gt;
Da das Antwortverhalten bei derart geringen Taktfrequenzen leidet, wird man eine höhere Frequenz wählen und den Prozessor bei Nicht-Bedarf schlafen schicken. Die Strom-Spitzen sind dementsprechend höher, die Gesamtstromaufnahme bleibt jedoch gering.&lt;br /&gt;
&lt;br /&gt;
Viele Mikrocontroller können einzelne Funktionsblöcke abschalten. Bei den AVRs schlägt da vor allem der 16-Bit-Timer 1 zu Buche. Aber auch die Referenzspannungsquelle für den A/D-Wandler, Analogvergleicher oder den Brown-Out-Detektor kann man abschalten.&lt;br /&gt;
&lt;br /&gt;
Für die Kontrolle der Stromaufnahme aus einer Batterie ist ein Digitalmultimeter mit vielen Strommessbereichen bis 20 µA (Auflösung 10 nA) vorteilhaft. Außerdem ein Plättchen einer doppelseitigen Leiterplatte mit dünnen Drähtchen, das man unter die Batteriekontaktierung schieben kann. Weicht die Stromaufnahme vom Datenblatt ab, hat man wohl noch irgendetwas vergessen.&lt;br /&gt;
&lt;br /&gt;
=== Sleep Modi ===&lt;br /&gt;
&lt;br /&gt;
Welche Sleep-Modi es gibt, hängt vom verwendeten µC ab, dieser Artikel nimmt jedoch Bezug auf den ATmega32. Um einen der verfügbaren Sleep-Modi des ATmega32 zu betreten müssen folgende Schritte ausgeführt werden&lt;br /&gt;
&lt;br /&gt;
# Das SE-Bit im MCUCR-Register wird auf 1 gesetzt&lt;br /&gt;
# Die SMx-Bits im MCUCR-Register je nach gewünschtem Modus setzen&lt;br /&gt;
# Der SLEEP-Befehl wird ausgeführt&lt;br /&gt;
&lt;br /&gt;
Der Mikrocontroller geht dann sofort in den SLEEP-Modus, d.h. noch vor eventuell anstehenden Interrupts, und wacht erst wieder auf wenn ein Signal eines geeigneten Moduls (je nach Modus) ihn aufweckt.&lt;br /&gt;
&lt;br /&gt;
Die Arbeit wird dann mit der ersten Anweisung hinter dem SLEEP-Befehl wieder aufgenommen.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ MCUCR - MCU Control Register&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! Bit&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 7&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 6&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 5&lt;br /&gt;
| style=&amp;quot;width:12%&amp;quot; | 4&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 3&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 2&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 1&lt;br /&gt;
| style=&amp;quot;width:12%; background-color:#c0c0c0&amp;quot; | 0&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
! Bezeichnung&lt;br /&gt;
| SE&lt;br /&gt;
| SM2&lt;br /&gt;
| SM1&lt;br /&gt;
| SM0&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC11&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC10&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC01&lt;br /&gt;
| style=&amp;quot;background-color:#c0c0c0&amp;quot; | ISC00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
;Bit 7 - SE: Sleep Enable&lt;br /&gt;
:Mit diesem Bit wird bestimmt ob der Sleep-Befehl ausgeführt wird (1) oder nicht (0).&lt;br /&gt;
&lt;br /&gt;
;Bit 6..4 - SM2..0: Sleep Mode Select&lt;br /&gt;
:Mit diesen drei Bits wird der gewünschte Sleep-Modus gewählt&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! SM2&lt;br /&gt;
! SM1&lt;br /&gt;
! SM0&lt;br /&gt;
! style=&amp;quot;text-align:left&amp;quot; | Sleep Modus&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Idle&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | ADC Noise Reduction&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-down&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-save&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Reserved&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Reserved&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 0&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| 1&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Extended Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt; Nur verfügbar mit externem Taktgeber&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Modi Übersicht====&lt;br /&gt;
&lt;br /&gt;
Generell ist der Modus zu wählen, der die meisten nicht benötigten Module abschaltet.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
!&lt;br /&gt;
! colspan=&amp;quot;5&amp;quot; | Aktive Takte &lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; | Aktive Oszillatoren&lt;br /&gt;
! colspan=&amp;quot;6&amp;quot; | Weckquellen&lt;br /&gt;
|- style=&amp;quot;background-color:#f0f0f0&amp;quot;&lt;br /&gt;
| Sleep Modus&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;CPU&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;FLASH&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;IO&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;ADC&amp;lt;/sub&amp;gt;&lt;br /&gt;
| clk&amp;lt;sub&amp;gt;ASY&amp;lt;/sub&amp;gt;&lt;br /&gt;
| Haupttaktgeber&lt;br /&gt;
| Timer Oszillator&lt;br /&gt;
| INT2&amp;lt;br /&amp;gt;INT1&amp;lt;br /&amp;gt;INT0&lt;br /&gt;
| TWI Address Match&lt;br /&gt;
| Timer2&lt;br /&gt;
| SPM/EEPROM Ready&lt;br /&gt;
| ADC&lt;br /&gt;
| Andere I/O&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Idle&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | ADC Noise Reduction&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-down&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Power-save&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|- style=&amp;quot;text-align:center&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left&amp;quot; | Extended Standby&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt;&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| x&lt;br /&gt;
| x&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt;&lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
| &lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;sup&amp;gt;(1)&amp;lt;/sup&amp;gt; Nur verfügbar bei externer Taktquelle&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;(2)&amp;lt;/sup&amp;gt; Wenn AS2-Bit in ASSR-Register gesetzt&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;sup&amp;gt;(3)&amp;lt;/sup&amp;gt; Nur INT2 oder Level Interrupt INT1 und INT0&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Manuelles Deaktivieren ===&lt;br /&gt;
Einzelne Module können auch manuell deaktviert werden um Strom zu sparen, das bietet sich vorallem an wenn bestimmte Module im gegebenen Projekt generell nicht benötigt werden und damit deaktiviert werden können.&lt;br /&gt;
&lt;br /&gt;
==== Analog to Digital Converter ====&lt;br /&gt;
Der ADC ist standardmäßig aktiviert. Um ihn zu deaktivieren, muss man ADEN (Bit 7) im Register ADCSRA setzen.&lt;br /&gt;
&lt;br /&gt;
==== Analog Comparator ====&lt;br /&gt;
Der Analogkomparator ist standardmäßig aktiviert. Um ihn zu deaktivieren, muss man ACD (Bit 7) im Register ACSR setzen.&lt;br /&gt;
&lt;br /&gt;
==== Brown-Out Detector ====&lt;br /&gt;
Der Brown-Out Detector lässt sich entweder durch das BODEN-Bit in den Fuses oder mit entsprechenden Befehlen aktivieren oder deaktivieren. Das Fuse-Bit ist standardmäßig gesetzt (Achtung: Umgekehrte Logik!) und der BOD damit deaktiviert.&lt;br /&gt;
&lt;br /&gt;
==== Watchdog ====&lt;br /&gt;
Auch der Watchdog-Timer lässt sich in den Fuses standardmäßig aktivieren/deaktivieren, hier über das WDTON-Bit.&lt;br /&gt;
Natürlich geht auch das softwareseitig [http://www.mikrocontroller.net/articles/AVR-Tutorial:_Watchdog]&lt;br /&gt;
&lt;br /&gt;
== Praxis ==&lt;br /&gt;
&lt;br /&gt;
=== Assembler ===&lt;br /&gt;
Hier mal etwas Code der nicht aufgeräumt ist aber sich gut eignet für Versuche und funktioniert.&lt;br /&gt;
Verbesserungen folgen.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;asm&amp;quot;&amp;gt;&lt;br /&gt;
;**********&lt;br /&gt;
;* Dateibeschrieb:&lt;br /&gt;
;* Interrupttest_Eingängexx.ASM&lt;br /&gt;
;* Autor Martin Kuch&lt;br /&gt;
;* V02 23.10.2014 mit Sleep und LED Blink in Go raus aus ISR ST:OK!&lt;br /&gt;
;* V03 23.10.2014 cli und sei in Go - nur 1x Flanke erkennen nach Schlußdelay ST: OK!&lt;br /&gt;
;* V04 23.10.2014 sbic warten bis alle Taster wieder frei sind ST:OK!&lt;br /&gt;
;**********&lt;br /&gt;
;* Funtionen:&lt;br /&gt;
;* 4 Taster an PB0 ... PB3 zur Eingabesteuerung&lt;br /&gt;
;* Interrupt 0B (PinChangeInt)&lt;br /&gt;
;* PB4 LED&lt;br /&gt;
;**********&lt;br /&gt;
;* Hardware Zielschaltung:&lt;br /&gt;
;* Test-Board mit ATTiny2313 PU&lt;br /&gt;
;* Steckernetzgerät Sek: 6VAC 350mA&lt;br /&gt;
;* Netzteil eingenbau: Brückengleichrichter, 330uF, 7805CT, 220uF, 6,8nF 2x, LED + 261R&lt;br /&gt;
;**********&lt;br /&gt;
;* Anschlussschema:&lt;br /&gt;
; ATTiny2313&lt;br /&gt;
; Port Pin - Pin Funktion&lt;br /&gt;
; PB1 12 - Eingang Schalter 1 mit Pullup(+LED) gegen Masse (Set)&lt;br /&gt;
; PB2 13 - Eingang Schalter 2 mit Pullup(+LED) gegen Masse (Back)&lt;br /&gt;
; PB3 14 - Eingang Schalter 3 &amp;quot; (vor)&lt;br /&gt;
; PB4 15 - Eingang Schalter 4 &amp;quot; (zurück)&lt;br /&gt;
; PB0 16 - Ausgang Lüfter Ein, LED mit Widerstand gegen +5VDC (Kathode gegen Ausgang)&lt;br /&gt;
&lt;br /&gt;
;* Controllertyp&lt;br /&gt;
.device ATtiny2313   ;für Gasm   .include Headerdatei für at2313.asm bei Gasm nicht nötig &lt;br /&gt;
;* Definitionen&lt;br /&gt;
.def temp1 = r16 ;Allzweckregister und für LCD_Routines3&lt;br /&gt;
.def temp2 = r17 ;für LCD_Routines&lt;br /&gt;
.def temp3 = r18 ;für LCD_Routines&lt;br /&gt;
.def TM = r19 ;Allzweckregister Programm&lt;br /&gt;
.def TM1 = r20 ;Allzweckregister 2&lt;br /&gt;
.def TMz = r21 ;Zähler allg.&lt;br /&gt;
.def Ct0 = r24 ;Couter Delay Vorgabe, Übergabewert für Zeitschleife&lt;br /&gt;
.def Ct1 = r25 ;Conter Delay intern&lt;br /&gt;
&lt;br /&gt;
;* Flash Programm&lt;br /&gt;
.cseg ;Flash Segment&lt;br /&gt;
; Interrupt-Handler&lt;br /&gt;
.org 0x0000&lt;br /&gt;
rjmp Main	;0x00 Reset&lt;br /&gt;
reti;rjmp SInt	;0x01 INT0 PD2 (6)&lt;br /&gt;
reti;rjmp SInt	;0x02 INT1 PD3 (7)&lt;br /&gt;
reti;rjmp SInt	;0x03 Tim1_Capt&lt;br /&gt;
reti;rjmp SInt	;0x04 Tim1_CompA&lt;br /&gt;
reti;rjmp SInt	;0x05 Tim1_OVF&lt;br /&gt;
reti;rjmp SInt	;0x06 Tim0_OVF&lt;br /&gt;
reti;rjmp SInt	;0x07 Uart0_rxc&lt;br /&gt;
reti;rjmp SInt	;0x08 Uart0_dre&lt;br /&gt;
reti;rjmp SInt	;0x09 Uart0_txc&lt;br /&gt;
reti;rjmp SInt	;0x0A ANA_Comp&lt;br /&gt;
rjmp IntPC	;0x0B PinChangeInt&lt;br /&gt;
reti;rjmp SInt	;0x0C Tim1_CompB&lt;br /&gt;
reti;rjmp SInt	;0x0D Tim0_CompA&lt;br /&gt;
reti;rjmp SInt	;0x0E Tim0_CompB&lt;br /&gt;
reti;rjmp SInt	;0x0F USI_Start&lt;br /&gt;
reti;rjmp SInt	;0x10 USI_OVERFLOW&lt;br /&gt;
reti;rjmp SInt	;0x11 EE_READ&lt;br /&gt;
reti;rjmp SInt	;0x12 WDT_OVERFLOW&lt;br /&gt;
nop&lt;br /&gt;
&lt;br /&gt;
;* Main Programm Endlos Steuerung Taster&lt;br /&gt;
Main:&lt;br /&gt;
;Stack init&lt;br /&gt;
         ldi TM, RAMEND&lt;br /&gt;
         out SPL, TM&lt;br /&gt;
;*Init&lt;br /&gt;
		ldi TM, 0b00010000           ;Port B Bit0...3 =&amp;gt; Eingang B4 =&amp;gt; Ausgang&lt;br /&gt;
		out DDRB, TM&lt;br /&gt;
		nop&lt;br /&gt;
;*Hallo blinken testen, LED-Test und schauen ob uC läuft&lt;br /&gt;
	cbi PortB,4	;LED an&lt;br /&gt;
	ldi Ct0, 100&lt;br /&gt;
	rcall delayms&lt;br /&gt;
	sbi PortB,4	;LED aus&lt;br /&gt;
	rcall delayms&lt;br /&gt;
	ldi Ct0, 255&lt;br /&gt;
&lt;br /&gt;
;*Init Interrupt PCINT&lt;br /&gt;
		ldi TM, 0b00100000	;=32 dez. &lt;br /&gt;
		out MCUCR, TM		;Bit5 = EN enable Sleep&lt;br /&gt;
		out GIMSK, TM		;PCIE PC.Int.Enable&lt;br /&gt;
		ldi TM, 0b00001111&lt;br /&gt;
		out PCMSK, TM		;Maske Int. Pin zulassen&lt;br /&gt;
		sei					;Interrupts zulassen&lt;br /&gt;
Go:&lt;br /&gt;
	sleep		;Schlafen legen = Energiesparen&lt;br /&gt;
	nop&lt;br /&gt;
	cli&lt;br /&gt;
	cbi PortB,4	;LED an&lt;br /&gt;
	rcall delayms&lt;br /&gt;
&lt;br /&gt;
Go_1:&lt;br /&gt;
	sbis PINB,0	;Taste noch gedrückt? = 0 =&amp;gt; warten&lt;br /&gt;
rjmp Go_1&lt;br /&gt;
	sbis PINB,1	;Taste noch gedrückt? = 0 =&amp;gt; warten&lt;br /&gt;
rjmp Go_1&lt;br /&gt;
	sbis PINB,2	;Taste noch gedrückt? = 0 =&amp;gt; warten&lt;br /&gt;
rjmp Go_1&lt;br /&gt;
	sbis PINB,3	;Taste noch gedrückt? = 0 =&amp;gt; warten&lt;br /&gt;
rjmp Go_1&lt;br /&gt;
&lt;br /&gt;
	sbi PortB,4	;LED aus&lt;br /&gt;
;	rcall delayms&lt;br /&gt;
	sei             ;Interrupts einschalten&lt;br /&gt;
rjmp Go&lt;br /&gt;
&lt;br /&gt;
;*ISR für PinChangeInt. (0x0B)&lt;br /&gt;
IntPC:&lt;br /&gt;
;	push TM&lt;br /&gt;
;	in TM, SREG&lt;br /&gt;
	nop&lt;br /&gt;
;	out SREG, TM&lt;br /&gt;
;	pop TM&lt;br /&gt;
reti&lt;br /&gt;
&lt;br /&gt;
; Pause Count * 5ms&lt;br /&gt;
delayms:&lt;br /&gt;
         mov Ct1, Ct0&lt;br /&gt;
delayms_:&lt;br /&gt;
         rcall delay5ms&lt;br /&gt;
         dec Ct1&lt;br /&gt;
         brne delayms_&lt;br /&gt;
         ret&lt;br /&gt;
&lt;br /&gt;
 ; Längere Pause für manche Befehle&lt;br /&gt;
delay5ms:                               ; 5ms Pause&lt;br /&gt;
           Push temp2&lt;br /&gt;
           ldi  temp1, ( XTAL * 5 / 607 ) / 1000&lt;br /&gt;
WGLOOP0:   ldi  temp2, $C9&lt;br /&gt;
WGLOOP1:   dec  temp2&lt;br /&gt;
           brne WGLOOP1&lt;br /&gt;
           dec  temp1&lt;br /&gt;
           brne WGLOOP0&lt;br /&gt;
           pop temp2&lt;br /&gt;
           ret                          ; wieder zurück&lt;br /&gt;
&lt;br /&gt;
=== C ===&lt;br /&gt;
&lt;br /&gt;
Ein simples Testprogramm, um mit sleep modi im AVR zu spielen. Es funktioniert sehr gut mit dem ATmega8 und ist auch auf andere AVRs portierbar. Teilweise sind weitere Modi verfügbar.&lt;br /&gt;
&lt;br /&gt;
Wichtig ist, daß die Interruptroutine für den &amp;quot;Weckruf&amp;quot; vorhanden sein muss. Es müssen nicht zwingend Aktionen in ihr durchgeführt werden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/* ATmega8 with internal 4Mhz clock (6cycle + 64ms) */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;avr/io.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/sleep.h&amp;gt;&lt;br /&gt;
#include &amp;lt;avr/interrupt.h&amp;gt;&lt;br /&gt;
#include &amp;lt;util/delay.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main(void)&lt;br /&gt;
{&lt;br /&gt;
   DDRC |= (1 &amp;lt;&amp;lt; PC2) | (1 &amp;lt;&amp;lt; PC1); // leds for testing&lt;br /&gt;
&lt;br /&gt;
   DDRD &amp;amp;= ~(1 &amp;lt;&amp;lt; PD2); // INT0: input...&lt;br /&gt;
   PORTD |= (1 &amp;lt;&amp;lt; PD2); // ...with pullup.&lt;br /&gt;
&lt;br /&gt;
   // level interrupt INT0 (low level)&lt;br /&gt;
   MCUCR &amp;amp;= ~((1 &amp;lt;&amp;lt; ISC01) | (1 &amp;lt;&amp;lt; ISC00));&lt;br /&gt;
&lt;br /&gt;
   // infinite main loop&lt;br /&gt;
   while (1)&lt;br /&gt;
   {&lt;br /&gt;
      // trigger leds for testing&lt;br /&gt;
      PORTC ^= (1 &amp;lt;&amp;lt; PC1);&lt;br /&gt;
      _delay_ms(500);&lt;br /&gt;
      PORTC ^= (1 &amp;lt;&amp;lt; PC1);&lt;br /&gt;
&lt;br /&gt;
      // enable external interrupt&lt;br /&gt;
      GICR |= (1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
&lt;br /&gt;
      // set sleep mode&lt;br /&gt;
      set_sleep_mode(SLEEP_MODE_PWR_DOWN);&lt;br /&gt;
&lt;br /&gt;
      // sleep_mode() has a possible race condition&lt;br /&gt;
      sleep_enable();&lt;br /&gt;
      sei();&lt;br /&gt;
      sleep_cpu();&lt;br /&gt;
      sleep_disable();&lt;br /&gt;
&lt;br /&gt;
      // waking up...&lt;br /&gt;
      // disable external interrupt here, in case the external low pulse is too long&lt;br /&gt;
      GICR &amp;amp;= ~(1 &amp;lt;&amp;lt; INT0);&lt;br /&gt;
&lt;br /&gt;
      // disable all interrupts&lt;br /&gt;
      cli();&lt;br /&gt;
   }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
ISR(INT0_vect)&lt;br /&gt;
{&lt;br /&gt;
   // ISR might be empty, but is necessary nonetheless&lt;br /&gt;
   PORTC ^= (1 &amp;lt;&amp;lt; PC2); // debugging&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Quellen ==&lt;br /&gt;
[http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf ATMEL AVR ATmega32 Datenblatt]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
{{Navigation_zurückhoch|&lt;br /&gt;
zurücktext=Power Management|&lt;br /&gt;
zurücklink=AVR-Tutorial: Power Management|&lt;br /&gt;
hochtext=Inhaltsverzeichnis|&lt;br /&gt;
hochlink=AVR-Tutorial}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie: AVR-Tutorial|Power Management]]&lt;/div&gt;</summary>
		<author><name>213.193.73.110</name></author>
	</entry>
</feed>