20151208_sleep_wdt

This commit is contained in:
tekka007
2015-12-08 13:42:42 +01:00
parent ba73ee4075
commit 4c1df2b074
+10 -9
View File
@@ -36,8 +36,6 @@ void wakeUp2() //place to send the second interrupts
// to allow automatic WDIF and WDIE bit clearance in hardware. // to allow automatic WDIF and WDIE bit clearance in hardware.
ISR (WDT_vect) ISR (WDT_vect)
{ {
// WDIE & WDIF is cleared in hardware upon entering this ISR
//wdt_disable();
} }
void hwPowerDown(period_t period) { void hwPowerDown(period_t period) {
@@ -46,30 +44,33 @@ void hwPowerDown(period_t period) {
ADCSRA &= ~(1 << ADEN); ADCSRA &= ~(1 << ADEN);
// save WDT settings // save WDT settings
uint8_t WDTsave = WDTCSR; uint8_t WDTsave = WDTCSR;
if (period != SLEEP_FOREVER) if (period != SLEEP_FOREVER)
{ {
// change WDT to waiting period
wdt_enable(period); wdt_enable(period);
// enable WDT interrupt before system reset // enable WDT interrupt before system reset
WDTCSR |= (1 << WDIE) ; WDTCSR |= (1 << WDCE) | (1 << WDIE);
} else { } else {
// if sleeping forever, wdt should be disabled // if sleeping forever, disable WDT
wdt_disable(); wdt_disable();
} }
set_sleep_mode(SLEEP_MODE_PWR_DOWN); set_sleep_mode(SLEEP_MODE_PWR_DOWN);
cli(); cli();
sleep_enable(); sleep_enable();
#if defined __AVR_ATmega328P__ #if defined __AVR_ATmega328P__
sleep_bod_disable(); sleep_bod_disable();
#endif #endif
sei(); sei();
// sleep until WDT or ext. interrupt // sleep until WDT or ext. interrupt
sleep_cpu(); sleep_cpu();
sleep_disable(); sleep_disable();
// restore previous WDT settings // restore previous WDT settings
WDTCSR = (1 << WDCE) | (1 << WDE); cli();
wdt_reset();
// enable WDT changes
WDTCSR |= (1 << WDCE) | (1 << WDE);
// restore saved WDT settings
WDTCSR = WDTsave; WDTCSR = WDTsave;
sei();
// enable ADC // enable ADC
ADCSRA |= (1 << ADEN); ADCSRA |= (1 << ADEN);
} }