| Sleep-mode am Beispiel des ATtiny44 |
|
|
EinführungDer sleep mode (Schlafmodus) wird immer dann benötigt, wenn es darum geht den Stromverbrauch eines Mikrocontrollers zu senken. Beispielsweise bei batteriebetriebenen Anwendungen (Fernbedienung etc.) ist dies sehr wichtig. Der sleep mode ist in verschiedenen modis eingeteilt, je nachdem, welche Funktionen deaktiviert sind oder nicht. Beipiel am ATtiny44:Der tiny44 von ATMEL verfügt über drei sleep modes. Dies sind: Idle Stand-by Power-down Im Power-down mode wird beispielsweise am wenigsten Strom verbraucht (ca. 0,3µA). In diesem Modus wird der Oszillator und alle clocks gestoppt. Nur durch einen externen Reset, Watchdog Reset, Brown-out Reset, oder externen Level-Interrupt kann der Mikrocontroller geweckt werden. In jedem Modus sind verschiedene Funktionen deaktiviert. Welche das genau sind, entnehmen Sie dem Datenblatt. Zu beachten ist z.B. dass die CPU nur im idle-mode mit einem Flankeninterrupt (INT0) geweckt werden kann. Im Stand-by bzw. power-down mode kann die CPU nur mit einem Level-Interrupt (INT0) aufgeweckt werden.
Wie wird ein sleep-mode in C programmiert?Hier ein Beispiel in C, wie bei einem tiny44 der sleep mode (hier power-down mode) programmiert wird. Wird ein AD-Wandler im Programm verwendet, muss dieser vor der Aktivierung des sleep-modes deaktiviert werden. In der Interrupt-Service-Routine (ISR0) wird die MCU dann mit einem Level-Interrupt aufgeweckt.
void main(void) MCUCR |= (1<<SE); // Sleep enable //set_sleep_mode(SLEEP_MODE_IDLE); // Sleep Mode "idle" vorbereiten set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Sleep Mode "power down" vorbereiten while(1) { ADCSRA &= !(1<<ADEN); // ADC deaktivieren sleep_mode(); // Start sleep mode } }
ISR(INT0_vect) { MCUCR &= ~(1<<SE); // Sleep disable ADCSRA |= 1<<ADEN; // ADC aktivieren ... ... ... MCUCR |= (1<<SE); // Sleep enable } |