1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-26 09:45:21 +03:00

[stock/gruvin9x] Better synchro when the mixer duration increases! Safety check on mixer interval.

This commit is contained in:
bsongis 2012-11-21 10:10:12 +00:00
parent 92a7363abc
commit efe8c2ec8c
8 changed files with 19 additions and 21 deletions

View file

@ -296,5 +296,3 @@ void readKeysAndTrims()
++enuk; ++enuk;
} }
} }
uint16_t nextMixerTime = 0;

View file

@ -34,14 +34,11 @@
#ifndef board_gruvin9x_h #ifndef board_gruvin9x_h
#define board_gruvin9x_h #define board_gruvin9x_h
extern uint16_t nextMixerTime;
#define TIMER_16KHZ_VECT TIMER2_OVF_vect #define TIMER_16KHZ_VECT TIMER2_OVF_vect
#define COUNTER_16KHZ TCNT2 #define COUNTER_16KHZ TCNT2
#define TIMER_10MS_VECT TIMER2_COMPA_vect #define TIMER_10MS_VECT TIMER2_COMPA_vect
#define PAUSE_10MS_INTERRUPT() TIMSK2 &= ~(1<<OCIE2A) #define PAUSE_10MS_INTERRUPT() TIMSK2 &= ~(1<<OCIE2A)
#define RESUME_10MS_INTERRUPT() TIMSK2 |= (1<<OCIE2A) #define RESUME_10MS_INTERRUPT() TIMSK2 |= (1<<OCIE2A)
#define SCHEDULE_MIXER(delay) nextMixerTime = getTmr16KHz() + (delay)
#define PAUSE_PULSES_INTERRUPT() TIMSK1 &= ~(1<<OCIE1A) #define PAUSE_PULSES_INTERRUPT() TIMSK1 &= ~(1<<OCIE1A)
#define RESUME_PULSES_INTERRUPT() TIMSK1 |= (1<<OCIE1A) #define RESUME_PULSES_INTERRUPT() TIMSK1 |= (1<<OCIE1A)
#define PAUSE_PPMIN_INTERRUPT() TIMSK3 &= ~(1<<ICIE3) #define PAUSE_PPMIN_INTERRUPT() TIMSK3 &= ~(1<<ICIE3)

View file

@ -199,6 +199,3 @@ bool checkSlaveMode()
} }
return lastSlaveMode; return lastSlaveMode;
} }
uint16_t nextMixerTime = 0;

View file

@ -34,8 +34,6 @@
#ifndef board_stock_h #ifndef board_stock_h
#define board_stock_h #define board_stock_h
extern uint16_t nextMixerTime;
#define TIMER_16KHZ_VECT TIMER0_OVF_vect #define TIMER_16KHZ_VECT TIMER0_OVF_vect
#define COUNTER_16KHZ TCNT0 #define COUNTER_16KHZ TCNT0
@ -46,8 +44,6 @@ extern uint16_t nextMixerTime;
#define PAUSE_PULSES_INTERRUPT() TIMSK &= ~(1<<OCIE1A); #define PAUSE_PULSES_INTERRUPT() TIMSK &= ~(1<<OCIE1A);
#define RESUME_PULSES_INTERRUPT() TIMSK |= (1<<OCIE1A) #define RESUME_PULSES_INTERRUPT() TIMSK |= (1<<OCIE1A)
#define SCHEDULE_MIXER(delay) nextMixerTime = getTmr16KHz() + (delay)
#define PAUSE_PPMIN_INTERRUPT() ETIMSK &= ~(1<<TICIE3) #define PAUSE_PPMIN_INTERRUPT() ETIMSK &= ~(1<<TICIE3)
#define RESUME_PPMIN_INTERRUPT() ETIMSK |= (1<<TICIE3) #define RESUME_PPMIN_INTERRUPT() ETIMSK |= (1<<TICIE3)

View file

