From abdbac3e380a7ffc9589cc63dcd5ea51e235d2ec Mon Sep 17 00:00:00 2001 From: eddyem Date: Wed, 7 Aug 2019 17:16:14 +0300 Subject: [PATCH] fixed bug with systick correction --- F1-nolib/chronometer/GPS.c | 2 + F1-nolib/chronometer/Readme.md | 18 +++-- F1-nolib/chronometer/chrono.bin | Bin 15396 -> 15396 bytes F1-nolib/chronometer/hardware.c | 18 +++-- F1-nolib/chronometer/hardware.h | 13 +++- F1-nolib/chronometer/lidar.c | 1 + F1-nolib/chronometer/main.c | 92 ++++++++++++++++++++----- F1-nolib/chronometer/str.c | 18 ++++- F1-nolib/chronometer/str.h | 1 + F1-nolib/chronometer/time.c | 118 +++++++++++++++----------------- 10 files changed, 188 insertions(+), 93 deletions(-) diff --git a/F1-nolib/chronometer/GPS.c b/F1-nolib/chronometer/GPS.c index b3f44a7..1080c11 100644 --- a/F1-nolib/chronometer/GPS.c +++ b/F1-nolib/chronometer/GPS.c @@ -182,6 +182,8 @@ void GPS_parse_answer(const char *buf){ GPS_status = GPS_VALID; set_time(buf); }else{ + uint8_t goth = (buf[0]-'0')*10 + buf[1]-'0'; + if(current_time.H != goth) set_time(buf); // set time once per hour even if it's not valid GPS_status = GPS_NOT_VALID; } } diff --git a/F1-nolib/chronometer/Readme.md b/F1-nolib/chronometer/Readme.md index 545d295..e85cb05 100644 --- a/F1-nolib/chronometer/Readme.md +++ b/F1-nolib/chronometer/Readme.md @@ -3,18 +3,24 @@ Chronometer for downhill competitions ## Pinout +- PA11/12 - USB - PA9(Tx),PA10 (debug mode) - USART1 - debug console - PA2(Tx), PA3 - USART2 - GPS -- PB10(Tx), PB11 - USART3 - LIDAR +- PB10(Tx), PB11 - USART3 - LIDAR - TRIG3 - PA1 - PPS signal from GPS (EXTI) -- PB8, PB9 - onboard LEDs - -- PA4 - TRIG2 - 12V trigger (EXTI) -- not implemented yet +- PA4 - TRIG2 - 12V trigger (EXTI) - PA13 - TRIG0 - button0 (EXTI) - PA14 - TRIG1 - button1/laser/etc (EXTI) - PA15 - USB pullup -- PB0 - ADC channel 8 -- PB1,2 - free for other functions +- PB8, PB9 - onboard LEDs (0/1) + +- PC13 - buzzer + +### Not implemented yet: + +- PA5,6,7 (SCK, MISO, MOSI) - SPI +- PB0 - TRIG4 - ADC channel 8 +- PB6/7 (SCL, SDA) - I2C diff --git a/F1-nolib/chronometer/chrono.bin b/F1-nolib/chronometer/chrono.bin index 8b0451a1d40d214122481f2d2a5698c9fac52bdb..e543be800cc1094e5a33ec1d2b62540921823acd 100755 GIT binary patch delta 9323 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ÝABL@eWIDC;)qtqH?PGG{@4h2(? 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 // memcpy +uint8_t buzzer_on = 1; // buzzer ON by default uint8_t LEDSon = 1; // LEDS are working // ports of triggers static GPIO_TypeDef *trigport[DIGTRIG_AMOUNT] = {GPIOA, GPIOA, GPIOA}; @@ -42,14 +43,22 @@ trigtime shottime[TRIGGERS_AMOUNT]; static uint32_t shotms[TRIGGERS_AMOUNT]; // if trigger[N] shots, the bit N will be 1 uint8_t trigger_shot = 0; +// time when Buzzer was turned ON +uint32_t BuzzerTime = 0; static inline void gpio_setup(){ + BUZZER_OFF(); // turn off buzzer @start + LED_on(); // turn ON LED0 @start + LED1_off(); // turn off LED1 @start + USBPU_OFF(); // turn off USB pullup @start // Enable clocks to the GPIO subsystems (PB for ADC), turn on AFIO clocking to disable SWD/JTAG RCC->APB2ENR |= RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_AFIOEN; // turn off SWJ/JTAG AFIO->MAPR = AFIO_MAPR_SWJ_CFG_DISABLE; // pullups: PA1 - PPS, PA15 - USB pullup GPIOA->ODR = (1<<12)|(1<<15); + // buzzer (PC13): pushpull output + GPIOC->CRH = CRH(13, CNF_PPOUTPUT|MODE_SLOW); // Set leds (PB8) as opendrain output GPIOB->CRH = CRH(8, CNF_ODOUTPUT|MODE_SLOW) | CRH(9, CNF_ODOUTPUT|MODE_SLOW); // PPS pin (PA1) - input with weak pullup @@ -128,7 +137,7 @@ void hw_setup(){ void exti1_isr(){ // PPS - PA1 systick_correction(); - DBG("exti1"); + LED_off(); // turn off LED0 @ each PPS EXTI->PR = EXTI_PR_PR1; } @@ -140,17 +149,18 @@ void savetrigtime(){ void fillshotms(int i){ if(i < 0 || i > TRIGGERS_AMOUNT) return; - if(shotms[i] - Tms > (uint32_t)the_conf.trigpause[i]){ + if(Tms - shotms[i] > (uint32_t)the_conf.trigpause[i]){ shotms[i] = Tms; memcpy(&shottime[i], &trgtm, sizeof(trigtime)); trigger_shot |= 1<PR = EXTI_PR_PR4; } @@ -158,12 +168,10 @@ void exti15_10_isr(){ // PA13 - trigger[0], PA14 - trigger[1] savetrigtime(); if(EXTI->PR & EXTI_PR_PR13){ fillshotms(0); - DBG("exti13"); EXTI->PR = EXTI_PR_PR13; } if(EXTI->PR & EXTI_PR_PR14){ fillshotms(1); - DBG("exti14"); EXTI->PR = EXTI_PR_PR14; } } diff --git a/F1-nolib/chronometer/hardware.h b/F1-nolib/chronometer/hardware.h index 869f327..a746279 100644 --- a/F1-nolib/chronometer/hardware.h +++ b/F1-nolib/chronometer/hardware.h @@ -33,6 +33,13 @@ #define LED1_port GPIOB #define LED1_pin (1<<9) +// buzzer (1 - active) - PC13 +extern uint8_t buzzer_on; +#define BUZZER_port GPIOC +#define BUZZER_pin (1<<13) +#define BUZZER_ON() do{if(buzzer_on)pin_set(BUZZER_port, BUZZER_pin);}while(0) +#define BUZZER_OFF() pin_clear(BUZZER_port, BUZZER_pin) + // PPS pin - PA1 #define PPS_port GPIOA #define PPS_pin (1<<1) @@ -56,10 +63,10 @@ void savetrigtime(); #define LED_blink() do{if(LEDSon)pin_toggle(LED0_port, LED0_pin);}while(0) #define LED_on() do{if(LEDSon)pin_clear(LED0_port, LED0_pin);}while(0) -#define LED_off() do{if(LEDSon)pin_set(LED0_port, LED0_pin);}while(0) +#define LED_off() do{pin_set(LED0_port, LED0_pin);}while(0) #define LED1_blink() do{if(LEDSon)pin_toggle(LED1_port, LED1_pin);}while(0) #define LED1_on() do{if(LEDSon)pin_clear(LED1_port, LED1_pin);}while(0) -#define LED1_off() do{if(LEDSon)pin_set(LED1_port, LED1_pin);}while(0) +#define LED1_off() do{pin_set(LED1_port, LED1_pin);}while(0) // GPS USART == USART2, LIDAR USART == USART3 #define GPS_USART (2) @@ -76,6 +83,8 @@ extern uint8_t LEDSon; extern trigtime shottime[TRIGGERS_AMOUNT]; // if trigger[N] shots, the bit N will be 1 extern uint8_t trigger_shot; +// time when Buzzer was turned ON +extern uint32_t BuzzerTime; void hw_setup(); diff --git a/F1-nolib/chronometer/lidar.c b/F1-nolib/chronometer/lidar.c index dc363c6..ae37189 100644 --- a/F1-nolib/chronometer/lidar.c +++ b/F1-nolib/chronometer/lidar.c @@ -33,6 +33,7 @@ void parse_lidar_data(char *txt){ lidar_triggered_dist = last_lidar_dist; return; } + IWDG->KR = IWDG_REFRESH; if(triggered){ // check if body gone if(last_lidar_dist < the_conf.dist_min || last_lidar_dist > the_conf.dist_max || last_lidar_dist > lidar_triggered_dist + LIDAR_DIST_THRES){ triggered = 0; diff --git a/F1-nolib/chronometer/main.c b/F1-nolib/chronometer/main.c index 7723301..66c8916 100644 --- a/F1-nolib/chronometer/main.c +++ b/F1-nolib/chronometer/main.c @@ -74,10 +74,10 @@ char *parse_cmd(char *buf){ static char btns[] = "BTN0=0, BTN1=0, BTN2=0, PPS=0\n"; switch(*buf){ case '0': - LED_off(); + LED_off(); // LED0 off @dbg break; case '1': - LED_on(); + LED_on(); // LED0 on @dbg break; case 'b': btns[5] = gettrig(0) + '0'; @@ -179,12 +179,23 @@ static char *get_USB(){ return NULL; } -/* void linecoding_handler(usb_LineCoding __attribute__((unused)) *lc){ // get/set line coding - DBG("linecoding_handler"); -}*/ +#ifdef EBUG + SEND("Change speed to"); + printu(1, lc->dwDTERate); + newline(); +#endif +} void clstate_handler(uint16_t __attribute__((unused)) val){ // lesser bits of val: RTS|DTR + static uint32_t Tlast = 0; + SEND("Tms/Tlast: "); + printu(1, Tms); + newline(); + printu(1, Tlast); + newline(); + if(Tms - Tlast < 500) return; + Tlast = Tms; USB_send("Chronometer version " VERSION ".\n"); #ifdef EBUG if(val & 2){ @@ -198,17 +209,19 @@ void clstate_handler(uint16_t __attribute__((unused)) val){ // lesser bits of va #endif } -/* void break_handler(){ // client disconnected - DBG("break_handler"); -}*/ + DBG("Disconnected"); +} + +#ifdef EBUG +extern int32_t ticksdiff, timecntr, timerval, Tms1; +extern uint32_t last_corr_time; +#endif int main(void){ uint32_t lastT = 0; sysreset(); StartHSE(); - LED1_off(); - USBPU_OFF(); SysTick_Config(SYSTICK_DEFCONF); // function SysTick_Config decrements argument! // read data stored in flash get_userconf(); @@ -218,7 +231,7 @@ int main(void){ USBPU_ON(); usarts_setup(); #ifdef EBUG - SEND("Chronometer version " VERSION ".\n"); + SEND("This is chronometer version " VERSION ".\n"); if(RCC->CSR & RCC_CSR_IWDGRSTF){ // watchdog reset occured SEND("WDGRESET=1\n"); } @@ -227,16 +240,28 @@ int main(void){ } #endif RCC->CSR |= RCC_CSR_RMVF; // remove reset flags - iwdg_setup(); - + //iwdg_setup(); while (1){ IWDG->KR = IWDG_REFRESH; // refresh watchdog + if(Timer > 499) LED_on(); // turn ON LED0 over 0.25s after PPS pulse + if(BuzzerTime && Tms - BuzzerTime > 249){ + BUZZER_OFF(); + BuzzerTime = 0; + } if(lastT > Tms || Tms - lastT > 499){ if(need2startseq) GPS_send_start_seq(); - LED_blink(); - if(GPS_status != GPS_VALID) LED1_blink(); - else LED1_on(); + IWDG->KR = IWDG_REFRESH; + switch(GPS_status){ + case GPS_VALID: + LED1_blink(); // blink LED1 @ VALID time + break; + case GPS_NOT_VALID: + LED1_on(); // shine LED1 @ NON-VALID time + break; + default: + LED1_off(); // turn off LED1 if GPS not found or time unknown + } lastT = Tms; if(usartrx(LIDAR_USART)){ char *txt; @@ -245,14 +270,42 @@ int main(void){ DBG(txt); } } + IWDG->KR = IWDG_REFRESH; #if defined EBUG || defined USART1PROXY transmit_tbuf(1); // non-blocking transmission of data from UART buffer every 0.5s #endif transmit_tbuf(GPS_USART); transmit_tbuf(LIDAR_USART); +#ifdef EBUG + static uint8_t x = 1; + if(timecntr){ + if(x){ + SEND("ticksdiff="); + if(ticksdiff < 0){ + SEND("-"); + printu(1, -ticksdiff); + }else printu(1, ticksdiff); + SEND(", timecntr="); + printu(1, timecntr); + SEND("\nlast_corr_time="); + printu(1, last_corr_time); + SEND(", Tms="); + printu(1, Tms1); + SEND("\nTimer="); + printu(1, timerval); + SEND(", LOAD="); + printu(1, SysTick->LOAD); + newline(); + } + x = !x; + } +#endif } + IWDG->KR = IWDG_REFRESH; if(trigger_shot) show_trigger_shot(trigger_shot); + IWDG->KR = IWDG_REFRESH; usb_proc(); + IWDG->KR = IWDG_REFRESH; int r = 0; char *txt; if((txt = get_USB())){ @@ -260,6 +313,7 @@ int main(void){ DBG(txt); if(parse_USBCMD(txt)) USB_send(txt); // echo back non-commands data + IWDG->KR = IWDG_REFRESH; } #if defined EBUG || defined USART1PROXY if(usartrx(1)){ // usart1 received data, store in in buffer @@ -268,18 +322,23 @@ int main(void){ txt[r] = 0; #ifdef EBUG char *ans = parse_cmd(txt); + IWDG->KR = IWDG_REFRESH; if(ans){ transmit_tbuf(1); + IWDG->KR = IWDG_REFRESH; usart_send(1, ans); transmit_tbuf(1); + IWDG->KR = IWDG_REFRESH; } #else // USART1PROXY - send received data to GPS usart_send(GPS_USART, txt); + IWDG->KR = IWDG_REFRESH; #endif } } #endif if(usartrx(GPS_USART)){ + IWDG->KR = IWDG_REFRESH; r = usart_getline(GPS_USART, &txt); if(r){ txt[r] = 0; @@ -287,6 +346,7 @@ int main(void){ } } if(usartrx(LIDAR_USART)){ + IWDG->KR = IWDG_REFRESH; r = usart_getline(LIDAR_USART, &txt); if(r){ parse_lidar_data(txt); diff --git a/F1-nolib/chronometer/str.c b/F1-nolib/chronometer/str.c index d48ce5e..a51e7b0 100644 --- a/F1-nolib/chronometer/str.c +++ b/F1-nolib/chronometer/str.c @@ -106,6 +106,7 @@ int parse_USBCMD(char *cmd){ CMD_ADCMAX " - max ADC value treshold for trigger\n" CMD_ADCMIN " - min -//- (triggered when ADval>min & 1) goto bad_number; + USB_send("BUZZER="); + if(Nt){ + BuzzerTime = 0; + buzzer_on = 1; + USB_send("ON\n"); + }else{ + BuzzerTime = 0; + buzzer_on = 0; + USB_send("OFF\n"); + } }else return 1; IWDG->KR = IWDG_REFRESH; if(succeed) USB_send("Success!\n"); diff --git a/F1-nolib/chronometer/str.h b/F1-nolib/chronometer/str.h index a577328..399c415 100644 --- a/F1-nolib/chronometer/str.h +++ b/F1-nolib/chronometer/str.h @@ -41,6 +41,7 @@ #define CMD_GETADCVAL "adcval" #define CMD_LEDS "leds" #define CMD_GPSRESTART "gpsrestart" +#define CMD_BUZZER "buzzer" extern uint8_t showGPSstr; diff --git a/F1-nolib/chronometer/time.c b/F1-nolib/chronometer/time.c index 1eef0c3..cd23253 100644 --- a/F1-nolib/chronometer/time.c +++ b/F1-nolib/chronometer/time.c @@ -27,9 +27,6 @@ volatile uint32_t Timer; // milliseconds counter curtime current_time = TMNOTINI; -// ms counter in last correction by PPS -static uint32_t last_corr_time = 0; - static inline uint8_t atou(const char *b){ return (b[0]-'0')*10 + b[1]-'0'; } @@ -39,11 +36,16 @@ static inline uint8_t atou(const char *b){ * @param buf - buffer with time data (HHMMSS) */ void set_time(const char *buf){ - uint8_t H = atou(buf) + TIMEZONE_GMT_PLUS; + uint8_t H = atou(buf);// + TIMEZONE_GMT_PLUS; if(H > 23) H -= 24; current_time.H = H; current_time.M = atou(&buf[2]); current_time.S = atou(&buf[4]); +#ifdef EBUG + SEND("set_time, Tms: "); printu(1, Tms); + SEND("; Timer: "); printu(1, Timer); + newline(); +#endif } /** @@ -66,6 +68,17 @@ void time_increment(){ #endif } +static char *puttwo(uint8_t N, char *buf){ + if(N < 10){ + *buf++ = '0'; + }else{ + *buf++ = N/10 + '0'; + N %= 10; + } + *buf++ = N + '0'; + return buf; +} + /** * print time: Tm - time structure, T - milliseconds */ @@ -92,14 +105,11 @@ char *get_time(curtime *Tm, uint32_t T){ T %= 10; }else *bptr++ = '0'; *bptr++ = T + '0'; - if(GPS_status == GPS_NOT_VALID){ - strcpy(bptr, " (not valid)"); - bptr += 12; - } - if(Tms - last_corr_time > 1000){ - strcpy(bptr, " need PPS sync"); - bptr += 14; - } + // put current time in HH:MM:SS format into buf + *bptr++ = ' '; *bptr++ = '('; + bptr = puttwo(Tm->H, bptr); *bptr++ = ':'; + bptr = puttwo(Tm->M, bptr); *bptr++ = ':'; + bptr = puttwo(Tm->S, bptr); *bptr++ = ')'; if(GPS_status == GPS_NOTFOUND){ strcpy(bptr, " GPS not found"); bptr += 14; @@ -109,6 +119,13 @@ char *get_time(curtime *Tm, uint32_t T){ return bstart; } + +#ifdef EBUG +int32_t ticksdiff=0, timecntr=0, timerval, Tms1; +#endif + +uint32_t last_corr_time = 0; + /** * @brief systick_correction * Makes correction of system timer @@ -126,61 +143,38 @@ char *get_time(curtime *Tm, uint32_t T){ */ void systick_correction(){ SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk; // stop systick for a while - int32_t systick_val = SysTick->VAL, L = SysTick->LOAD + 1, timer_val = Timer; + uint32_t systick_val = SysTick->VAL, L = SysTick->LOAD + 1; + int32_t timer_val = Timer; + timerval = Timer; + Tms1 = Tms; + Timer = 0; SysTick->VAL = SysTick->LOAD; SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk; // start it again - Timer = 0; - if(Tms - last_corr_time < 2000){ // calculate corrections only if Timer was zeroed last time - if(timer_val < 500) timer_val += 1000; // timer already incremented in SysTick interrupt - else time_increment(); // counter less than 1000 -> need to increment time - int32_t D = L * (timer_val - 999) - systick_val; - D /= 1000; +// if(systick_val != SysTick->LOAD) ++Tms; + if(timer_val > 500) time_increment(); // counter greater than 500 -> need to increment time + if(last_corr_time){ + if(Tms - last_corr_time < 1500){ // there was perevious PPS signal + int32_t D = L * (Tms - 1000 - last_corr_time) + (SysTick->LOAD - systick_val); // amount of spare ticks + ++timecntr; + ticksdiff += D; + uint32_t ticksabs = (ticksdiff < 0) ? -ticksdiff : ticksdiff; + // 10000 == 30 seconds * 1000 interrupts per second + if(ticksabs > 30000 && timecntr > 30){ // need correction (not more often than each 10s) + ticksdiff /= timecntr * 1000; // correction per one interrupt + SysTick->LOAD += ticksdiff; + timecntr = 0; + ticksdiff = 0; + last_corr_time = 0; #ifdef EBUG - SEND("Delta: "); if(D < 0){usart_putchar(1, '-'); printu(1, -D);} else printu(1, D); newline(); - SEND(get_time(¤t_time, 0)); + SEND("Correction\n"); #endif - SysTick->LOAD += D; + } + }else{ + timecntr = 0; + ticksdiff = 0; + last_corr_time = 0; + } } last_corr_time = Tms; -#if 0 - uint32_t t = 0, ticks; - static uint32_t ticksavr = 0, N = 0, last_corr_time = 0; - // correct - int32_t systick_val = SysTick->VAL; - // SysTick->LOAD values for all milliseconds (RVR0) and last millisecond (RVR1) - SysTick->VAL = RVR0; - int32_t timer_val = Timer; - Timer = 0; - // RVR -> SysTick->LOAD - systick_val = SysTick->LOAD + 1 - systick_val; // Systick counts down! - if(timer_val < 10) timer_val += 1000; // our closks go faster than real - else if(timer_val < 990){ // something wrong - RVR0 = RVR1 = SYSTICK_DEFLOAD; - SysTick->LOAD = RVR0; - need_sync = 1; - goto theend; - }else - time_increment(); // ms counter less than 1000 - we need to increment time - t = current_time.H * 3600 + current_time.M * 60 + current_time.S; - if(t - last_corr_time == 1){ // PPS interval == 1s - ticks = systick_val + (timer_val-1)*(RVR0 + 1) + RVR1 + 1; - ++N; - ticksavr += ticks; - if(N > 20){ - ticks = ticksavr / N; - RVR0 = ticks / 1000 - 1; // main RVR value - SysTick->LOAD = RVR0; - RVR1 = RVR0 + ticks % 1000; // last millisecond RVR value (with fine correction) - N = 0; - ticksavr = 0; - need_sync = 0; - } - }else{ - N = 0; - ticksavr = 0; - } -theend: - last_corr_time = t; -#endif }