/******************************************************************************* * Name: powerStandby * Description: Putting microcontroller into power standby state. * * Argument Description * ========= =========== * 1. period Duration of low power mode. Use SLEEP_FOREVER to use other wake * up resource: * (a) SLEEP_15MS - 15 ms sleep * (b) SLEEP_30MS - 30 ms sleep * (c) SLEEP_60MS - 60 ms sleep * (d) SLEEP_120MS - 120 ms sleep * (e) SLEEP_250MS - 250 ms sleep * (f) SLEEP_500MS - 500 ms sleep * (g) SLEEP_1S - 1 s sleep * (h) SLEEP_2S - 2 s sleep * (i) SLEEP_4S - 4 s sleep * (j) SLEEP_8S - 8 s sleep * (k) SLEEP_FOREVER - Sleep without waking up through WDT * * 2. adc ADC module disable control. Turning off the ADC module is * basically removing the purpose of this low power mode. * (a) ADC_OFF - Turn off ADC module * (b) ADC_ON - Leave ADC module in its default state * * 3. bod Brown Out Detector (BOD) module disable control: * (a) BOD_OFF - Turn off BOD module * (b) BOD_ON - Leave BOD module in its default state * *******************************************************************************/ void Low_Power::power_standby(Period_t period, ADC_t adc, BOD_t bod) { if (adc == ADC_OFF) ADCSRA &= ~(1 << ADEN); if (period != SLEEP_FOREVER) { wdt_enable(period); WDTCSR |= (1 << WDIE); } if (bod == BOD_OFF) { #if defined __AVR_ATmega328P__ lowPowerBodOff(SLEEP_MODE_STANDBY); #else lowPowerBodOn(SLEEP_MODE_STANDBY); #endif } else { lowPowerBodOn(SLEEP_MODE_STANDBY); } if (adc == ADC_OFF) ADCSRA |= (1 << ADEN); }
/******************************************************************************* * Name: powerDown * Description: Putting microcontroller into power down state. This is * the lowest current consumption state. Use this together with * external pin interrupt to wake up through external event * triggering (example: RTC clockout pin, SD card detect pin). * * Argument Description * ========= =========== * 1. period Duration of low power mode. Use SLEEP_FOREVER to use other wake * up resource: * (a) SLEEP_15MS - 15 ms sleep * (b) SLEEP_30MS - 30 ms sleep * (c) SLEEP_60MS - 60 ms sleep * (d) SLEEP_120MS - 120 ms sleep * (e) SLEEP_250MS - 250 ms sleep * (f) SLEEP_500MS - 500 ms sleep * (g) SLEEP_1S - 1 s sleep * (h) SLEEP_2S - 2 s sleep * (i) SLEEP_4S - 4 s sleep * (j) SLEEP_8S - 8 s sleep * (k) SLEEP_FOREVER - Sleep without waking up through WDT * * 2. adc ADC module disable control. Turning off the ADC module is * basically removing the purpose of this low power mode. * (a) ADC_OFF - Turn off ADC module * (b) ADC_ON - Leave ADC module in its default state * * 3. bod Brown Out Detector (BOD) module disable control: * (a) BOD_OFF - Turn off BOD module * (b) BOD_ON - Leave BOD module in its default state * *******************************************************************************/ void LowPowerClass::powerDown(period_t period, adc_t adc, bod_t bod) { if (adc == ADC_OFF) ADCSRA &= ~(1 << ADEN); if (period != SLEEP_FOREVER) { wdt_enable(period); #if defined(__AVR_ATtiny85__) WDTCR |= (1 << WDIE); #else WDTCSR |= (1 << WDIE); #endif } if (bod == BOD_OFF) { #if defined __AVR_ATmega328P__ lowPowerBodOff(SLEEP_MODE_PWR_DOWN); #else lowPowerBodOn(SLEEP_MODE_PWR_DOWN); #endif } else { lowPowerBodOn(SLEEP_MODE_PWR_DOWN); } if (adc == ADC_OFF) ADCSRA |= (1 << ADEN); }
/******************************************************************************* * Name: powerSave * Description: Putting microcontroller into power save state. This is * the lowest current consumption state after power down. * Use this state together with an external 32.768 kHz crystal (but * 8/16 MHz crystal/resonator need to be removed) to provide an * asynchronous clock source to Timer 2. Please take note that * Timer 2 is also used by the Arduino core for PWM operation. * Please refer to wiring.c for explanation. Removal of the external * 8/16 MHz crystal/resonator requires the microcontroller to run * on its internal RC oscillator which is not so accurate for time * critical operation. * * Argument Description * ========= =========== * 1. period Duration of low power mode. Use SLEEP_FOREVER to use other wake * up resource: * (a) SLEEP_15MS - 15 ms sleep * (b) SLEEP_30MS - 30 ms sleep * (c) SLEEP_60MS - 60 ms sleep * (d) SLEEP_120MS - 120 ms sleep * (e) SLEEP_250MS - 250 ms sleep * (f) SLEEP_500MS - 500 ms sleep * (g) SLEEP_1S - 1 s sleep * (h) SLEEP_2S - 2 s sleep * (i) SLEEP_4S - 4 s sleep * (j) SLEEP_8S - 8 s sleep * (k) SLEEP_FOREVER - Sleep without waking up through WDT * * 2. adc ADC module disable control. Turning off the ADC module is * basically removing the purpose of this low power mode. * (a) ADC_OFF - Turn off ADC module * (b) ADC_ON - Leave ADC module in its default state * * 3. bod Brown Out Detector (BOD) module disable control: * (a) BOD_OFF - Turn off BOD module * (b) BOD_ON - Leave BOD module in its default state * * 4. timer2 Timer 2 module disable control: * (a) TIMER2_OFF - Turn off Timer 2 module * (b) TIMER2_ON - Leave Timer 2 module in its default state * *******************************************************************************/ void LowPowerClass::powerSave(period_t period, adc_t adc, bod_t bod, timer2_t timer2) { // Temporary clock source variable unsigned char clockSource = 0; #if !defined(__AVR_ATmega32U4__) && !defined(__AVR_ATtiny85__) if (timer2 == TIMER2_OFF) { if (TCCR2B & CS22) clockSource |= (1 << CS22); if (TCCR2B & CS21) clockSource |= (1 << CS21); if (TCCR2B & CS20) clockSource |= (1 << CS20); // Remove the clock source to shutdown Timer2 TCCR2B &= ~(1 << CS22); TCCR2B &= ~(1 << CS21); TCCR2B &= ~(1 << CS20); } #endif if (adc == ADC_OFF) ADCSRA &= ~(1 << ADEN); if (period != SLEEP_FOREVER) { wdt_enable(period); #if defined(__AVR_ATtiny85__) WDTCR |= (1 << WDIE); #else WDTCSR |= (1 << WDIE); #endif } if (bod == BOD_OFF) { #if defined __AVR_ATmega328P__ lowPowerBodOff(SLEEP_MODE_PWR_SAVE); #else lowPowerBodOn(SLEEP_MODE_PWR_SAVE); #endif } else { lowPowerBodOn(SLEEP_MODE_PWR_SAVE); } if (adc == ADC_OFF) ADCSRA |= (1 << ADEN); #if !defined(__AVR_ATmega32U4__) && !defined(__AVR_ATtiny85__) if (timer2 == TIMER2_OFF) { if (clockSource & CS22) TCCR2B |= (1 << CS22); if (clockSource & CS21) TCCR2B |= (1 << CS21); if (clockSource & CS20) TCCR2B |= (1 << CS20); } #endif }
/******************************************************************************* * Name: powerExtStandby * Description: Putting microcontroller into power extended standby state. This * is different from the power standby state as it has the * capability to run Timer 2 asynchronously. * * Argument Description * ========= =========== * 1. period Duration of low power mode. Use SLEEP_FOREVER to use other wake * up resource: * (a) SLEEP_15MS - 15 ms sleep * (b) SLEEP_30MS - 30 ms sleep * (c) SLEEP_60MS - 60 ms sleep * (d) SLEEP_120MS - 120 ms sleep * (e) SLEEP_250MS - 250 ms sleep * (f) SLEEP_500MS - 500 ms sleep * (g) SLEEP_1S - 1 s sleep * (h) SLEEP_2S - 2 s sleep * (i) SLEEP_4S - 4 s sleep * (j) SLEEP_8S - 8 s sleep * (k) SLEEP_FOREVER - Sleep without waking up through WDT * * 2. adc ADC module disable control. * (a) ADC_OFF - Turn off ADC module * (b) ADC_ON - Leave ADC module in its default state * * 3. bod Brown Out Detector (BOD) module disable control: * (a) BOD_OFF - Turn off BOD module * (b) BOD_ON - Leave BOD module in its default state * * 4. timer2 Timer 2 module disable control: * (a) TIMER2_OFF - Turn off Timer 2 module * (b) TIMER2_ON - Leave Timer 2 module in its default state * *******************************************************************************/ void Low_Power::power_ext_standby(Period_t period, ADC_t adc, BOD_t bod, Timer2_t timer2) { // Temporary clock source variable unsigned char clockSource = 0; #if !defined(__AVR_ATmega32U4__) if (timer2 == TIMER2_OFF) { if (TCCR2B & CS22) clockSource |= (1 << CS22); if (TCCR2B & CS21) clockSource |= (1 << CS21); if (TCCR2B & CS20) clockSource |= (1 << CS20); // Remove the clock source to shutdown Timer2 TCCR2B &= ~(1 << CS22); TCCR2B &= ~(1 << CS21); TCCR2B &= ~(1 << CS20); } #endif if (adc == ADC_OFF) ADCSRA &= ~(1 << ADEN); if (period != SLEEP_FOREVER) { wdt_enable(period); WDTCSR |= (1 << WDIE); } if (bod == BOD_OFF) { #if defined __AVR_ATmega328P__ lowPowerBodOff(SLEEP_MODE_EXT_STANDBY); #else lowPowerBodOn(SLEEP_MODE_EXT_STANDBY); #endif } else { lowPowerBodOn(SLEEP_MODE_EXT_STANDBY); } if (adc == ADC_OFF) ADCSRA |= (1 << ADEN); #if !defined(__AVR_ATmega32U4__) if (timer2 == TIMER2_OFF) { if (clockSource & CS22) TCCR2B |= (1 << CS22); if (clockSource & CS21) TCCR2B |= (1 << CS21); if (clockSource & CS20) TCCR2B |= (1 << CS20); } #endif }
/******************************************************************************* * Name: powerSave * Description: Putting microcontroller into power save state. This is * the lowest current consumption state after power down. * Use this state together with an external 32.768 kHz crystal (but * 8/16 MHz crystal/resonator need to be removed) to provide an * asynchronous clock source to Timer 2. Please take note that * Timer 2 is also used by the Arduino core for PWM operation. * Please refer to wiring.c for explanation. Removal of the external * 8/16 MHz crystal/resonator requires the microcontroller to run * on its internal RC oscillator which is not so accurate for time * critical operation. * * Argument Description * ========= =========== * 1. period Duration of low power mode. Use SLEEP_FOREVER to use other wake * up resource: * (a) SLEEP_15MS - 15 ms sleep * (b) SLEEP_30MS - 30 ms sleep * (c) SLEEP_60MS - 60 ms sleep * (d) SLEEP_120MS - 120 ms sleep * (e) SLEEP_250MS - 250 ms sleep * (f) SLEEP_500MS - 500 ms sleep * (g) SLEEP_1S - 1 s sleep * (h) SLEEP_2S - 2 s sleep * (i) SLEEP_4S - 4 s sleep * (j) SLEEP_8S - 8 s sleep * (k) SLEEP_FOREVER - Sleep without waking up through WDT * * 2. adc ADC module disable control. Turning off the ADC module is * basically removing the purpose of this low power mode. * (a) ADC_OFF - Turn off ADC module * (b) ADC_ON - Leave ADC module in its default state * * 3. bod Brown Out Detector (BOD) module disable control: * (a) BOD_OFF - Turn off BOD module * (b) BOD_ON - Leave BOD module in its default state * * 4. timer2 Timer 2 module disable control: * (a) TIMER2_OFF - Turn off Timer 2 module * (b) TIMER2_ON - Leave Timer 2 module in its default state * *******************************************************************************/ void LowPowerClass::powerSave(period_t period, adc_t adc, bod_t bod, timer2_t timer2) { // Temporary clock source variable unsigned char clockSource = 0; if (timer2 == TIMER2_OFF) { if (TCCR2B & CS22) clockSource |= (1 << CS22); if (TCCR2B & CS21) clockSource |= (1 << CS21); if (TCCR2B & CS20) clockSource |= (1 << CS20); // Remove the clock source to shutdown Timer2 TCCR2B &= ~(1 << CS22); TCCR2B &= ~(1 << CS21); TCCR2B &= ~(1 << CS20); } if (adc == ADC_OFF) ADCSRA &= ~(1 << ADEN); if (period != SLEEP_FOREVER) { wdt_enable(period); WDTCSR |= (1 << WDIE); } if (bod == BOD_OFF) { lowPowerBodOff(SLEEP_MODE_PWR_SAVE); } else { lowPowerBodOn(SLEEP_MODE_PWR_SAVE); } if (adc == ADC_OFF) ADCSRA |= (1 << ADEN); if (timer2 == TIMER2_OFF) { if (clockSource & CS22) TCCR2B |= (1 << CS22); if (clockSource & CS21) TCCR2B |= (1 << CS21); if (clockSource & CS20) TCCR2B |= (1 << CS20); } }
/******************************************************************************* * Name: powerDown * Description: Putting microcontroller into power down state. This is * the lowest current consumption state. Use this together with * external pin interrupt to wake up through external event * triggering (example: RTC clockout pin, SD card detect pin). * * Argument Description * ========= =========== * 1. period Duration of low power mode. Use SLEEP_FOREVER to use other wake * up resource: * (a) SLEEP_15MS - 15 ms sleep * (b) SLEEP_30MS - 30 ms sleep * (c) SLEEP_60MS - 60 ms sleep * (d) SLEEP_120MS - 120 ms sleep * (e) SLEEP_250MS - 250 ms sleep * (f) SLEEP_500MS - 500 ms sleep * (g) SLEEP_1S - 1 s sleep * (h) SLEEP_2S - 2 s sleep * (i) SLEEP_4S - 4 s sleep * (j) SLEEP_8S - 8 s sleep * (k) SLEEP_FOREVER - Sleep without waking up through WDT * * 2. adc ADC module disable control. Turning off the ADC module is * basically removing the purpose of this low power mode. * (a) ADC_OFF - Turn off ADC module * (b) ADC_ON - Leave ADC module in its default state * * 3. bod Brown Out Detector (BOD) module disable control: * (a) BOD_OFF - Turn off BOD module * (b) BOD_ON - Leave BOD module in its default state * *******************************************************************************/ void LowPowerClass::powerDown(period_t period, adc_t adc, bod_t bod) { if (adc == ADC_OFF) ADCSRA &= ~(1 << ADEN); if (period != SLEEP_FOREVER) { wdt_enable(period); WDTCSR |= (1 << WDIE); } if (bod == BOD_OFF) { lowPowerBodOff(SLEEP_MODE_PWR_DOWN); } else { lowPowerBodOn(SLEEP_MODE_PWR_DOWN); } if (adc == ADC_OFF) ADCSRA |= (1 << ADEN); }