@ -104,11 +104,13 @@ BYTE CardType; /* Card type flags */
#else #else
inline void checkMixer() inline void checkMixer()
{ {
// TODO duplicated code ...
uint16_t t0 = getTmr16KHz(); uint16_t t0 = getTmr16KHz();
int16_t delta = t0 - nextMixerTime; int16_t delta = (nextMixerEndTime - lastMixerDuration) - t0;
if (delta < 0) return; if (delta > 0 && delta < MAX_MIXER_DELTA) return;
nextMixerEndTime = t0 + MAX_MIXER_DELTA;
nextMixerTime = t0 + 20*16;
doMixerCalculations(); doMixerCalculations();
t0 = getTmr16KHz() - t0; t0 = getTmr16KHz() - t0;

View file

@ -2822,10 +2822,11 @@ void perMain()
doMixerCalculations(); doMixerCalculations();
#elif !defined(PCBSKY9X) #elif !defined(PCBSKY9X)
uint16_t t0 = getTmr16KHz(); uint16_t t0 = getTmr16KHz();
int16_t delta = t0 - nextMixerTime; int16_t delta = (nextMixerEndTime - lastMixerDuration) - t0;
if (delta < 0) return; if (delta > 0 && delta < MAX_MIXER_DELTA) return;
nextMixerEndTime = t0 + MAX_MIXER_DELTA;
nextMixerTime = t0 + 20*16;
doMixerCalculations(); doMixerCalculations();
t0 = getTmr16KHz() - t0; t0 = getTmr16KHz() - t0;

View file

@ -33,6 +33,9 @@
#include "open9x.h" #include "open9x.h"
uint16_t nextMixerEndTime = 0;
#define SCHEDULE_MIXER_END(delay) nextMixerEndTime = getTmr16KHz() + (delay) - 2*16/*2ms*/
#if defined(DSM2) #if defined(DSM2)
// DSM2 control bits // DSM2 control bits
#define DSM2_CHANS 6 #define DSM2_CHANS 6
@ -883,7 +886,7 @@ void setupPulses()
#ifdef PXX #ifdef PXX
case PROTO_PXX: case PROTO_PXX:
// schedule next Mixer calculations // schedule next Mixer calculations
SCHEDULE_MIXER(20*16-lastMixerDuration-2*16/*1ms*/); SCHEDULE_MIXER_END(20*16);
sei(); sei();
setupPulsesPXX(); setupPulsesPXX();
break; break;
@ -892,7 +895,7 @@ void setupPulses()
#ifdef DSM2 #ifdef DSM2
case PROTO_DSM2: case PROTO_DSM2:
// schedule next Mixer calculations // schedule next Mixer calculations
SCHEDULE_MIXER(22*16-lastMixerDuration-2*16/*1ms*/); SCHEDULE_MIXER_END(22*16);
sei(); sei();
setupPulsesDsm2(); // Different versions for DSM2=SERIAL vs. DSM2=PPM setupPulsesDsm2(); // Different versions for DSM2=SERIAL vs. DSM2=PPM
#if defined(PCBGRUVIN9X) && defined(DSM2_PPM) #if defined(PCBGRUVIN9X) && defined(DSM2_PPM)
@ -916,7 +919,7 @@ void setupPulses()
g_ppmPulsePolarity = g_model.pulsePol; g_ppmPulsePolarity = g_model.pulsePol;
#endif #endif
// schedule next Mixer calculations // 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 // no sei here
setupPulsesPPM(PROTO_PPM); setupPulsesPPM(PROTO_PPM);
// if PPM16, PPM16 pulses are set up automatically within the interrupts // if PPM16, PPM16 pulses are set up automatically within the interrupts

View file

@ -40,6 +40,10 @@ extern uint8_t s_pulses_paused;
extern uint8_t *pulses2MHzRPtr; extern uint8_t *pulses2MHzRPtr;
extern uint8_t *pulses2MHzWPtr; 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(); void startPulses();
inline bool pulsesStarted() { return s_current_protocol != 255; } inline bool pulsesStarted() { return s_current_protocol != 255; }
inline void pausePulses() { s_pulses_paused = true; } inline void pausePulses() { s_pulses_paused = true; }