3,6 → 3,7 |
#include <avr/interrupt.h> |
#include "spektrum.h" |
#include "rc.h" |
#include "eeprom.h" |
#include "timer0.h" |
|
/* |
144,11 → 145,13 |
#define MIN_FRAMEGAP 68 // 7ms |
#define MAX_BYTEGAP 3 // 375us |
|
|
// called in uart isr |
void Spektrum_Parser(uint8_t c) |
{ |
static uint8_t Sync = 0, FrameCnt = 0, ByteHigh = 0, ReSync = 1, Frame2 = 0; |
uint16_t Channel, index; |
int16_t signal, tmp; |
uint16_t Channel, index = 0; |
int16_t signal = 0, tmp; |
int16_t bCheckDelay; |
|
|
218,15 → 221,41 |
SpektrumTimer = MAX_BYTEGAP; |
Sync = 2; |
FrameCnt ++; |
index = (ByteHigh >> 2) & 0x0f; |
index ++; |
Channel = ((uint16_t)ByteHigh << 8) | c; |
signal = Channel & 0x3ff; |
signal -= 0x200; // Offset, range 0x000..0x3ff? |
signal = signal/3; // scaling to fit PPM resolution |
|
if(index > 0 && index < MAX_RC_CHANNELS) |
switch(ParamSet.Receiver) |
{ |
case RECEIVER_SPEKTRUM: |
signal = Channel & 0x3FF; |
signal -= 0x200; // Offset, range 0x000..0x3FF? |
signal = signal/3; // scaling to fit PPM resolution |
index = (ByteHigh >> 2) & 0x0F; |
break; |
|
case RECEIVER_SPEKTRUM_HI_RES: |
signal = Channel & 0x7FF; |
signal -= 0x400; // Offset, range 0x000..0x7FF? |
signal = signal/6; // scaling to fit PPM resolution |
index = (ByteHigh >> 3) & 0x0F; |
break; |
|
case RECEIVER_SPEKTRUM_LOW_RES: |
signal = Channel & 0x3FF; |
signal -= 360; // Offset, range 0x000..0x3FF? |
signal = signal/2; // scaling to fit PPM resolution |
index = (ByteHigh >> 2) & 0x0f; |
break; |
|
default: |
index = 0; |
signal = 0; |
break; |
} |
|
index ++; |
|
if(index < MAX_RC_CHANNELS) |
{ |
if(RC_Channels < index) RC_Channels = index; |
// Stabiles Signal |
if(abs(signal - PPM_in[index]) < 6) |