*****************************
PM::PM()
{
SMCR |= (1<<SM1)|(1<<SM0); //configure as power save mode
}
PM::~PM()
{
}
//---------------------protected
void PM::pinConfig()
{
// LCD module will be running so, not touching PORTA & PORTC
DDRB = 0b10110111; PORTB = 0b01001000;
DDRD |= (1<<0)|(1<<2)|(1<<3)|(1<<4);
PORTD &= ~(1<<0) & ~(1<<2) & ~(1<<3) & ~(1<<4);
DDRD &= ~(1<<1); PORTD |= (1<<1);
DDRE = 0b01000001; PORTE= 0b10111110;
DDRF = 0b11000011; PORTF= 0b00111100;
DDRG |= (1<<3) | (1<<4); DDRG &= ~(1<<3) & ~(1<<4);
DIDR1 |= (1<<AIN1D) | (1<<AIN0D); DIDR0 = 0xFF;
PRR |= 0x0F;
}
void PM::cpuGoToSleep()
{
SPCR=0; //spi
ACSR|=(1<<7); //analog
ADCSRA|=(1<<7); //adc
ASSR=0;//async
TCCR2A=0; //rtc
TCCR1A=0; //tmr1
TCCR0A=0; //delay
SMCR |= (1<<SE); // enable power save option
asm volatile ( "SLEEP" "\n\t" :: );
}
//----------------------public
void PM::goToSleep()
{
pinConfig();
delay(2000);
cpuGoToSleep();
}
***************************************