From 135d635e8c3fcc1ee1a8dfdeaf3a153ad93684d7 Mon Sep 17 00:00:00 2001 From: Klaus K Wilting Date: Tue, 12 Feb 2019 23:59:08 +0100 Subject: [PATCH] IF482 precision improvement (experimental) --- src/if482.cpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/if482.cpp b/src/if482.cpp index d823e19b..cd2fa8ad 100644 --- a/src/if482.cpp +++ b/src/if482.cpp @@ -127,7 +127,7 @@ int if482_init(void) { String IF482_Out(time_t tt) { - time_t t = 1 + myTZ.toLocal(tt); + time_t t = myTZ.toLocal(tt); char mon, buf[14], out[IF482_FRAME_SIZE]; switch (timeStatus()) { // indicates if time has been set and recently synced @@ -159,17 +159,18 @@ void if482_loop(void *pvParameters) { configASSERT(((uint32_t)pvParameters) == 1); // FreeRTOS check - time_t tOut; TickType_t wakeTime; const TickType_t tTx = tx_time(HAS_IF482); // duration of telegram transmit BitsPending = true; // start blink in display // phase 1: sync task on top of second - sync_clock(now()); - const TickType_t t0 = xTaskGetTickCount(); // moment of start top of second + sync_clock(now()); // delay until top of second + + // const TickType_t t0 = xTaskGetTickCount(); // moment of start top of second + timepulse_start(); // start timepulse xTaskNotifyWait( @@ -182,7 +183,7 @@ void if482_loop(void *pvParameters) { const TickType_t tShot = (tOffset < tTx) ? (1000 - tOffset - tTx) : (tOffset - tTx); - ESP_LOGI(TAG, "IF482 signal synced with precision %dms", 1000 - tOffset); + ESP_LOGI(TAG, "IF482 signal synced with clock, tShot=%dms", tShot); // phase 2: sync task on time pulse interrupt for (;;) { @@ -192,18 +193,16 @@ void if482_loop(void *pvParameters) { &wakeTime, // receives moment of call from isr portMAX_DELAY); // wait forever (missing error handling here...) - tOut = now() + 1; // next second after waketime - // select clock scale #if (PPS == IF482_PULSE_DURATION) // we don't need clock rescaling // wait until it's time to start transmit telegram for next second vTaskDelayUntil(&wakeTime, tShot); // sets waketime to moment of tShot - IF482.print(IF482_Out(tOut)); + IF482.print(IF482_Out(now() + 1)); #elif (PPS > IF482_PULSE_DURATION) // we need upclocking for (uint8_t i = 1; i <= PPS / IF482_PULSE_DURATION; i++) { vTaskDelayUntil(&wakeTime, tShot); // sets waketime to moment of shot - IF482.print(IF482_Out(tOut)); + IF482.print(IF482_Out(now() + 1)); } #elif (PPS < IF482_PULSE_DURATION) // we need downclocking, not yet implemented @@ -213,15 +212,14 @@ void if482_loop(void *pvParameters) { } // if482_loop() -// helper function to calculate IF482 telegram serial tx time from serial -// settings +// calculate serial tx time from IF482 serial settings TickType_t tx_time(unsigned long baud, uint32_t config, int8_t rxPin, int8_t txPins) { uint32_t datenbits = ((config & 0x0c) >> 2) + 5; - uint32_t startbits = ((config & 0x20) >> 5) + 1; + uint32_t stopbits = ((config & 0x20) >> 5) + 1; return pdMS_TO_TICKS( - round(((datenbits + startbits + 1) * IF482_FRAME_SIZE * 1000.0 / baud))); + round(((1 + datenbits + stopbits) * IF482_FRAME_SIZE * 1000.0 / baud))); } #endif // HAS_IF482 \ No newline at end of file