From 19b931223b6da3bd3c71e2dc96a418868f4783e8 Mon Sep 17 00:00:00 2001 From: pascallanger Date: Sun, 3 Nov 2019 15:46:05 +0100 Subject: [PATCH] Changed serial timer source --- Multiprotocol/Multiprotocol.h | 2 +- Multiprotocol/Multiprotocol.ino | 53 +++++++++++++++++++-------------- Multiprotocol/Telemetry.ino | 26 ++++++++-------- 3 files changed, 45 insertions(+), 36 deletions(-) diff --git a/Multiprotocol/Multiprotocol.h b/Multiprotocol/Multiprotocol.h index af9c204..521f7d2 100644 --- a/Multiprotocol/Multiprotocol.h +++ b/Multiprotocol/Multiprotocol.h @@ -19,7 +19,7 @@ #define VERSION_MAJOR 1 #define VERSION_MINOR 3 #define VERSION_REVISION 0 -#define VERSION_PATCH_LEVEL 31 +#define VERSION_PATCH_LEVEL 32 //****************** // Protocols diff --git a/Multiprotocol/Multiprotocol.ino b/Multiprotocol/Multiprotocol.ino index 3dcb562..b73cbe2 100644 --- a/Multiprotocol/Multiprotocol.ino +++ b/Multiprotocol/Multiprotocol.ino @@ -55,6 +55,7 @@ #include #include HardwareTimer HWTimer2(2); + HardwareTimer HWTimer3(3); void PPM_decode(); void ISR_COMPB(); @@ -174,8 +175,8 @@ volatile uint8_t rx_idx=0, rx_len=0; uint8_t packet_in[TELEMETRY_BUFFER_SIZE];//telemetry receiving packets #if defined(TELEMETRY) #ifdef MULTI_SYNC - uint32_t last_serial_input=0; - uint16_t inputRefreshRate = 7000; + uint16_t last_serial_input=0; + uint16_t inputRefreshRate=0; #endif #ifdef INVERT_TELEMETRY #if not defined(ORANGE_TX) && not defined(STM32_BOARD) @@ -590,16 +591,13 @@ void loop() if((diff&0x8000) && !(next_callback&0x8000)) { // Negative result=callback should already have been called... debugln("Short CB:%d",next_callback); -/* cli(); // Disable global int due to RW of 16 bits registers - OCR1A=TCNT1; // Use "now" as new sync point. - sei(); // Enable global int -*/ } + } else { if(IS_RX_FLAG_on || IS_PPM_FLAG_on) { // Serial or PPM is waiting... if(++count>10) - { //The protocol does not leave engough time for an update so forcing it + { //The protocol does not leave enough time for an update so forcing it count=0; debugln("Force update"); Update_All(); @@ -614,8 +612,8 @@ void loop() if(diff>900*2) { //If at least 1ms is available update values if((diff&0x8000) && !(next_callback&0x8000)) - {//should never be here - debugln("Strange"); + {//Should never get here but it is... + debugln("!!!BUG!!!"); break; } count=0; @@ -957,7 +955,7 @@ static void protocol_init() // reset telemetry #ifdef TELEMETRY #ifdef MULTI_SYNC - inputRefreshRate = 7000; // Default value + inputRefreshRate = 0; // Don't do it unless the protocol asks for it #endif #ifdef MULTI_NAMES multi_protocols_index = 0xFF; @@ -1863,14 +1861,24 @@ void modules_reset() TIMER2_BASE->ARR = 0xFFFF; // Count until 0xFFFF HWTimer2.setMode(TIMER_CH1, TIMER_OUTPUT_COMPARE); // Main scheduler - HWTimer2.setMode(TIMER_CH2, TIMER_OUTPUT_COMPARE); // Serial check + //HWTimer2.setMode(TIMER_CH2, TIMER_OUTPUT_COMPARE); // Serial check TIMER2_BASE->SR = 0x1E5F & ~TIMER_SR_CC2IF; // Clear Timer2/Comp2 interrupt flag - HWTimer2.attachInterrupt(TIMER_CH2,ISR_COMPB); // Assign function to Timer2/Comp2 interrupt + //HWTimer2.attachInterrupt(TIMER_CH2,ISR_COMPB); // Assign function to Timer2/Comp2 interrupt TIMER2_BASE->DIER &= ~TIMER_DIER_CC2IE; // Disable Timer2/Comp2 interrupt HWTimer2.refresh(); // Refresh the timer's count, prescale, and overflow HWTimer2.resume(); + + HWTimer3.pause(); // Pause the timer3 while we're configuring it + TIMER3_BASE->PSC = 35; // 36-1;for 72 MHZ /0.5sec/(35+1) + TIMER3_BASE->ARR = 0xFFFF; // Count until 0xFFFF + HWTimer3.setMode(TIMER_CH2, TIMER_OUTPUT_COMPARE); // Serial check + TIMER3_BASE->SR = 0x1E5F & ~TIMER_SR_CC2IF; // Clear Timer3/Comp2 interrupt flag + HWTimer3.attachInterrupt(TIMER_CH2,ISR_COMPB); // Assign function to Timer3/Comp2 interrupt + TIMER3_BASE->DIER &= ~TIMER_DIER_CC2IE; // Disable Timer3/Comp2 interrupt + HWTimer3.refresh(); // Refresh the timer's count, prescale, and overflow + HWTimer3.resume(); } #endif @@ -2102,9 +2110,9 @@ static uint32_t random_id(uint16_t address, uint8_t create_new) #endif { #if defined STM32_BOARD - TIMER2_BASE->CCR2=TIMER2_BASE->CNT + 500; // Next byte should show up within 250us (1 byte = 120us) - TIMER2_BASE->SR = 0x1E5F & ~TIMER_SR_CC2IF; // Clear Timer2/Comp2 interrupt flag - TIMER2_BASE->DIER |= TIMER_DIER_CC2IE; // Enable Timer2/Comp2 interrupt + TIMER3_BASE->CCR2=TIMER3_BASE->CNT + 500; // Next byte should show up within 250us (1 byte = 120us) + TIMER3_BASE->SR = 0x1E5F & ~TIMER_SR_CC2IF; // Clear Timer3/Comp2 interrupt flag + TIMER3_BASE->DIER |= TIMER_DIER_CC2IE; // Enable Timer3/Comp2 interrupt #else TX_RX_PAUSE_on; tx_pause(); @@ -2128,7 +2136,7 @@ static uint32_t random_id(uint16_t address, uint8_t create_new) { rx_buff[rx_idx++]=UDR0; // Store received byte #if defined STM32_BOARD - TIMER2_BASE->CCR2=TIMER2_BASE->CNT + 500; // Next byte should show up within 250us (1 byte = 120us) + TIMER3_BASE->CCR2=TIMER3_BASE->CNT + 500; // Next byte should show up within 250us (1 byte = 120us) #else cli(); // Disable global int due to RW of 16 bits registers OCR1B = TCNT1 + 500; // Next byte should show up within 250us (1 byte = 120us) @@ -2147,7 +2155,7 @@ static uint32_t random_id(uint16_t address, uint8_t create_new) if(discard_frame==true) { #ifdef STM32_BOARD - TIMER2_BASE->DIER &= ~TIMER_DIER_CC2IE; // Disable Timer2/Comp2 interrupt + TIMER3_BASE->DIER &= ~TIMER_DIER_CC2IE; // Disable Timer3/Comp2 interrupt #else CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match TX_RX_PAUSE_off; @@ -2171,9 +2179,6 @@ static uint32_t random_id(uint16_t address, uint8_t create_new) { // Timer1 compare B interrupt if(rx_idx>=26 && rx_idxDIER &= ~TIMER_DIER_CC2IE; // Disable Timer2/Comp2 interrupt - TIMER2_BASE->SR = 0x1E5F & ~TIMER_SR_CC2IF; // Clear Timer2/Comp2 interrupt flag + TIMER3_BASE->DIER &= ~TIMER_DIER_CC2IE; // Disable Timer3/Comp2 interrupt #else CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match TX_RX_PAUSE_off; diff --git a/Multiprotocol/Telemetry.ino b/Multiprotocol/Telemetry.ino index c4939bb..7104777 100644 --- a/Multiprotocol/Telemetry.ino +++ b/Multiprotocol/Telemetry.ino @@ -91,16 +91,14 @@ static void telemetry_set_input_sync(uint16_t refreshRate) inputRefreshRate = refreshRate; if (last_serial_input != 0) { - #if defined STM32_BOARD - inputDelay=TIMER2_BASE->CNT; - #else - cli(); // Disable global int due to RW of 16 bits registers - inputDelay = TCNT1; - sei(); // Enable global int - #endif - inputDelay = (inputDelay - last_serial_input)>>1; - if(inputDelay > 0x8000) - inputDelay =inputDelay - 0x8000; + cli(); // Disable global int due to RW of 16 bits registers + inputDelay = TCNT1; + sei(); // Enable global int + //inputDelay = (inputDelay - last_serial_input)>>1; + inputDelay -= last_serial_input; + //if(inputDelay & 0x8000) + // inputDelay = inputDelay - 0x8000; + debugln("D=%d",inputDelay); last_serial_input=0; } #else @@ -114,8 +112,10 @@ static void telemetry_set_input_sync(uint16_t refreshRate) multi_send_header(MULTI_TELEMETRY_SYNC, 6); Serial_write(inputRefreshRate >> 8); Serial_write(inputRefreshRate & 0xff); - Serial_write(inputDelay >> 8); - Serial_write(inputDelay & 0xff); +// Serial_write(inputDelay >> 8); +// Serial_write(inputDelay & 0xff); + Serial_write(inputDelay >> 9); + Serial_write(inputDelay >> 1); Serial_write(INPUT_SYNC_TIME); Serial_write(INPUT_ADDITIONAL_DELAY); } @@ -841,7 +841,7 @@ void TelemetryUpdate() return; } #ifdef MULTI_SYNC - if ( (now - lastInputSync) > INPUT_SYNC_TIME && protocol != PROTO_SCANNER && protocol != PROTO_FRSKY_RX && protocol != PROTO_AFHDS2A_RX && protocol != PROTO_XN297DUMP ) + if ( inputRefreshRate && (now - lastInputSync) > INPUT_SYNC_TIME ) { mult_send_inputsync(); lastInputSync = now;