From 3485182945cfe4e188b791a1860201ece55da24f Mon Sep 17 00:00:00 2001 From: tekka007 Date: Mon, 7 Dec 2015 22:28:28 +0100 Subject: [PATCH 1/4] intermediate 20151207 --- libraries/MySensors/core/MyHw.h | 4 +- libraries/MySensors/core/MyHwATMega328.cpp | 92 +++++++++------------- libraries/MySensors/core/MyHwESP8266.cpp | 4 +- 3 files changed, 41 insertions(+), 59 deletions(-) diff --git a/libraries/MySensors/core/MyHw.h b/libraries/MySensors/core/MyHw.h index 5b1f27a..c93ea41 100644 --- a/libraries/MySensors/core/MyHw.h +++ b/libraries/MySensors/core/MyHw.h @@ -43,8 +43,8 @@ uint8_t hwReadConfig(int adr); */ void hwSleep(unsigned long ms); -bool hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms); -uint8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms); +int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms); +int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms); #ifdef MY_DEBUG void hwDebugPrint(const char *fmt, ... ); #endif diff --git a/libraries/MySensors/core/MyHwATMega328.cpp b/libraries/MySensors/core/MyHwATMega328.cpp index f856953..d718737 100644 --- a/libraries/MySensors/core/MyHwATMega328.cpp +++ b/libraries/MySensors/core/MyHwATMega328.cpp @@ -22,6 +22,7 @@ #include "MyHwATMega328.h" int8_t pinIntTrigger = 0; + void wakeUp() //place to send the interrupts { pinIntTrigger = 1; @@ -44,36 +45,28 @@ ISR (WDT_vect) void hwPowerDown(period_t period) { + // disable ADC for power saving ADCSRA &= ~(1 << ADEN); if (period != SLEEP_FOREVER) { + // change WDT to waiting period wdt_enable(period); + // enable WDT interrupt before system reset WDTCSR |= (1 << WDIE); } - #if defined __AVR_ATmega328P__ - do { - set_sleep_mode(SLEEP_MODE_PWR_DOWN); - cli(); - sleep_enable(); - sleep_bod_disable(); - sei(); - sleep_cpu(); - sleep_disable(); - sei(); - } while (0); - #else - do { - set_sleep_mode(SLEEP_MODE_PWR_DOWN); - cli(); - sleep_enable(); - sei(); - sleep_cpu(); - sleep_disable(); - sei(); - } while (0); - #endif - + // maximum power saving + set_sleep_mode(SLEEP_MODE_PWR_DOWN); + cli(); + sleep_enable(); +#if defined __AVR_ATmega328P__ + sleep_bod_disable(); +#endif + sei(); + // sleep until WDT or ext. interrupt + sleep_cpu(); + sleep_disable(); + // enable ADC ADCSRA |= (1 << ADEN); } @@ -99,50 +92,39 @@ void hwSleep(unsigned long ms) { hwInternalSleep(ms); } -bool hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { - // Let serial prints finish (debug, log etc) - bool pinTriggeredWakeup = true; - attachInterrupt(interrupt, wakeUp, mode); - if (ms>0) { - pinIntTrigger = 0; - hwInternalSleep(ms); - if (0 == pinIntTrigger) { - pinTriggeredWakeup = false; - } - } else { - #ifndef MY_DISABLED_SERIAL - Serial.flush(); - #endif - hwPowerDown(SLEEP_FOREVER); - } - detachInterrupt(interrupt); - return pinTriggeredWakeup; +int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { + return hwSleep(interrupt,mode,0xFF,0x00,ms); } -uint8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { - int8_t retVal = 1; +int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { + // no interrupt triggered + int8_t retVal = -1; + // reset interrupt trigger + pinIntTrigger = 0; + // attach interrupts attachInterrupt(interrupt1, wakeUp, mode1); - attachInterrupt(interrupt2, wakeUp2, mode2); + if (interrupt2!=0xFF) attachInterrupt(interrupt2, wakeUp2, mode2); + if (ms>0) { - pinIntTrigger = 0; + // sleep for defined time hwInternalSleep(ms); - if (0 == pinIntTrigger) { - retVal = -1; - } } else { - #ifndef MY_DISABLED_SERIAL - Serial.flush(); - #endif - hwPowerDown(SLEEP_FOREVER); + // sleep until ext interrupt triggered + hwPowerDown(SLEEP_FOREVER); } + detachInterrupt(interrupt1); - detachInterrupt(interrupt2); + if (interrupt2!=0xFF) detachInterrupt(interrupt2); - if (1 == pinIntTrigger) { + if (pinIntTrigger == 0) { + // no interrupt triggered + retVal = -1; + } else if (pinIntTrigger == 1) { retVal = (int8_t)interrupt1; - } else if (2 == pinIntTrigger) { + } else if (pinIntTrigger == 2) { retVal = (int8_t)interrupt2; } + return retVal; } diff --git a/libraries/MySensors/core/MyHwESP8266.cpp b/libraries/MySensors/core/MyHwESP8266.cpp index d834582..f2e6879 100644 --- a/libraries/MySensors/core/MyHwESP8266.cpp +++ b/libraries/MySensors/core/MyHwESP8266.cpp @@ -96,12 +96,12 @@ void hwSleep(unsigned long ms) { // TODO: Not supported! } -bool hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { +int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { // TODO: Not supported! return false; } -uint8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { +int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { // TODO: Not supported! return 0; } From cbb8a80791d79675459e8b34ba5b2cd50bac2f36 Mon Sep 17 00:00:00 2001 From: tekka007 Date: Tue, 8 Dec 2015 00:42:09 +0100 Subject: [PATCH 2/4] intermediate 20151208 --- libraries/MySensors/core/MyHwATMega328.cpp | 26 +++++++++------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/libraries/MySensors/core/MyHwATMega328.cpp b/libraries/MySensors/core/MyHwATMega328.cpp index d718737..1354c78 100644 --- a/libraries/MySensors/core/MyHwATMega328.cpp +++ b/libraries/MySensors/core/MyHwATMega328.cpp @@ -40,9 +40,6 @@ ISR (WDT_vect) wdt_disable(); } - - - void hwPowerDown(period_t period) { // disable ADC for power saving @@ -55,17 +52,16 @@ void hwPowerDown(period_t period) { // enable WDT interrupt before system reset WDTCSR |= (1 << WDIE); } - // maximum power saving set_sleep_mode(SLEEP_MODE_PWR_DOWN); cli(); sleep_enable(); -#if defined __AVR_ATmega328P__ + #if defined __AVR_ATmega328P__ sleep_bod_disable(); -#endif + #endif sei(); // sleep until WDT or ext. interrupt sleep_cpu(); - sleep_disable(); + sleep_disable(); // enable ADC ADCSRA |= (1 << ADEN); } @@ -75,6 +71,7 @@ void hwInternalSleep(unsigned long ms) { #ifndef MY_DISABLED_SERIAL Serial.flush(); #endif + // reset interrupt trigger var pinIntTrigger = 0; while (!pinIntTrigger && ms >= 8000) { hwPowerDown(SLEEP_8S); ms -= 8000; } if (!pinIntTrigger && ms >= 4000) { hwPowerDown(SLEEP_4S); ms -= 4000; } @@ -97,10 +94,8 @@ int8_t hwSleep(uint8_t interrupt, uint8_t mode, unsigned long ms) { } int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mode2, unsigned long ms) { - // no interrupt triggered - int8_t retVal = -1; - // reset interrupt trigger - pinIntTrigger = 0; + // reset interrupt trigger var + pinIntTrigger = 0; // attach interrupts attachInterrupt(interrupt1, wakeUp, mode1); if (interrupt2!=0xFF) attachInterrupt(interrupt2, wakeUp2, mode2); @@ -115,16 +110,15 @@ int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mo detachInterrupt(interrupt1); if (interrupt2!=0xFF) detachInterrupt(interrupt2); + + // default: no interrupt triggered + int8_t retVal = -1; - if (pinIntTrigger == 0) { - // no interrupt triggered - retVal = -1; - } else if (pinIntTrigger == 1) { + if (pinIntTrigger == 1) { retVal = (int8_t)interrupt1; } else if (pinIntTrigger == 2) { retVal = (int8_t)interrupt2; } - return retVal; } From ba73ee4075c8b69d355a4e95b6ad5b7baa98ac9c Mon Sep 17 00:00:00 2001 From: tekka007 Date: Tue, 8 Dec 2015 01:30:19 +0100 Subject: [PATCH 3/4] intermediate 20151208fix --- libraries/MySensors/core/MyHwATMega328.cpp | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/libraries/MySensors/core/MyHwATMega328.cpp b/libraries/MySensors/core/MyHwATMega328.cpp index 1354c78..ba7da23 100644 --- a/libraries/MySensors/core/MyHwATMega328.cpp +++ b/libraries/MySensors/core/MyHwATMega328.cpp @@ -37,20 +37,25 @@ void wakeUp2() //place to send the second interrupts ISR (WDT_vect) { // WDIE & WDIF is cleared in hardware upon entering this ISR - wdt_disable(); + //wdt_disable(); } void hwPowerDown(period_t period) { // disable ADC for power saving ADCSRA &= ~(1 << ADEN); + // save WDT settings + uint8_t WDTsave = WDTCSR; if (period != SLEEP_FOREVER) { // change WDT to waiting period wdt_enable(period); // enable WDT interrupt before system reset - WDTCSR |= (1 << WDIE); + WDTCSR |= (1 << WDIE) ; + } else { + // if sleeping forever, wdt should be disabled + wdt_disable(); } set_sleep_mode(SLEEP_MODE_PWR_DOWN); cli(); @@ -62,6 +67,9 @@ void hwPowerDown(period_t period) { // sleep until WDT or ext. interrupt sleep_cpu(); sleep_disable(); + // restore previous WDT settings + WDTCSR = (1 << WDCE) | (1 << WDE); + WDTCSR = WDTsave; // enable ADC ADCSRA |= (1 << ADEN); } From 4c1df2b074d9f6756821a1b86bcd9dd5c4c08f51 Mon Sep 17 00:00:00 2001 From: tekka007 Date: Tue, 8 Dec 2015 13:42:42 +0100 Subject: [PATCH 4/4] 20151208_sleep_wdt --- libraries/MySensors/core/MyHwATMega328.cpp | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/libraries/MySensors/core/MyHwATMega328.cpp b/libraries/MySensors/core/MyHwATMega328.cpp index ba7da23..eaf6759 100644 --- a/libraries/MySensors/core/MyHwATMega328.cpp +++ b/libraries/MySensors/core/MyHwATMega328.cpp @@ -36,8 +36,6 @@ void wakeUp2() //place to send the second interrupts // 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(); } void hwPowerDown(period_t period) { @@ -46,30 +44,33 @@ void hwPowerDown(period_t period) { ADCSRA &= ~(1 << ADEN); // save WDT settings uint8_t WDTsave = WDTCSR; - if (period != SLEEP_FOREVER) { - // change WDT to waiting period wdt_enable(period); // enable WDT interrupt before system reset - WDTCSR |= (1 << WDIE) ; + WDTCSR |= (1 << WDCE) | (1 << WDIE); } else { - // if sleeping forever, wdt should be disabled + // if sleeping forever, disable WDT wdt_disable(); } set_sleep_mode(SLEEP_MODE_PWR_DOWN); cli(); sleep_enable(); - #if defined __AVR_ATmega328P__ +#if defined __AVR_ATmega328P__ sleep_bod_disable(); - #endif +#endif sei(); // sleep until WDT or ext. interrupt sleep_cpu(); sleep_disable(); // 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; + sei(); // enable ADC ADCSRA |= (1 << ADEN); }