mirror of
https://github.com/pascallanger/DIY-Multiprotocol-TX-Module.git
synced 2025-02-09 23:08:12 +00:00
Changed serial timer source
This commit is contained in:
parent
ca15d7108f
commit
19b931223b
@ -19,7 +19,7 @@
|
|||||||
#define VERSION_MAJOR 1
|
#define VERSION_MAJOR 1
|
||||||
#define VERSION_MINOR 3
|
#define VERSION_MINOR 3
|
||||||
#define VERSION_REVISION 0
|
#define VERSION_REVISION 0
|
||||||
#define VERSION_PATCH_LEVEL 31
|
#define VERSION_PATCH_LEVEL 32
|
||||||
|
|
||||||
//******************
|
//******************
|
||||||
// Protocols
|
// Protocols
|
||||||
|
@ -55,6 +55,7 @@
|
|||||||
#include <SPI.h>
|
#include <SPI.h>
|
||||||
#include <EEPROM.h>
|
#include <EEPROM.h>
|
||||||
HardwareTimer HWTimer2(2);
|
HardwareTimer HWTimer2(2);
|
||||||
|
HardwareTimer HWTimer3(3);
|
||||||
|
|
||||||
void PPM_decode();
|
void PPM_decode();
|
||||||
void ISR_COMPB();
|
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
|
uint8_t packet_in[TELEMETRY_BUFFER_SIZE];//telemetry receiving packets
|
||||||
#if defined(TELEMETRY)
|
#if defined(TELEMETRY)
|
||||||
#ifdef MULTI_SYNC
|
#ifdef MULTI_SYNC
|
||||||
uint32_t last_serial_input=0;
|
uint16_t last_serial_input=0;
|
||||||
uint16_t inputRefreshRate = 7000;
|
uint16_t inputRefreshRate=0;
|
||||||
#endif
|
#endif
|
||||||
#ifdef INVERT_TELEMETRY
|
#ifdef INVERT_TELEMETRY
|
||||||
#if not defined(ORANGE_TX) && not defined(STM32_BOARD)
|
#if not defined(ORANGE_TX) && not defined(STM32_BOARD)
|
||||||
@ -590,16 +591,13 @@ void loop()
|
|||||||
if((diff&0x8000) && !(next_callback&0x8000))
|
if((diff&0x8000) && !(next_callback&0x8000))
|
||||||
{ // Negative result=callback should already have been called...
|
{ // Negative result=callback should already have been called...
|
||||||
debugln("Short CB:%d",next_callback);
|
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
|
else
|
||||||
{
|
{
|
||||||
if(IS_RX_FLAG_on || IS_PPM_FLAG_on)
|
if(IS_RX_FLAG_on || IS_PPM_FLAG_on)
|
||||||
{ // Serial or PPM is waiting...
|
{ // Serial or PPM is waiting...
|
||||||
if(++count>10)
|
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;
|
count=0;
|
||||||
debugln("Force update");
|
debugln("Force update");
|
||||||
Update_All();
|
Update_All();
|
||||||
@ -614,8 +612,8 @@ void loop()
|
|||||||
if(diff>900*2)
|
if(diff>900*2)
|
||||||
{ //If at least 1ms is available update values
|
{ //If at least 1ms is available update values
|
||||||
if((diff&0x8000) && !(next_callback&0x8000))
|
if((diff&0x8000) && !(next_callback&0x8000))
|
||||||
{//should never be here
|
{//Should never get here but it is...
|
||||||
debugln("Strange");
|
debugln("!!!BUG!!!");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
count=0;
|
count=0;
|
||||||
@ -957,7 +955,7 @@ static void protocol_init()
|
|||||||
// reset telemetry
|
// reset telemetry
|
||||||
#ifdef TELEMETRY
|
#ifdef TELEMETRY
|
||||||
#ifdef MULTI_SYNC
|
#ifdef MULTI_SYNC
|
||||||
inputRefreshRate = 7000; // Default value
|
inputRefreshRate = 0; // Don't do it unless the protocol asks for it
|
||||||
#endif
|
#endif
|
||||||
#ifdef MULTI_NAMES
|
#ifdef MULTI_NAMES
|
||||||
multi_protocols_index = 0xFF;
|
multi_protocols_index = 0xFF;
|
||||||
@ -1863,14 +1861,24 @@ void modules_reset()
|
|||||||
TIMER2_BASE->ARR = 0xFFFF; // Count until 0xFFFF
|
TIMER2_BASE->ARR = 0xFFFF; // Count until 0xFFFF
|
||||||
|
|
||||||
HWTimer2.setMode(TIMER_CH1, TIMER_OUTPUT_COMPARE); // Main scheduler
|
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
|
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
|
TIMER2_BASE->DIER &= ~TIMER_DIER_CC2IE; // Disable Timer2/Comp2 interrupt
|
||||||
|
|
||||||
HWTimer2.refresh(); // Refresh the timer's count, prescale, and overflow
|
HWTimer2.refresh(); // Refresh the timer's count, prescale, and overflow
|
||||||
HWTimer2.resume();
|
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
|
#endif
|
||||||
|
|
||||||
@ -2102,9 +2110,9 @@ static uint32_t random_id(uint16_t address, uint8_t create_new)
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#if defined STM32_BOARD
|
#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)
|
||||||
TIMER2_BASE->SR = 0x1E5F & ~TIMER_SR_CC2IF; // Clear Timer2/Comp2 interrupt flag
|
TIMER3_BASE->SR = 0x1E5F & ~TIMER_SR_CC2IF; // Clear Timer3/Comp2 interrupt flag
|
||||||
TIMER2_BASE->DIER |= TIMER_DIER_CC2IE; // Enable Timer2/Comp2 interrupt
|
TIMER3_BASE->DIER |= TIMER_DIER_CC2IE; // Enable Timer3/Comp2 interrupt
|
||||||
#else
|
#else
|
||||||
TX_RX_PAUSE_on;
|
TX_RX_PAUSE_on;
|
||||||
tx_pause();
|
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
|
rx_buff[rx_idx++]=UDR0; // Store received byte
|
||||||
#if defined STM32_BOARD
|
#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
|
#else
|
||||||
cli(); // Disable global int due to RW of 16 bits registers
|
cli(); // Disable global int due to RW of 16 bits registers
|
||||||
OCR1B = TCNT1 + 500; // Next byte should show up within 250us (1 byte = 120us)
|
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)
|
if(discard_frame==true)
|
||||||
{
|
{
|
||||||
#ifdef STM32_BOARD
|
#ifdef STM32_BOARD
|
||||||
TIMER2_BASE->DIER &= ~TIMER_DIER_CC2IE; // Disable Timer2/Comp2 interrupt
|
TIMER3_BASE->DIER &= ~TIMER_DIER_CC2IE; // Disable Timer3/Comp2 interrupt
|
||||||
#else
|
#else
|
||||||
CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match
|
CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match
|
||||||
TX_RX_PAUSE_off;
|
TX_RX_PAUSE_off;
|
||||||
@ -2171,9 +2179,6 @@ static uint32_t random_id(uint16_t address, uint8_t create_new)
|
|||||||
{ // Timer1 compare B interrupt
|
{ // Timer1 compare B interrupt
|
||||||
if(rx_idx>=26 && rx_idx<RXBUFFER_SIZE)
|
if(rx_idx>=26 && rx_idx<RXBUFFER_SIZE)
|
||||||
{
|
{
|
||||||
#ifdef MULTI_SYNC
|
|
||||||
last_serial_input=TCNT1;
|
|
||||||
#endif
|
|
||||||
// A full frame has been received
|
// A full frame has been received
|
||||||
if(!IS_RX_DONOTUPDATE_on)
|
if(!IS_RX_DONOTUPDATE_on)
|
||||||
{ //Good frame received and main is not working on the buffer
|
{ //Good frame received and main is not working on the buffer
|
||||||
@ -2183,6 +2188,11 @@ static uint32_t random_id(uint16_t address, uint8_t create_new)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
RX_MISSED_BUFF_on; // Notify that rx_buff is good
|
RX_MISSED_BUFF_on; // Notify that rx_buff is good
|
||||||
|
#ifdef MULTI_SYNC
|
||||||
|
cli();
|
||||||
|
last_serial_input=TCNT1;
|
||||||
|
sei();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
#ifdef DEBUG_SERIAL
|
#ifdef DEBUG_SERIAL
|
||||||
else
|
else
|
||||||
@ -2190,8 +2200,7 @@ static uint32_t random_id(uint16_t address, uint8_t create_new)
|
|||||||
#endif
|
#endif
|
||||||
discard_frame=true;
|
discard_frame=true;
|
||||||
#ifdef STM32_BOARD
|
#ifdef STM32_BOARD
|
||||||
TIMER2_BASE->DIER &= ~TIMER_DIER_CC2IE; // Disable Timer2/Comp2 interrupt
|
TIMER3_BASE->DIER &= ~TIMER_DIER_CC2IE; // Disable Timer3/Comp2 interrupt
|
||||||
TIMER2_BASE->SR = 0x1E5F & ~TIMER_SR_CC2IF; // Clear Timer2/Comp2 interrupt flag
|
|
||||||
#else
|
#else
|
||||||
CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match
|
CLR_TIMSK1_OCIE1B; // Disable interrupt on compare B match
|
||||||
TX_RX_PAUSE_off;
|
TX_RX_PAUSE_off;
|
||||||
|
@ -91,16 +91,14 @@ static void telemetry_set_input_sync(uint16_t refreshRate)
|
|||||||
inputRefreshRate = refreshRate;
|
inputRefreshRate = refreshRate;
|
||||||
if (last_serial_input != 0)
|
if (last_serial_input != 0)
|
||||||
{
|
{
|
||||||
#if defined STM32_BOARD
|
cli(); // Disable global int due to RW of 16 bits registers
|
||||||
inputDelay=TIMER2_BASE->CNT;
|
inputDelay = TCNT1;
|
||||||
#else
|
sei(); // Enable global int
|
||||||
cli(); // Disable global int due to RW of 16 bits registers
|
//inputDelay = (inputDelay - last_serial_input)>>1;
|
||||||
inputDelay = TCNT1;
|
inputDelay -= last_serial_input;
|
||||||
sei(); // Enable global int
|
//if(inputDelay & 0x8000)
|
||||||
#endif
|
// inputDelay = inputDelay - 0x8000;
|
||||||
inputDelay = (inputDelay - last_serial_input)>>1;
|
debugln("D=%d",inputDelay);
|
||||||
if(inputDelay > 0x8000)
|
|
||||||
inputDelay =inputDelay - 0x8000;
|
|
||||||
last_serial_input=0;
|
last_serial_input=0;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
@ -114,8 +112,10 @@ static void telemetry_set_input_sync(uint16_t refreshRate)
|
|||||||
multi_send_header(MULTI_TELEMETRY_SYNC, 6);
|
multi_send_header(MULTI_TELEMETRY_SYNC, 6);
|
||||||
Serial_write(inputRefreshRate >> 8);
|
Serial_write(inputRefreshRate >> 8);
|
||||||
Serial_write(inputRefreshRate & 0xff);
|
Serial_write(inputRefreshRate & 0xff);
|
||||||
Serial_write(inputDelay >> 8);
|
// Serial_write(inputDelay >> 8);
|
||||||
Serial_write(inputDelay & 0xff);
|
// Serial_write(inputDelay & 0xff);
|
||||||
|
Serial_write(inputDelay >> 9);
|
||||||
|
Serial_write(inputDelay >> 1);
|
||||||
Serial_write(INPUT_SYNC_TIME);
|
Serial_write(INPUT_SYNC_TIME);
|
||||||
Serial_write(INPUT_ADDITIONAL_DELAY);
|
Serial_write(INPUT_ADDITIONAL_DELAY);
|
||||||
}
|
}
|
||||||
@ -841,7 +841,7 @@ void TelemetryUpdate()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#ifdef MULTI_SYNC
|
#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();
|
mult_send_inputsync();
|
||||||
lastInputSync = now;
|
lastInputSync = now;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user