use RTC instead ot timer to periodically query measurements

This commit is contained in:
King Kévin 2017-01-19 14:02:20 +01:00
parent f9e7048f73
commit 405c243f5c
1 changed files with 12 additions and 33 deletions

45
main.c
View File

@ -55,12 +55,7 @@
volatile bool rtc_internal_tick_flag = false; /**< flag set when internal RTC ticked */
/** @} */
/** @defgroup main_timer timer used to periodically query the meter measurements
* @{
*/
#define MAIN_TIMER 4 /**< timer number */
#define MAIN_PERIOD 10.0 /**< period in seconds to query meter measurements */
/** @} */
#define QUERY_PERIOD 10 /**< period in seconds to query meter measurements */
int _write(int file, char *ptr, int len)
@ -275,20 +270,6 @@ void main(void)
radio_esp8266_setup();
printf("OK\n");
// setup timer to periodically query meter measurements
printf("setup query timer (%.0fs): ", MAIN_PERIOD);
rcc_periph_clock_enable(RCC_TIM(MAIN_TIMER)); // enable clock for timer block
timer_reset(TIM(MAIN_TIMER)); // reset timer state
timer_set_mode(TIM(MAIN_TIMER), TIM_CR1_CKD_CK_INT, TIM_CR1_CMS_EDGE, TIM_CR1_DIR_UP); // set timer mode, use undivided timer clock,edge alignment (simple count), and count up
timer_set_prescaler(TIM(MAIN_TIMER), 0xffff); // set the prescaler so this 16 bits timer allows to wait for ~60s ( (2**16)/(2**16)/72E6=59.65s )
timer_set_period(TIM(MAIN_TIMER), MAIN_PERIOD*(rcc_ahb_frequency/(TIM_PSC(TIM(MAIN_TIMER))+1))); // set period for meter measurements queries
timer_set_counter(TIM(MAIN_TIMER), 0); // reset timer counter to get preset waiting time
timer_clear_flag(TIM(MAIN_TIMER), TIM_SR_UIF); // clear flag
timer_enable_irq(TIM(MAIN_TIMER), TIM_DIER_UIE); // enable update interrupt for timer (timer overflows when period is reached)
//nvic_enable_irq(NVIC_TIM_IRQ(MAIN_TIMER)); // allow interrupt for timer just to wake up
timer_enable_counter(TIM(MAIN_TIMER)); // start timer for periodic queries
printf("OK\n");
#if !(DEBUG)
//setup watchdog to reset in case we get stuck (i.e. when an error occurred)
printf("setup watchdog (%.2fs): ",WATCHDOG_PERIOD/1000.0);
@ -489,6 +470,17 @@ void main(void)
if ((ticks_time%(60))==0) { // one minute passed
printf("uptime: %lu.%02lu:%02lu:%02lu\n", ticks_time/(60*60*24), (ticks_time/(60*60))%24, (ticks_time%(60*60))/60, (ticks_time%60)); // display external time
}
if ((ticks_time%(QUERY_PERIOD))==0) { // query period passed
printf("query meter measurements (%lu.%02lu:%02lu:%02lu)\n", ticks_time/(60*60*24), (ticks_time/(60*60))%24, (ticks_time%(60*60))/60, (ticks_time%60));
// start getting all PZEM-004T measurements from all meters
pzem_meter = 0; // reset PZEM meter number
pzem_measurement = 0; // reset PZEM measurement index
sensor_pzem_measurement_request(0xc0a80100+pzem_meter, pzem_measurement); // request first measurement
// start getting all SDM120 measurements from all meters
sdm120_meter = 0; // reset SDM120 meter number
sdm120_measurement = 0; // reset SDM120 measurement index
sensor_sdm120_measurement_request(1+sdm120_meter, sdm120_measurement); // request first measurement
}
}
while (pzem_meter>=LENGTH(pzem_measurements) && sdm120_meter>=LENGTH(sdm120_measurements)) { // all measurements received for all meter
action = true; // action has been performed
@ -600,19 +592,6 @@ void main(void)
sdm120_meter = 0; // reset meter
}
while (timer_get_flag(TIM(MAIN_TIMER), TIM_SR_UIF)) { // timer update event -> query measurements
timer_clear_flag(TIM(MAIN_TIMER), TIM_SR_UIF); // clear flag
action = true; // action has been performed
printf("query meter measurements (%lu.%02lu:%02lu:%02lu)\n", ticks_time/(60*60*24), (ticks_time/(60*60))%24, (ticks_time%(60*60))/60, (ticks_time%60));
// start getting all PZEM-004T measurements from all meters
pzem_meter = 0; // reset PZEM meter number
pzem_measurement = 0; // reset PZEM measurement index
sensor_pzem_measurement_request(0xc0a80100+pzem_meter, pzem_measurement); // request first measurement
// start getting all SDM120 measurements from all meters
sdm120_meter = 0; // reset SDM120 meter number
sdm120_measurement = 0; // reset SDM120 measurement index
sensor_sdm120_measurement_request(1+sdm120_meter, sdm120_measurement); // request first measurement
}
if (action) { // go to sleep if nothing had to be done, else recheck for activity
action = false;
} else {