Sleep modes help microcontrollers save power by pausing most activities while keeping essential functions ready.
Sleep modes overview in Embedded C
/* Example to enter sleep mode in embedded C */ #include <avr/sleep.h> void enter_sleep_mode() { set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Choose sleep mode sleep_enable(); // Enable sleep mode sleep_cpu(); // Enter sleep mode sleep_disable(); // Disable sleep after waking up }
set_sleep_mode() selects the type of sleep mode.
sleep_cpu() puts the CPU to sleep until an interrupt wakes it.
set_sleep_mode(SLEEP_MODE_IDLE);
set_sleep_mode(SLEEP_MODE_PWR_SAVE);
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
This program puts the microcontroller into the deepest sleep mode to save power. It wakes up only when an external interrupt (like a button press) happens. After waking, it toggles an LED to show it is awake.
#include <avr/io.h> #include <avr/sleep.h> #include <avr/interrupt.h> // Interrupt service routine for external interrupt INT0 ISR(INT0_vect) { // This will wake the MCU from sleep } int main(void) { // Configure INT0 (external interrupt 0) to trigger on falling edge EICRA |= (1 << ISC01); EICRA &= ~(1 << ISC00); EIMSK |= (1 << INT0); // Enable INT0 interrupt sei(); // Enable global interrupts // Set sleep mode to power down set_sleep_mode(SLEEP_MODE_PWR_DOWN); while (1) { // Prepare to sleep sleep_enable(); sleep_cpu(); // MCU sleeps here until INT0 interrupt sleep_disable(); // After waking up, toggle an LED connected to PORTB0 DDRB |= (1 << PORTB0); // Set PORTB0 as output PORTB ^= (1 << PORTB0); // Toggle LED } return 0; }
Sleep modes vary by microcontroller; check your device datasheet for details.
Interrupts are usually needed to wake the device from sleep.
Always disable sleep after waking to avoid unintended behavior.
Sleep modes reduce power by stopping CPU and peripherals.
Choose sleep mode based on how much power you want to save and what needs to stay active.
Use interrupts to wake the device from sleep safely.
Practice
Solution
Step 1: Understand sleep mode function
Sleep modes reduce power by stopping CPU and peripherals.Step 2: Compare options
Only To save power by stopping the CPU and peripherals matches the purpose of saving power by stopping CPU and peripherals.Final Answer:
To save power by stopping the CPU and peripherals -> Option CQuick Check:
Sleep modes save power = D [OK]
- Thinking sleep mode speeds up the CPU
- Confusing sleep mode with reset
- Assuming sleep mode enables debugging
Solution
Step 1: Recall standard sleep function
The standard function to enter sleep mode issleep_mode();in many embedded C libraries.Step 2: Check other options
Other options likesleep();,enter_sleep();, andgo_to_sleep();are not standard or common function names.Final Answer:
sleep_mode(); -> Option AQuick Check:
Standard sleep function = sleep_mode() [OK]
- Using non-standard function names
- Confusing sleep_mode() with sleep()
- Assuming function names from other languages
set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_enable(); sei(); // enable interrupts sleep_cpu(); // CPU sleeps here // Interrupt wakes CPU sleep_disable();What happens when an interrupt occurs during sleep?
Solution
Step 1: Understand sleep and interrupt behavior
When CPU is in sleep mode, an interrupt wakes it up and execution continues after sleep_disable().Step 2: Analyze options
Only The CPU wakes up and continues execution after sleep_disable() correctly describes waking up and continuing execution. Others describe incorrect behaviors.Final Answer:
The CPU wakes up and continues execution after sleep_disable() -> Option DQuick Check:
Interrupt wakes CPU = C [OK]
- Thinking CPU resets on interrupt
- Assuming CPU stays asleep ignoring interrupts
- Confusing sleep_disable() effect
set_sleep_mode(SLEEP_MODE_IDLE); sleep_enable(); cli(); // disable interrupts sleep_cpu(); sleep_disable();What is the main problem?
Solution
Step 1: Check interrupt status before sleep
Interrupts are disabled withcli();, so no interrupt can wake CPU.Step 2: Understand wake-up mechanism
CPU wakes from sleep only via interrupts; disabling interrupts prevents wake-up.Final Answer:
Interrupts are disabled, so CPU cannot wake up -> Option BQuick Check:
Interrupts disabled = no wake-up [OK]
- Thinking sleep mode IDLE stops CPU
- Believing sleep_disable() controls wake-up
- Ignoring interrupt enable/disable status
Solution
Step 1: Understand power saving vs peripheral activity
SLEEP_MODE_PWR_DOWN saves max power but stops watchdog timer. SLEEP_MODE_STANDBY saves power and keeps watchdog running.Step 2: Compare sleep modes
SLEEP_MODE_IDLE and SLEEP_MODE_ADC keep more peripherals active, so use more power. SLEEP_MODE_STANDBY balances max power saving and watchdog activity.Final Answer:
SLEEP_MODE_STANDBY -> Option AQuick Check:
Max power save + watchdog running = STANDBY [OK]
- Choosing PWR_DOWN which stops watchdog
- Confusing IDLE with max power saving
- Assuming ADC mode saves most power
Ready to prove it?
Pass the test and this pattern moves unknown
