1
0
Fork 0
mirror of https://github.com/opentx/opentx.git synced 2025-07-26 01:35: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;
}
}
uint16_t nextMixerTime = 0;

View file

@ -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<<OCIE2A)
#define RESUME_10MS_INTERRUPT() TIMSK2 |= (1<<OCIE2A)
#define SCHEDULE_MIXER(delay) nextMixerTime = getTmr16KHz() + (delay)
#define PAUSE_PULSES_INTERRUPT() TIMSK1 &= ~(1<<OCIE1A)
#define RESUME_PULSES_INTERRUPT() TIMSK1 |= (1<<OCIE1A)
#define PAUSE_PPMIN_INTERRUPT() TIMSK3 &= ~(1<<ICIE3)

View file

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

View file

@ -34,8 +34,6 @@
#ifndef board_stock_h
#define board_stock_h
extern uint16_t nextMixerTime;
#define TIMER_16KHZ_VECT TIMER0_OVF_vect
#define COUNTER_16KHZ TCNT0
@ -46,8 +44,6 @@ extern uint16_t nextMixerTime;
#define PAUSE_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 RESUME_PPMIN_INTERRUPT() ETIMSK |= (1<<TICIE3)

View file

@ -104,11 +104,13 @@ BYTE CardType; /* Card type flags */
#else
inline void checkMixer()
{
// TODO duplicated code ...
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;

View file

@ -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;

View file

@ -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

View file

@ -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; }