diff --git a/src/board_gruvin9x.cpp b/src/board_gruvin9x.cpp index fbf7413c8..3fb2512c6 100644 --- a/src/board_gruvin9x.cpp +++ b/src/board_gruvin9x.cpp @@ -296,5 +296,3 @@ void readKeysAndTrims() ++enuk; } } - -uint16_t nextMixerTime = 0; diff --git a/src/board_gruvin9x.h b/src/board_gruvin9x.h index aabba787c..4f9048169 100644 --- a/src/board_gruvin9x.h +++ b/src/board_gruvin9x.h @@ -34,14 +34,11 @@ #ifndef board_gruvin9x_h #define board_gruvin9x_h -extern uint16_t nextMixerTime; - #define TIMER_16KHZ_VECT TIMER2_OVF_vect #define COUNTER_16KHZ TCNT2 #define TIMER_10MS_VECT TIMER2_COMPA_vect #define PAUSE_10MS_INTERRUPT() TIMSK2 &= ~(1< 0 && delta < MAX_MIXER_DELTA) return; + + nextMixerEndTime = t0 + MAX_MIXER_DELTA; - nextMixerTime = t0 + 20*16; doMixerCalculations(); t0 = getTmr16KHz() - t0; diff --git a/src/open9x.cpp b/src/open9x.cpp index 62695c4e6..01aaccf9c 100644 --- a/src/open9x.cpp +++ b/src/open9x.cpp @@ -2822,10 +2822,11 @@ void perMain() doMixerCalculations(); #elif !defined(PCBSKY9X) uint16_t t0 = getTmr16KHz(); - int16_t delta = t0 - nextMixerTime; - if (delta < 0) return; + int16_t delta = (nextMixerEndTime - lastMixerDuration) - t0; + if (delta > 0 && delta < MAX_MIXER_DELTA) return; + + nextMixerEndTime = t0 + MAX_MIXER_DELTA; - nextMixerTime = t0 + 20*16; doMixerCalculations(); t0 = getTmr16KHz() - t0; diff --git a/src/pulses_avr.cpp b/src/pulses_avr.cpp index 9e957879e..2931c1ae8 100644 --- a/src/pulses_avr.cpp +++ b/src/pulses_avr.cpp @@ -33,6 +33,9 @@ #include "open9x.h" +uint16_t nextMixerEndTime = 0; +#define SCHEDULE_MIXER_END(delay) nextMixerEndTime = getTmr16KHz() + (delay) - 2*16/*2ms*/ + #if defined(DSM2) // DSM2 control bits #define DSM2_CHANS 6 @@ -883,7 +886,7 @@ void setupPulses() #ifdef PXX case PROTO_PXX: // schedule next Mixer calculations - SCHEDULE_MIXER(20*16-lastMixerDuration-2*16/*1ms*/); + SCHEDULE_MIXER_END(20*16); sei(); setupPulsesPXX(); break; @@ -892,7 +895,7 @@ void setupPulses() #ifdef DSM2 case PROTO_DSM2: // schedule next Mixer calculations - SCHEDULE_MIXER(22*16-lastMixerDuration-2*16/*1ms*/); + SCHEDULE_MIXER_END(22*16); sei(); setupPulsesDsm2(); // Different versions for DSM2=SERIAL vs. DSM2=PPM #if defined(PCBGRUVIN9X) && defined(DSM2_PPM) @@ -916,7 +919,7 @@ void setupPulses() g_ppmPulsePolarity = g_model.pulsePol; #endif // schedule next Mixer calculations - SCHEDULE_MIXER(45*8+g_model.ppmFrameLength*8-lastMixerDuration-2*16/*1ms*/); + SCHEDULE_MIXER_END(45*8+g_model.ppmFrameLength*8); // no sei here setupPulsesPPM(PROTO_PPM); // if PPM16, PPM16 pulses are set up automatically within the interrupts diff --git a/src/pulses_avr.h b/src/pulses_avr.h index 98d471ce8..589b288c9 100644 --- a/src/pulses_avr.h +++ b/src/pulses_avr.h @@ -40,6 +40,10 @@ extern uint8_t s_pulses_paused; extern uint8_t *pulses2MHzRPtr; extern uint8_t *pulses2MHzWPtr; +extern uint16_t nextMixerEndTime; + +#define MAX_MIXER_DELTA (50*16) /* 50ms max as an interval between 2 mixer calculations */ + void startPulses(); inline bool pulsesStarted() { return s_current_protocol != 255; } inline void pausePulses() { s_pulses_paused = true; }