Remove LowPower dependency
This commit is contained in:
@@ -34,26 +34,69 @@ unsigned long MyHwATMega328::millisec() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#define bodOn(mode) \
|
||||||
|
do { \
|
||||||
|
set_sleep_mode(mode); \
|
||||||
|
cli(); \
|
||||||
|
sleep_enable(); \
|
||||||
|
sei(); \
|
||||||
|
sleep_cpu(); \
|
||||||
|
sleep_disable(); \
|
||||||
|
sei(); \
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
#if defined __AVR_ATmega328P__
|
||||||
|
#define bodOff(mode)\
|
||||||
|
do { \
|
||||||
|
set_sleep_mode(mode); \
|
||||||
|
cli(); \
|
||||||
|
sleep_enable(); \
|
||||||
|
sleep_bod_disable(); \
|
||||||
|
sei(); \
|
||||||
|
sleep_cpu(); \
|
||||||
|
sleep_disable(); \
|
||||||
|
sei(); \
|
||||||
|
} while (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void powerDown(period_t period) {
|
||||||
|
|
||||||
|
ADCSRA &= ~(1 << ADEN);
|
||||||
|
|
||||||
|
if (period != SLEEP_FOREVER)
|
||||||
|
{
|
||||||
|
wdt_enable(period);
|
||||||
|
WDTCSR |= (1 << WDIE);
|
||||||
|
}
|
||||||
|
#if defined __AVR_ATmega328P__
|
||||||
|
bodOff(SLEEP_MODE_PWR_DOWN);
|
||||||
|
#else
|
||||||
|
bodOn(SLEEP_MODE_PWR_DOWN);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ADCSRA |= (1 << ADEN);
|
||||||
|
}
|
||||||
|
|
||||||
void MyHwATMega328::sleep(unsigned long ms) {
|
void MyHwATMega328::sleep(unsigned long ms) {
|
||||||
// Let serial prints finish (debug, log etc)
|
// Let serial prints finish (debug, log etc)
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
pinIntTrigger = 0;
|
pinIntTrigger = 0;
|
||||||
while (!pinIntTrigger && ms >= 8000) { LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); ms -= 8000; }
|
while (!pinIntTrigger && ms >= 8000) { powerDown(SLEEP_8S); ms -= 8000; }
|
||||||
if (!pinIntTrigger && ms >= 4000) { LowPower.powerDown(SLEEP_4S, ADC_OFF, BOD_OFF); ms -= 4000; }
|
if (!pinIntTrigger && ms >= 4000) { powerDown(SLEEP_4S); ms -= 4000; }
|
||||||
if (!pinIntTrigger && ms >= 2000) { LowPower.powerDown(SLEEP_2S, ADC_OFF, BOD_OFF); ms -= 2000; }
|
if (!pinIntTrigger && ms >= 2000) { powerDown(SLEEP_2S); ms -= 2000; }
|
||||||
if (!pinIntTrigger && ms >= 1000) { LowPower.powerDown(SLEEP_1S, ADC_OFF, BOD_OFF); ms -= 1000; }
|
if (!pinIntTrigger && ms >= 1000) { powerDown(SLEEP_1S); ms -= 1000; }
|
||||||
if (!pinIntTrigger && ms >= 500) { LowPower.powerDown(SLEEP_500MS, ADC_OFF, BOD_OFF); ms -= 500; }
|
if (!pinIntTrigger && ms >= 500) { powerDown(SLEEP_500MS); ms -= 500; }
|
||||||
if (!pinIntTrigger && ms >= 250) { LowPower.powerDown(SLEEP_250MS, ADC_OFF, BOD_OFF); ms -= 250; }
|
if (!pinIntTrigger && ms >= 250) { powerDown(SLEEP_250MS); ms -= 250; }
|
||||||
if (!pinIntTrigger && ms >= 125) { LowPower.powerDown(SLEEP_120MS, ADC_OFF, BOD_OFF); ms -= 120; }
|
if (!pinIntTrigger && ms >= 125) { powerDown(SLEEP_120MS); ms -= 120; }
|
||||||
if (!pinIntTrigger && ms >= 64) { LowPower.powerDown(SLEEP_60MS, ADC_OFF, BOD_OFF); ms -= 60; }
|
if (!pinIntTrigger && ms >= 64) { powerDown(SLEEP_60MS); ms -= 60; }
|
||||||
if (!pinIntTrigger && ms >= 32) { LowPower.powerDown(SLEEP_30MS, ADC_OFF, BOD_OFF); ms -= 30; }
|
if (!pinIntTrigger && ms >= 32) { powerDown(SLEEP_30MS); ms -= 30; }
|
||||||
if (!pinIntTrigger && ms >= 16) { LowPower.powerDown(SLEEP_15Ms, ADC_OFF, BOD_OFF); ms -= 15; }
|
if (!pinIntTrigger && ms >= 16) { powerDown(SLEEP_15Ms); ms -= 15; }
|
||||||
}
|
}
|
||||||
|
|
||||||
bool MyHwATMega328::sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
|
bool MyHwATMega328::sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
|
||||||
// Let serial prints finish (debug, log etc)
|
// Let serial prints finish (debug, log etc)
|
||||||
bool pinTriggeredWakeup = true;
|
bool pinTriggeredWakeup = true;
|
||||||
Serial.flush();
|
|
||||||
attachInterrupt(interrupt, wakeUp, mode);
|
attachInterrupt(interrupt, wakeUp, mode);
|
||||||
if (ms>0) {
|
if (ms>0) {
|
||||||
pinIntTrigger = 0;
|
pinIntTrigger = 0;
|
||||||
@@ -63,7 +106,7 @@ bool MyHwATMega328::sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
|
powerDown(SLEEP_FOREVER);
|
||||||
}
|
}
|
||||||
detachInterrupt(interrupt);
|
detachInterrupt(interrupt);
|
||||||
return pinTriggeredWakeup;
|
return pinTriggeredWakeup;
|
||||||
@@ -71,7 +114,6 @@ bool MyHwATMega328::sleep(uint8_t interrupt, uint8_t mode, unsigned long ms) {
|
|||||||
|
|
||||||
uint8_t MyHwATMega328::sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) {
|
uint8_t MyHwATMega328::sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) {
|
||||||
int8_t retVal = 1;
|
int8_t retVal = 1;
|
||||||
Serial.flush(); // Let serial prints finish (debug, log etc)
|
|
||||||
attachInterrupt(interrupt1, wakeUp, mode1);
|
attachInterrupt(interrupt1, wakeUp, mode1);
|
||||||
attachInterrupt(interrupt2, wakeUp2, mode2);
|
attachInterrupt(interrupt2, wakeUp2, mode2);
|
||||||
if (ms>0) {
|
if (ms>0) {
|
||||||
@@ -82,7 +124,7 @@ uint8_t MyHwATMega328::sleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrup
|
|||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Serial.flush();
|
Serial.flush();
|
||||||
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
|
powerDown(SLEEP_FOREVER);
|
||||||
}
|
}
|
||||||
detachInterrupt(interrupt1);
|
detachInterrupt(interrupt1);
|
||||||
detachInterrupt(interrupt2);
|
detachInterrupt(interrupt2);
|
||||||
|
|||||||
@@ -5,8 +5,10 @@
|
|||||||
#include "MyMessage.h"
|
#include "MyMessage.h"
|
||||||
#include <avr/eeprom.h>
|
#include <avr/eeprom.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
#include <avr/sleep.h>
|
||||||
|
#include <avr/power.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
#include <avr/wdt.h>
|
#include <avr/wdt.h>
|
||||||
#include "utility/LowPower.h"
|
|
||||||
|
|
||||||
#include "MyHw.h"
|
#include "MyHw.h"
|
||||||
|
|
||||||
@@ -15,6 +17,20 @@
|
|||||||
#include <SPI.h>
|
#include <SPI.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
enum period_t
|
||||||
|
{
|
||||||
|
SLEEP_15Ms,
|
||||||
|
SLEEP_30MS,
|
||||||
|
SLEEP_60MS,
|
||||||
|
SLEEP_120MS,
|
||||||
|
SLEEP_250MS,
|
||||||
|
SLEEP_500MS,
|
||||||
|
SLEEP_1S,
|
||||||
|
SLEEP_2S,
|
||||||
|
SLEEP_4S,
|
||||||
|
SLEEP_8S,
|
||||||
|
SLEEP_FOREVER
|
||||||
|
};
|
||||||
|
|
||||||
class MyHwATMega328 : public MyHw
|
class MyHwATMega328 : public MyHw
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,856 +0,0 @@
|
|||||||
/*******************************************************************************
|
|
||||||
* LowPower Library
|
|
||||||
* Version: 1.30
|
|
||||||
* Date: 22-05-2013
|
|
||||||
* Company: Rocket Scream Electronics
|
|
||||||
* Website: www.rocketscream.com
|
|
||||||
*
|
|
||||||
* This is a lightweight low power library for Arduino. Please check our wiki
|
|
||||||
* (www.rocketscream.com/wiki) for more information on using this piece of
|
|
||||||
* library.
|
|
||||||
*
|
|
||||||
* This library is licensed under Creative Commons Attribution-ShareAlike 3.0
|
|
||||||
* Unported License.
|
|
||||||
*
|
|
||||||
* Revision Description
|
|
||||||
* ======== ===========
|
|
||||||
* 1.30 Added support for ATMega168, ATMega2560, ATMega1280 & ATMega32U4.
|
|
||||||
* Tested to work with Arduino IDE 1.0.1 - 1.0.4.
|
|
||||||
* 1.20 Remove typo error in idle method for checking whether Timer 0 was
|
|
||||||
* turned off.
|
|
||||||
* Remove dependecy on WProgram.h which is not required.
|
|
||||||
* Tested to work with Arduino IDE 1.0.
|
|
||||||
* 1.10 Added #ifndef for sleep_bod_disable() for compatibility with future
|
|
||||||
* Arduino IDE release.
|
|
||||||
* 1.00 Initial public release.
|
|
||||||
*******************************************************************************/
|
|
||||||
#include <avr/sleep.h>
|
|
||||||
#include <avr/wdt.h>
|
|
||||||
#include <avr/power.h>
|
|
||||||
#include <avr/interrupt.h>
|
|
||||||
#include "LowPower.h"
|
|
||||||
|
|
||||||
// Only Pico Power devices can change BOD settings through software
|
|
||||||
#if defined __AVR_ATmega328P__
|
|
||||||
#ifndef sleep_bod_disable
|
|
||||||
#define sleep_bod_disable() \
|
|
||||||
do { \
|
|
||||||
unsigned char tempreg; \
|
|
||||||
__asm__ __volatile__("in %[tempreg], %[mcucr]" "\n\t" \
|
|
||||||
"ori %[tempreg], %[bods_bodse]" "\n\t" \
|
|
||||||
"out %[mcucr], %[tempreg]" "\n\t" \
|
|
||||||
"andi %[tempreg], %[not_bodse]" "\n\t" \
|
|
||||||
"out %[mcucr], %[tempreg]" \
|
|
||||||
: [tempreg] "=&d" (tempreg) \
|
|
||||||
: [mcucr] "I" _SFR_IO_ADDR(MCUCR), \
|
|
||||||
[bods_bodse] "i" (_BV(BODS) | _BV(BODSE)), \
|
|
||||||
[not_bodse] "i" (~_BV(BODSE))); \
|
|
||||||
} while (0)
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define lowPowerBodOn(mode) \
|
|
||||||
do { \
|
|
||||||
set_sleep_mode(mode); \
|
|
||||||
cli(); \
|
|
||||||
sleep_enable(); \
|
|
||||||
sei(); \
|
|
||||||
sleep_cpu(); \
|
|
||||||
sleep_disable(); \
|
|
||||||
sei(); \
|
|
||||||
} while (0);
|
|
||||||
|
|
||||||
// Only Pico Power devices can change BOD settings through software
|
|
||||||
#if defined __AVR_ATmega328P__
|
|
||||||
#define lowPowerBodOff(mode)\
|
|
||||||
do { \
|
|
||||||
set_sleep_mode(mode); \
|
|
||||||
cli(); \
|
|
||||||
sleep_enable(); \
|
|
||||||
sleep_bod_disable(); \
|
|
||||||
sei(); \
|
|
||||||
sleep_cpu(); \
|
|
||||||
sleep_disable(); \
|
|
||||||
sei(); \
|
|
||||||
} while (0);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Some macros is still missing from AVR GCC distribution for ATmega32U4
|
|
||||||
#if defined __AVR_ATmega32U4__
|
|
||||||
// Timer 4 PRR bit is currently not defined in iom32u4.h
|
|
||||||
#ifndef PRTIM4
|
|
||||||
#define PRTIM4 4
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Timer 4 power reduction macro is not defined currently in power.h
|
|
||||||
#ifndef power_timer4_disable
|
|
||||||
#define power_timer4_disable() (PRR1 |= (uint8_t)(1 << PRTIM4))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef power_timer4_enable
|
|
||||||
#define power_timer4_enable() (PRR1 &= (uint8_t)~(1 << PRTIM4))
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Name: idle
|
|
||||||
* Description: Putting ATmega328P/168 into idle state. Please make sure you
|
|
||||||
* understand the implication and result of disabling module.
|
|
||||||
*
|
|
||||||
* 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. 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
|
|
||||||
*
|
|
||||||
* 4. timer1 Timer 1 module disable control:
|
|
||||||
* (a) TIMER1_OFF - Turn off Timer 1 module
|
|
||||||
* (b) TIMER1_ON - Leave Timer 1 module in its default state
|
|
||||||
*
|
|
||||||
* 5. timer0 Timer 0 module disable control:
|
|
||||||
* (a) TIMER0_OFF - Turn off Timer 0 module
|
|
||||||
* (b) TIMER0_ON - Leave Timer 0 module in its default state
|
|
||||||
*
|
|
||||||
* 6. spi SPI module disable control:
|
|
||||||
* (a) SPI_OFF - Turn off SPI module
|
|
||||||
* (b) SPI_ON - Leave SPI module in its default state
|
|
||||||
*
|
|
||||||
* 7. usart0 USART0 module disable control:
|
|
||||||
* (a) USART0_OFF - Turn off USART0 module
|
|
||||||
* (b) USART0_ON - Leave USART0 module in its default state
|
|
||||||
*
|
|
||||||
* 8. twi TWI module disable control:
|
|
||||||
* (a) TWI_OFF - Turn off TWI module
|
|
||||||
* (b) TWI_ON - Leave TWI module in its default state
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
#if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega168__)
|
|
||||||
void LowPowerClass::idle(period_t period, adc_t adc, timer2_t timer2,
|
|
||||||
timer1_t timer1, timer0_t timer0,
|
|
||||||
spi_t spi, usart0_t usart0, twi_t twi)
|
|
||||||
{
|
|
||||||
// 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);
|
|
||||||
|
|
||||||
power_timer2_disable();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (adc == ADC_OFF)
|
|
||||||
{
|
|
||||||
ADCSRA &= ~(1 << ADEN);
|
|
||||||
power_adc_disable();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timer1 == TIMER1_OFF) power_timer1_disable();
|
|
||||||
if (timer0 == TIMER0_OFF) power_timer0_disable();
|
|
||||||
if (spi == SPI_OFF) power_spi_disable();
|
|
||||||
if (usart0 == USART0_OFF) power_usart0_disable();
|
|
||||||
if (twi == TWI_OFF) power_twi_disable();
|
|
||||||
|
|
||||||
if (period != SLEEP_FOREVER)
|
|
||||||
{
|
|
||||||
wdt_enable(period);
|
|
||||||
WDTCSR |= (1 << WDIE);
|
|
||||||
}
|
|
||||||
|
|
||||||
lowPowerBodOn(SLEEP_MODE_IDLE);
|
|
||||||
|
|
||||||
if (adc == ADC_OFF)
|
|
||||||
{
|
|
||||||
power_adc_enable();
|
|
||||||
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);
|
|
||||||
|
|
||||||
power_timer2_enable();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timer1 == TIMER1_OFF) power_timer1_enable();
|
|
||||||
if (timer0 == TIMER0_OFF) power_timer0_enable();
|
|
||||||
if (spi == SPI_OFF) power_spi_enable();
|
|
||||||
if (usart0 == USART0_OFF) power_usart0_enable();
|
|
||||||
if (twi == TWI_OFF) power_twi_enable();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Name: idle
|
|
||||||
* Description: Putting ATmega32U4 into idle state. Please make sure you
|
|
||||||
* understand the implication and result of disabling module.
|
|
||||||
* Take note that Timer 2 is not available and USART0
|
|
||||||
* is replaced with USART1 on ATmega32U4.
|
|
||||||
*
|
|
||||||
* 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. timer4 Timer 4 module disable control:
|
|
||||||
* (a) TIMER4_OFF - Turn off Timer 4 module
|
|
||||||
* (b) TIMER4_ON - Leave Timer 4 module in its default state
|
|
||||||
*
|
|
||||||
* 4. timer3 Timer 3 module disable control:
|
|
||||||
* (a) TIMER3_OFF - Turn off Timer 3 module
|
|
||||||
* (b) TIMER3_ON - Leave Timer 3 module in its default state
|
|
||||||
*
|
|
||||||
* 5. timer1 Timer 1 module disable control:
|
|
||||||
* (a) TIMER1_OFF - Turn off Timer 1 module
|
|
||||||
* (b) TIMER1_ON - Leave Timer 1 module in its default state
|
|
||||||
*
|
|
||||||
* 6. timer0 Timer 0 module disable control:
|
|
||||||
* (a) TIMER0_OFF - Turn off Timer 0 module
|
|
||||||
* (b) TIMER0_ON - Leave Timer 0 module in its default state
|
|
||||||
*
|
|
||||||
* 7. spi SPI module disable control:
|
|
||||||
* (a) SPI_OFF - Turn off SPI module
|
|
||||||
* (b) SPI_ON - Leave SPI module in its default state
|
|
||||||
*
|
|
||||||
* 8. usart1 USART1 module disable control:
|
|
||||||
* (a) USART1_OFF - Turn off USART1 module
|
|
||||||
* (b) USART1_ON - Leave USART1 module in its default state
|
|
||||||
*
|
|
||||||
* 9. twi TWI module disable control:
|
|
||||||
* (a) TWI_OFF - Turn off TWI module
|
|
||||||
* (b) TWI_ON - Leave TWI module in its default state
|
|
||||||
*
|
|
||||||
* 10.usb USB module disable control:
|
|
||||||
* (a) USB_OFF - Turn off USB module
|
|
||||||
* (b) USB_ON - Leave USB module in its default state
|
|
||||||
*******************************************************************************/
|
|
||||||
#if defined __AVR_ATmega32U4__
|
|
||||||
void LowPowerClass::idle(period_t period, adc_t adc,
|
|
||||||
timer4_t timer4, timer3_t timer3,
|
|
||||||
timer1_t timer1, timer0_t timer0,
|
|
||||||
spi_t spi, usart1_t usart1, twi_t twi, usb_t usb)
|
|
||||||
{
|
|
||||||
if (adc == ADC_OFF)
|
|
||||||
{
|
|
||||||
ADCSRA &= ~(1 << ADEN);
|
|
||||||
power_adc_disable();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timer4 == TIMER4_OFF) power_timer4_disable();
|
|
||||||
if (timer3 == TIMER3_OFF) power_timer3_disable();
|
|
||||||
if (timer1 == TIMER1_OFF) power_timer1_disable();
|
|
||||||
if (timer0 == TIMER0_OFF) power_timer0_disable();
|
|
||||||
if (spi == SPI_OFF) power_spi_disable();
|
|
||||||
if (usart1 == USART1_OFF) power_usart1_disable();
|
|
||||||
if (twi == TWI_OFF) power_twi_disable();
|
|
||||||
if (usb == USB_OFF) power_usb_disable();
|
|
||||||
|
|
||||||
if (period != SLEEP_FOREVER)
|
|
||||||
{
|
|
||||||
wdt_enable(period);
|
|
||||||
WDTCSR |= (1 << WDIE);
|
|
||||||
}
|
|
||||||
|
|
||||||
lowPowerBodOn(SLEEP_MODE_IDLE);
|
|
||||||
|
|
||||||
if (adc == ADC_OFF)
|
|
||||||
{
|
|
||||||
power_adc_enable();
|
|
||||||
ADCSRA |= (1 << ADEN);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timer4 == TIMER4_OFF) power_timer4_enable();
|
|
||||||
if (timer3 == TIMER3_OFF) power_timer3_enable();
|
|
||||||
if (timer1 == TIMER1_OFF) power_timer1_enable();
|
|
||||||
if (timer0 == TIMER0_OFF) power_timer0_enable();
|
|
||||||
if (spi == SPI_OFF) power_spi_enable();
|
|
||||||
if (usart1 == USART1_OFF) power_usart1_enable();
|
|
||||||
if (twi == TWI_OFF) power_twi_enable();
|
|
||||||
if (usb == USB_OFF) power_usb_enable();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Name: idle
|
|
||||||
* Description: Putting ATmega2560 & ATmega1280 into idle state. Please make sure
|
|
||||||
* you understand the implication and result of disabling module.
|
|
||||||
* Take note that extra Timer 5, 4, 3 compared to an ATmega328P/168.
|
|
||||||
* Also take note that extra USART 3, 2, 1 compared to an
|
|
||||||
* ATmega328P/168.
|
|
||||||
*
|
|
||||||
* 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. timer5 Timer 5 module disable control:
|
|
||||||
* (a) TIMER5_OFF - Turn off Timer 5 module
|
|
||||||
* (b) TIMER5_ON - Leave Timer 5 module in its default state
|
|
||||||
*
|
|
||||||
* 4. timer4 Timer 4 module disable control:
|
|
||||||
* (a) TIMER4_OFF - Turn off Timer 4 module
|
|
||||||
* (b) TIMER4_ON - Leave Timer 4 module in its default state
|
|
||||||
*
|
|
||||||
* 5. timer3 Timer 3 module disable control:
|
|
||||||
* (a) TIMER3_OFF - Turn off Timer 3 module
|
|
||||||
* (b) TIMER3_ON - Leave Timer 3 module in its default state
|
|
||||||
*
|
|
||||||
* 6. 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
|
|
||||||
*
|
|
||||||
* 7. timer1 Timer 1 module disable control:
|
|
||||||
* (a) TIMER1_OFF - Turn off Timer 1 module
|
|
||||||
* (b) TIMER1_ON - Leave Timer 1 module in its default state
|
|
||||||
*
|
|
||||||
* 8. timer0 Timer 0 module disable control:
|
|
||||||
* (a) TIMER0_OFF - Turn off Timer 0 module
|
|
||||||
* (b) TIMER0_ON - Leave Timer 0 module in its default state
|
|
||||||
*
|
|
||||||
* 9. spi SPI module disable control:
|
|
||||||
* (a) SPI_OFF - Turn off SPI module
|
|
||||||
* (b) SPI_ON - Leave SPI module in its default state
|
|
||||||
*
|
|
||||||
* 10.usart3 USART3 module disable control:
|
|
||||||
* (a) USART3_OFF - Turn off USART3 module
|
|
||||||
* (b) USART3_ON - Leave USART3 module in its default state
|
|
||||||
*
|
|
||||||
* 11.usart2 USART2 module disable control:
|
|
||||||
* (a) USART2_OFF - Turn off USART2 module
|
|
||||||
* (b) USART2_ON - Leave USART2 module in its default state
|
|
||||||
*
|
|
||||||
* 12.usart1 USART1 module disable control:
|
|
||||||
* (a) USART1_OFF - Turn off USART1 module
|
|
||||||
* (b) USART1_ON - Leave USART1 module in its default state
|
|
||||||
*
|
|
||||||
* 13.usart0 USART0 module disable control:
|
|
||||||
* (a) USART0_OFF - Turn off USART0 module
|
|
||||||
* (b) USART0_ON - Leave USART0 module in its default state
|
|
||||||
*
|
|
||||||
* 14.twi TWI module disable control:
|
|
||||||
* (a) TWI_OFF - Turn off TWI module
|
|
||||||
* (b) TWI_ON - Leave TWI module in its default state
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
#if defined (__AVR_ATmega2560__) || defined (__AVR_ATmega1280__)
|
|
||||||
void LowPowerClass::idle(period_t period, adc_t adc, timer5_t timer5,
|
|
||||||
timer4_t timer4, timer3_t timer3, timer2_t timer2,
|
|
||||||
timer1_t timer1, timer0_t timer0, spi_t spi,
|
|
||||||
usart3_t usart3, usart2_t usart2, usart1_t usart1,
|
|
||||||
usart0_t usart0, twi_t twi)
|
|
||||||
{
|
|
||||||
// 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);
|
|
||||||
|
|
||||||
power_timer2_disable();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (adc == ADC_OFF)
|
|
||||||
{
|
|
||||||
ADCSRA &= ~(1 << ADEN);
|
|
||||||
power_adc_disable();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timer5 == TIMER5_OFF) power_timer5_disable();
|
|
||||||
if (timer4 == TIMER4_OFF) power_timer4_disable();
|
|
||||||
if (timer3 == TIMER3_OFF) power_timer3_disable();
|
|
||||||
if (timer1 == TIMER1_OFF) power_timer1_disable();
|
|
||||||
if (timer0 == TIMER0_OFF) power_timer0_disable();
|
|
||||||
if (spi == SPI_OFF) power_spi_disable();
|
|
||||||
if (usart3 == USART3_OFF) power_usart3_disable();
|
|
||||||
if (usart2 == USART2_OFF) power_usart2_disable();
|
|
||||||
if (usart1 == USART1_OFF) power_usart1_disable();
|
|
||||||
if (usart0 == USART0_OFF) power_usart0_disable();
|
|
||||||
if (twi == TWI_OFF) power_twi_disable();
|
|
||||||
|
|
||||||
if (period != SLEEP_FOREVER)
|
|
||||||
{
|
|
||||||
wdt_enable(period);
|
|
||||||
WDTCSR |= (1 << WDIE);
|
|
||||||
}
|
|
||||||
|
|
||||||
lowPowerBodOn(SLEEP_MODE_IDLE);
|
|
||||||
|
|
||||||
if (adc == ADC_OFF)
|
|
||||||
{
|
|
||||||
power_adc_enable();
|
|
||||||
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);
|
|
||||||
|
|
||||||
power_timer2_enable();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (timer5 == TIMER5_OFF) power_timer5_enable();
|
|
||||||
if (timer4 == TIMER4_OFF) power_timer4_enable();
|
|
||||||
if (timer3 == TIMER3_OFF) power_timer3_enable();
|
|
||||||
if (timer1 == TIMER1_OFF) power_timer1_enable();
|
|
||||||
if (timer0 == TIMER0_OFF) power_timer0_enable();
|
|
||||||
if (spi == SPI_OFF) power_spi_enable();
|
|
||||||
if (usart3 == USART3_OFF) power_usart3_enable();
|
|
||||||
if (usart2 == USART2_OFF) power_usart2_enable();
|
|
||||||
if (usart1 == USART1_OFF) power_usart1_enable();
|
|
||||||
if (usart0 == USART0_OFF) power_usart0_enable();
|
|
||||||
if (twi == TWI_OFF) power_twi_enable();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* Name: adcNoiseReduction
|
|
||||||
* Description: Putting microcontroller into ADC noise reduction state. This is
|
|
||||||
* a very useful state when using the ADC to achieve best and low
|
|
||||||
* noise signal.
|
|
||||||
*
|
|
||||||
* 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. 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::adcNoiseReduction(period_t period, adc_t adc,
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
lowPowerBodOn(SLEEP_MODE_ADC);
|
|
||||||
|
|
||||||
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: 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)
|
|
||||||
{
|
|
||||||
#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__)
|
|
||||||
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_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__)
|
|
||||||
if (timer2 == TIMER2_OFF)
|
|
||||||
{
|
|
||||||
if (clockSource & CS22) TCCR2B |= (1 << CS22);
|
|
||||||
if (clockSource & CS21) TCCR2B |= (1 << CS21);
|
|
||||||
if (clockSource & CS20) TCCR2B |= (1 << CS20);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/*******************************************************************************
|
|
||||||
* 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 LowPowerClass::powerStandby(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: 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 LowPowerClass::powerExtStandby(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: ISR (WDT_vect)
|
|
||||||
* Description: Watchdog Timer interrupt service routine. This routine is
|
|
||||||
* required to allow automatic WDIF and WDIE bit clearance in
|
|
||||||
* hardware.
|
|
||||||
*
|
|
||||||
*******************************************************************************/
|
|
||||||
ISR (WDT_vect)
|
|
||||||
{
|
|
||||||
// WDIE & WDIF is cleared in hardware upon entering this ISR
|
|
||||||
wdt_disable();
|
|
||||||
}
|
|
||||||
|
|
||||||
LowPowerClass LowPower;
|
|
||||||
@@ -1,137 +0,0 @@
|
|||||||
#ifndef LowPower_h
|
|
||||||
#define LowPower_h
|
|
||||||
|
|
||||||
enum period_t
|
|
||||||
{
|
|
||||||
SLEEP_15Ms,
|
|
||||||
SLEEP_30MS,
|
|
||||||
SLEEP_60MS,
|
|
||||||
SLEEP_120MS,
|
|
||||||
SLEEP_250MS,
|
|
||||||
SLEEP_500MS,
|
|
||||||
SLEEP_1S,
|
|
||||||
SLEEP_2S,
|
|
||||||
SLEEP_4S,
|
|
||||||
SLEEP_8S,
|
|
||||||
SLEEP_FOREVER
|
|
||||||
};
|
|
||||||
|
|
||||||
enum bod_t
|
|
||||||
{
|
|
||||||
BOD_OFF,
|
|
||||||
BOD_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
enum adc_t
|
|
||||||
{
|
|
||||||
ADC_OFF,
|
|
||||||
ADC_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
enum timer5_t
|
|
||||||
{
|
|
||||||
TIMER5_OFF,
|
|
||||||
TIMER5_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
enum timer4_t
|
|
||||||
{
|
|
||||||
TIMER4_OFF,
|
|
||||||
TIMER4_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
enum timer3_t
|
|
||||||
{
|
|
||||||
TIMER3_OFF,
|
|
||||||
TIMER3_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
enum timer2_t
|
|
||||||
{
|
|
||||||
TIMER2_OFF,
|
|
||||||
TIMER2_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
enum timer1_t
|
|
||||||
{
|
|
||||||
TIMER1_OFF,
|
|
||||||
TIMER1_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
enum timer0_t
|
|
||||||
{
|
|
||||||
TIMER0_OFF,
|
|
||||||
TIMER0_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
enum spi_t
|
|
||||||
{
|
|
||||||
SPI_OFF,
|
|
||||||
SPI_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
enum usart0_t
|
|
||||||
{
|
|
||||||
USART0_OFF,
|
|
||||||
USART0_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
enum usart1_t
|
|
||||||
{
|
|
||||||
USART1_OFF,
|
|
||||||
USART1_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
enum usart2_t
|
|
||||||
{
|
|
||||||
USART2_OFF,
|
|
||||||
USART2_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
enum usart3_t
|
|
||||||
{
|
|
||||||
USART3_OFF,
|
|
||||||
USART3_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
enum twi_t
|
|
||||||
{
|
|
||||||
TWI_OFF,
|
|
||||||
TWI_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
enum usb_t
|
|
||||||
{
|
|
||||||
USB_OFF,
|
|
||||||
USB_ON
|
|
||||||
};
|
|
||||||
|
|
||||||
class LowPowerClass
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
#if defined (__AVR_ATmega328P__) || defined (__AVR_ATmega168__)
|
|
||||||
void idle(period_t period, adc_t adc, timer2_t timer2,
|
|
||||||
timer1_t timer1, timer0_t timer0, spi_t spi,
|
|
||||||
usart0_t usart0, twi_t twi);
|
|
||||||
#elif defined __AVR_ATmega2560__
|
|
||||||
void idle(period_t period, adc_t adc, timer5_t timer5,
|
|
||||||
timer4_t timer4, timer3_t timer3, timer2_t timer2,
|
|
||||||
timer1_t timer1, timer0_t timer0, spi_t spi,
|
|
||||||
usart3_t usart3, usart2_t usart2, usart1_t usart1,
|
|
||||||
usart0_t usart0, twi_t twi);
|
|
||||||
#elif defined __AVR_ATmega32U4__
|
|
||||||
void idle(period_t period, adc_t adc, timer4_t timer4, timer3_t timer3,
|
|
||||||
timer1_t timer1, timer0_t timer0, spi_t spi,
|
|
||||||
usart1_t usart1, twi_t twi, usb_t usb);
|
|
||||||
#else
|
|
||||||
#error "Please ensure chosen MCU is either 328P, 32U4 or 2560."
|
|
||||||
#endif
|
|
||||||
void adcNoiseReduction(period_t period, adc_t adc, timer2_t timer2);
|
|
||||||
void powerDown(period_t period, adc_t adc, bod_t bod);
|
|
||||||
void powerSave(period_t period, adc_t adc, bod_t bod, timer2_t timer2);
|
|
||||||
void powerStandby(period_t period, adc_t adc, bod_t bod);
|
|
||||||
void powerExtStandby(period_t period, adc_t adc, bod_t bod, timer2_t timer2);
|
|
||||||
};
|
|
||||||
|
|
||||||
extern LowPowerClass LowPower;
|
|
||||||
#endif
|
|
||||||
Reference in New Issue
Block a user