From 6cab91b0ab0b538cd63d94c1afd38e3fd287efec Mon Sep 17 00:00:00 2001 From: root Date: Tue, 17 Apr 2018 10:35:31 +0100 Subject: happy dcf77 better pll, and stamps for long term stability --- app/msf.c | 87 +++++++++++++++++++++++++++++++-------------------------------- 1 file changed, 43 insertions(+), 44 deletions(-) (limited to 'app/msf.c') diff --git a/app/msf.c b/app/msf.c index 392bfe7..2e7dd93 100644 --- a/app/msf.c +++ b/app/msf.c @@ -6,44 +6,35 @@ #define T (GPIO0) #define T_PORT GPIOB -static uint8_t bitsa[60], bitsb[60]; +static Event_ring msf_ring; -static int time_known; -static int check_parity (uint8_t *d, unsigned s, unsigned e, uint8_t p) +uint64_t msf_last_second; + + +void exti0_isr (void) { - unsigned i; + uint32_t now = SCS_DWT_CYCCNT; + int v; - for (i = s; i <= e; ++i) - p ^= d[i]; + v = !!gpio_get (T_PORT, T); - return !p; -} + nvic_disable_irq (NVIC_EXTI0_IRQ); + exti_reset_request (EXTI0); + msf_ring.events[msf_ring.tx_ptr].when = now; + msf_ring.events[msf_ring.tx_ptr].value = v; + msf_ring.tx_ptr = (msf_ring.tx_ptr + 1) & ERING_MASK; -static unsigned bcd (uint8_t *d, unsigned s, unsigned e) -{ - unsigned ret = 0, c, b, i; + nvic_enable_irq (NVIC_EXTI0_IRQ); - for (i = e, c = 1, b = 0; i >= s; --i, b++) { +} - if (d[i]) ret += c; - switch (b & 3) { - case 0: - case 1: - case 2: - c <<= 1; - break; - default: - c >>= 3; - c *= 10; - } - } +static uint8_t bitsa[60], bitsb[60]; - return ret; -} +static int time_known; @@ -103,8 +94,10 @@ static void process_bits (uint64_t abs) pll_set_offset (msf_time, abs); time_known = 1; - printf ("Next minute is: %02d-%02d-%02d %02d:%02d\r\n", u.year, u.month, u.mday, u.hour, u.minute); - time_print_epoch (msf_time); + stats_stamp (u, abs); + + printf ("MSF: Next minute is: %02d-%02d-%02d %02d:%02d\r\n", u.year, u.month, u.mday, u.hour, u.minute); + //time_print_epoch (msf_time); } @@ -121,29 +114,31 @@ static void report_bits (uint64_t abs, int second, int a, int b) static void report_time (uint64_t abs) { +#if 0 EPOCH e = pll_decompose (abs); - time_print_epoch (e); - printf ("%d\r\n", (unsigned) e.s); + time_print_epoch ("MSF: ", e); +#endif } -void exti0_isr (void) + +void msf_dispatch (void) { - static uint32_t last_0; - static uint32_t last_1; - static uint32_t last_s; + static uint32_t last_0, last_1, last_s; static int second, bita, bitb, had_m; - - uint32_t now = SCS_DWT_CYCCNT; - uint64_t abs; - uint32_t pulse_w, offset; + uint64_t abs; int is_s = 0; + + uint32_t now; int v; - nvic_disable_irq (NVIC_EXTI0_IRQ); - exti_reset_request (EXTI0); - v = !!gpio_get (T_PORT, T); + if (msf_ring.rx_ptr == msf_ring.tx_ptr) return; + + v = msf_ring.events[msf_ring.rx_ptr].value; + now = msf_ring.events[msf_ring.rx_ptr].when; + + msf_ring.rx_ptr = (msf_ring.rx_ptr + 1) & ERING_MASK; if (v) { pulse_w = now - last_0; @@ -174,16 +169,21 @@ void exti0_isr (void) if (is_s) { abs = abs_extend (now); + msf_last_second = abs; + pll_dispatch (abs); + + if (had_m) { report_bits (abs, second, bita, bitb); second++; - } if (time_known) report_time (abs); + + stats(); } @@ -206,11 +206,10 @@ void exti0_isr (void) - nvic_enable_irq (NVIC_EXTI0_IRQ); } void -radio_init (void) +msf_init (void) { MAP_INPUT (T); MAP_OUTPUT_PP (P1); -- cgit v1.2.3