From 4e968c7ea10ae047255a981af6f1b0c4d6e0c5ee Mon Sep 17 00:00:00 2001 From: tekka007 Date: Thu, 17 Dec 2015 15:25:10 +0100 Subject: [PATCH 1/3] Add functions for Vcc & Freq readout --- libraries/MySensors/core/MyHw.h | 2 + libraries/MySensors/core/MyHwATMega328.cpp | 50 +++++++++++++++++++++- libraries/MySensors/core/MyHwATMega328.h | 2 +- libraries/MySensors/core/MyHwESP8266.cpp | 10 +++++ libraries/MySensors/core/MyHwSAMD.cpp | 10 +++++ 5 files changed, 72 insertions(+), 2 deletions(-) diff --git a/libraries/MySensors/core/MyHw.h b/libraries/MySensors/core/MyHw.h index e7a9ee6..6d8571c 100644 --- a/libraries/MySensors/core/MyHw.h +++ b/libraries/MySensors/core/MyHw.h @@ -45,6 +45,8 @@ uint8_t hwReadConfig(int adr); int8_t hwSleep(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); +uint16_t hwCPUVoltage(); +uint16_t hwCPUFrequency(); #ifdef MY_DEBUG void hwDebugPrint(const char *fmt, ... ); #endif diff --git a/libraries/MySensors/core/MyHwATMega328.cpp b/libraries/MySensors/core/MyHwATMega328.cpp index 9600f7e..f4a1585 100644 --- a/libraries/MySensors/core/MyHwATMega328.cpp +++ b/libraries/MySensors/core/MyHwATMega328.cpp @@ -91,7 +91,7 @@ void hwInternalSleep(unsigned long ms) { if (!pinIntTrigger && ms >= 125) { hwPowerDown(SLEEP_120MS); ms -= 120; } if (!pinIntTrigger && ms >= 64) { hwPowerDown(SLEEP_60MS); ms -= 60; } if (!pinIntTrigger && ms >= 32) { hwPowerDown(SLEEP_30MS); ms -= 30; } - if (!pinIntTrigger && ms >= 16) { hwPowerDown(SLEEP_15Ms); ms -= 15; } + if (!pinIntTrigger && ms >= 16) { hwPowerDown(SLEEP_15MS); ms -= 15; } } int8_t hwSleep(unsigned long ms) { @@ -132,6 +132,54 @@ int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mo return retVal; } +uint16_t hwCPUVoltage() { + // Measure Vcc against 1.1V Vref + #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) + ADMUX = (_BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1)); + #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) + ADMUX = (_BV(MUX5) | _BV(MUX0)); + #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) + ADMUX = (_BV(MUX3) | _BV(MUX2)); + #else + ADMUX = (_BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1)); + #endif + // Vref settle + delay(70); + // Do conversion + ADCSRA |= _BV(ADSC); + while (bit_is_set(ADCSRA,ADSC)); + // return value in mV + return (1125300UL) / ADC; +} + +uint16_t hwCPUFrequency() { + noInterrupts(); + // setup timer1 + TIFR1 = 0xFF; + TCNT1 = 0; + TCCR1A = 0; + TCCR1C = 0; + // save WDT settings + uint8_t WDTsave = WDTCSR; + wdt_enable(WDTO_500MS); + // enable WDT interrupt mode => first timeout WDIF, 2nd timeout reset + WDTCSR |= (1 << WDIE); + wdt_reset(); + // start timer1 with 1024 prescaling + TCCR1B = _BV(CS12) | _BV(CS10); + // wait until wdt interrupt + while (bit_is_clear(WDTCSR,WDIF)); + // stop timer + TCCR1B = 0; + // restore WDT settings + wdt_reset(); + WDTCSR |= (1 << WDCE) | (1 << WDE); + WDTCSR = WDTsave; + interrupts(); + // return frequency in MHz (accuracy +- 10%) + return TCNT1 * 2048UL / 1000000UL; +} + #ifdef MY_DEBUG diff --git a/libraries/MySensors/core/MyHwATMega328.h b/libraries/MySensors/core/MyHwATMega328.h index c8eabd3..e8a41fa 100644 --- a/libraries/MySensors/core/MyHwATMega328.h +++ b/libraries/MySensors/core/MyHwATMega328.h @@ -79,7 +79,7 @@ do { \ enum period_t { - SLEEP_15Ms, + SLEEP_15MS, SLEEP_30MS, SLEEP_60MS, SLEEP_120MS, diff --git a/libraries/MySensors/core/MyHwESP8266.cpp b/libraries/MySensors/core/MyHwESP8266.cpp index da08eb0..9134612 100644 --- a/libraries/MySensors/core/MyHwESP8266.cpp +++ b/libraries/MySensors/core/MyHwESP8266.cpp @@ -107,6 +107,16 @@ int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mo return -2; } +ADC_MODE(ADC_VCC); + +uint16_t hwCPUVoltage() { + return ESP.getVcc(); +} + +uint16_t hwCPUFrequency() { + return ESP.getCpuFreqMHz(); +} + #ifdef MY_DEBUG void hwDebugPrint(const char *fmt, ... ) { char fmtBuffer[300]; diff --git a/libraries/MySensors/core/MyHwSAMD.cpp b/libraries/MySensors/core/MyHwSAMD.cpp index 8fda54f..effc00b 100644 --- a/libraries/MySensors/core/MyHwSAMD.cpp +++ b/libraries/MySensors/core/MyHwSAMD.cpp @@ -135,6 +135,16 @@ int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mo return -2; } +uint16_t hwCPUVoltage() { + // TODO: not supported + return 0; +} + +uint16_t hwCPUFrequency() { + // TODO: not supported + return 0; +} + #ifdef MY_DEBUG void hwDebugPrint(const char *fmt, ... ) { char fmtBuffer[300]; From 4a403f624619b70f73f3b027fc9f108eeb7050b6 Mon Sep 17 00:00:00 2001 From: tekka007 Date: Fri, 18 Dec 2015 12:14:02 +0100 Subject: [PATCH 2/3] Adjustment hwCPUFrequency() type --- libraries/MySensors/core/MyHw.h | 3 +-- libraries/MySensors/core/MyHwATMega328.cpp | 2 +- libraries/MySensors/core/MyHwESP8266.cpp | 2 +- libraries/MySensors/core/MyHwSAMD.cpp | 10 ---------- 4 files changed, 3 insertions(+), 14 deletions(-) diff --git a/libraries/MySensors/core/MyHw.h b/libraries/MySensors/core/MyHw.h index 6d8571c..5185b79 100644 --- a/libraries/MySensors/core/MyHw.h +++ b/libraries/MySensors/core/MyHw.h @@ -45,8 +45,7 @@ uint8_t hwReadConfig(int adr); int8_t hwSleep(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); -uint16_t hwCPUVoltage(); -uint16_t hwCPUFrequency(); + #ifdef MY_DEBUG void hwDebugPrint(const char *fmt, ... ); #endif diff --git a/libraries/MySensors/core/MyHwATMega328.cpp b/libraries/MySensors/core/MyHwATMega328.cpp index f4a1585..10e03ec 100644 --- a/libraries/MySensors/core/MyHwATMega328.cpp +++ b/libraries/MySensors/core/MyHwATMega328.cpp @@ -152,7 +152,7 @@ uint16_t hwCPUVoltage() { return (1125300UL) / ADC; } -uint16_t hwCPUFrequency() { +uint8_t hwCPUFrequency() { noInterrupts(); // setup timer1 TIFR1 = 0xFF; diff --git a/libraries/MySensors/core/MyHwESP8266.cpp b/libraries/MySensors/core/MyHwESP8266.cpp index 9134612..c9568a1 100644 --- a/libraries/MySensors/core/MyHwESP8266.cpp +++ b/libraries/MySensors/core/MyHwESP8266.cpp @@ -113,7 +113,7 @@ uint16_t hwCPUVoltage() { return ESP.getVcc(); } -uint16_t hwCPUFrequency() { +uint8_t hwCPUFrequency() { return ESP.getCpuFreqMHz(); } diff --git a/libraries/MySensors/core/MyHwSAMD.cpp b/libraries/MySensors/core/MyHwSAMD.cpp index effc00b..8fda54f 100644 --- a/libraries/MySensors/core/MyHwSAMD.cpp +++ b/libraries/MySensors/core/MyHwSAMD.cpp @@ -135,16 +135,6 @@ int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mo return -2; } -uint16_t hwCPUVoltage() { - // TODO: not supported - return 0; -} - -uint16_t hwCPUFrequency() { - // TODO: not supported - return 0; -} - #ifdef MY_DEBUG void hwDebugPrint(const char *fmt, ... ) { char fmtBuffer[300]; From b209534ca0c4ac2049f95f6c955745e898bff7f1 Mon Sep 17 00:00:00 2001 From: tekka007 Date: Sat, 19 Dec 2015 10:35:05 +0100 Subject: [PATCH 3/3] Scale and unify frequency measurement results --- libraries/MySensors/core/MyHw.h | 1 - libraries/MySensors/core/MyHwATMega328.cpp | 6 +++--- libraries/MySensors/core/MyHwESP8266.cpp | 6 ++++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/libraries/MySensors/core/MyHw.h b/libraries/MySensors/core/MyHw.h index 5185b79..e7a9ee6 100644 --- a/libraries/MySensors/core/MyHw.h +++ b/libraries/MySensors/core/MyHw.h @@ -45,7 +45,6 @@ uint8_t hwReadConfig(int adr); int8_t hwSleep(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 10e03ec..49205db 100644 --- a/libraries/MySensors/core/MyHwATMega328.cpp +++ b/libraries/MySensors/core/MyHwATMega328.cpp @@ -148,7 +148,7 @@ uint16_t hwCPUVoltage() { // Do conversion ADCSRA |= _BV(ADSC); while (bit_is_set(ADCSRA,ADSC)); - // return value in mV + // return Vcc in mV return (1125300UL) / ADC; } @@ -176,8 +176,8 @@ uint8_t hwCPUFrequency() { WDTCSR |= (1 << WDCE) | (1 << WDE); WDTCSR = WDTsave; interrupts(); - // return frequency in MHz (accuracy +- 10%) - return TCNT1 * 2048UL / 1000000UL; + // return frequency in 1/10MHz (accuracy +- 10%) + return TCNT1 * 2048UL / 100000UL; } diff --git a/libraries/MySensors/core/MyHwESP8266.cpp b/libraries/MySensors/core/MyHwESP8266.cpp index c9568a1..33f615e 100644 --- a/libraries/MySensors/core/MyHwESP8266.cpp +++ b/libraries/MySensors/core/MyHwESP8266.cpp @@ -110,11 +110,13 @@ int8_t hwSleep(uint8_t interrupt1, uint8_t mode1, uint8_t interrupt2, uint8_t mo ADC_MODE(ADC_VCC); uint16_t hwCPUVoltage() { + // in mV return ESP.getVcc(); } -uint8_t hwCPUFrequency() { - return ESP.getCpuFreqMHz(); +uint16_t hwCPUFrequency() { + // in 1/10Mhz + return ESP.getCpuFreqMHz()*10; } #ifdef MY_DEBUG