4,11 → 4,11 |
|
#include "Spektrum.h" |
#include "main.h" |
// Achtung: RECEIVER_SPEKTRUM_EXP wird in der Main.h gesetzt |
// Achtung: RECEIVER_SPEKTRUM_DX7EXP oder RECEIVER_SPEKTRUM_DX8EXP wird in der Main.h gesetzt |
|
unsigned char SpektrumTimer = 0; |
|
#ifdef RECEIVER_SPEKTRUM_EXP |
#if defined (RECEIVER_SPEKTRUM_DX7EXP) || defined (RECEIVER_SPEKTRUM_DX8EXP) |
unsigned char s_excnt = 0; // Counter for Spektrum-Expander |
unsigned char s_exparity = 0; // Parity Bit for Spektrum-Expander |
signed char s_exdata[11]; // Data for Spektrum-Expander |
78,9 → 78,9 |
// -- Start of USART1 initialisation for Spekturm seriell-mode |
// USART1 Control and Status Register A, B, C and baud rate register |
uint8_t sreg = SREG; |
|
|
uint16_t ubrr = (uint16_t) ((uint32_t) SYSCLK/(8 * 115200) - 1); |
|
|
// disable all interrupts before reconfiguration |
cli(); |
// disable RX-Interrupt |
97,7 → 97,7 |
// set TXD1 (PD3) as an output pin |
PORTD |= (1 << PORTD3); |
DDRD |= (1 << DDD3); |
|
|
// USART0 Baud Rate Register |
// set clock divider |
UBRR1H = (uint8_t)(ubrr>>8); |
126,7 → 126,7 |
UCSR1B |= (1 << RXCIE1); |
// -- End of USART1 initialisation |
// restore global interrupt flags |
|
|
SREG = sreg; |
return; |
} |
295,7 → 295,7 |
signal -= 0x400; // Offset, range 0x000..0x7ff? |
signal = signal/6; // scaling to fit PPM resolution |
index = (ByteHigh >> 3) & 0x0f; |
} |
} |
else |
//if(EE_Parameter.Receiver == RECEIVER_SPEKTRUM_LOW_RES) |
{ |
309,73 → 309,117 |
if(index < 13) |
{ |
// Stabiles Signal |
#ifdef RECEIVER_SPEKTRUM_EXP |
if (index == 2) index = 4; // Analog channel reassigment (2 <-> 4) for logical numbering (1,2,3,4) |
else if (index == 4) index = 2; |
#if defined (RECEIVER_SPEKTRUM_DX7EXP) || defined (RECEIVER_SPEKTRUM_DX8EXP) |
if (index == 2) index = 4; // Analog channel reassigment (2 <-> 4) for logical numbering (1,2,3,4) |
else if (index == 4) index = 2; |
#endif |
if(abs(signal - PPM_in[index]) < 6) |
{ |
if(SenderOkay < 200) SenderOkay += 10; |
else |
{ |
SenderOkay = 200; |
TIMSK1 &= ~_BV(ICIE1); // disable PPM-Input |
} |
} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
|
#ifdef RECEIVER_SPEKTRUM_EXP |
if(index == 6) // FLIGHT-MODE - The channel used for our data uplink |
{ |
if (signal > 100) // SYNC received |
{ |
if (s_exdata[s_excnt] == 125) s_exparity = ~s_exparity; // Bit = 1 -> Re-Invert parity bit |
if ((s_excnt == 6 && ((s_exparity != 0 && s_exdata[s_excnt] == -125) || (s_exparity == 0 && s_exdata[s_excnt] == 125))) || (s_excnt == 9 && ((s_exparity == 0 && s_exdata[s_excnt] == -125) || (s_exparity != 0 && s_exdata[s_excnt] == 125)))) // Parity check |
{ |
if (s_exdata[1] == 125 && s_exdata[2] == -125) PPM_in[5] = -125; // Reconstruct tripole Flight-Mode value (CH5) |
else if (s_exdata[1] == -125 && s_exdata[2] == -125) PPM_in[5] = 0; // Reconstruct tripole Flight-Mode value (CH5) |
else if (s_exdata[1] == -125 && s_exdata[2] == 125) PPM_in[5] = 125; // Reconstruct tripole Flight-Mode value (CH5) |
PPM_in[6] = s_exdata[3]; // Elevator (CH6) |
PPM_in[11] = s_exdata[4]; // Aileron (CH11) |
PPM_in[12] = s_exdata[5]; // Rudder (CH12) |
if(abs(signal - PPM_in[index]) < 6) |
{ |
if(SenderOkay < 200) SenderOkay += 10; |
else |
{ |
SenderOkay = 200; |
TIMSK1 &= ~_BV(ICIE1); // disable PPM-Input |
} |
} |
tmp = (3 * (PPM_in[index]) + signal) / 4; |
if(tmp > signal+1) tmp--; else |
if(tmp < signal-1) tmp++; |
|
#ifdef RECEIVER_SPEKTRUM_DX7EXP |
if(index == 6) // FLIGHT-MODE - The channel used for our data uplink |
{ |
if (signal > 100) // SYNC received |
{ |
if (s_exdata[s_excnt] == 125) s_exparity = ~s_exparity; // Bit = 1 -> Re-Invert parity bit |
if ((s_excnt == 6 && ((s_exparity != 0 && s_exdata[s_excnt] == -125) || (s_exparity == 0 && s_exdata[s_excnt] == 125))) || (s_excnt == 9 && ((s_exparity == 0 && s_exdata[s_excnt] == -125) || (s_exparity != 0 && s_exdata[s_excnt] == 125)))) // Parity check |
{ |
if (s_exdata[1] == 125 && s_exdata[2] == -125) PPM_in[5] = -125; // Reconstruct tripole Flight-Mode value (CH5) |
else if (s_exdata[1] == -125 && s_exdata[2] == -125) PPM_in[5] = 0; // Reconstruct tripole Flight-Mode value (CH5) |
else if (s_exdata[1] == -125 && s_exdata[2] == 125) PPM_in[5] = 125; // Reconstruct tripole Flight-Mode value (CH5) |
PPM_in[6] = s_exdata[3]; // Elevator (CH6) |
PPM_in[11] = s_exdata[4]; // Aileron (CH11) |
PPM_in[12] = s_exdata[5]; // Rudder (CH12) |
|
if (s_excnt == 9) // New Mode (12 Channels) |
{ |
if (s_exdata[7] == 125) PPM_in[8] += 5; // Hover Pitch UP (CH8) |
if (s_exdata[8] == 125) PPM_in[8] -= 5; // Hover Pitch DN (CH8) |
if (PPM_in[8] < -125) PPM_in[8] = -125; // Range-Limit |
else if (PPM_in[8] > 125) PPM_in[8] = 125; // Range-Limit |
PPM_in[10] = s_exdata[6]; // AUX2 (CH10) |
} |
} |
if (s_excnt == 9) // New Mode (12 Channels) |
{ |
if (s_exdata[7] == 125) PPM_in[8] += 5; // Hover Pitch UP (CH8) |
if (s_exdata[8] == 125) PPM_in[8] -= 5; // Hover Pitch DN (CH8) |
if (PPM_in[8] < -125) PPM_in[8] = -125; // Range-Limit |
else if (PPM_in[8] > 125) PPM_in[8] = 125; // Range-Limit |
PPM_in[10] = s_exdata[6]; // AUX2 (CH10) |
} |
} |
|
s_excnt = 0; // Reset bitcounter |
s_exparity = 0; // Reset parity bit |
} |
s_excnt = 0; // Reset bitcounter |
s_exparity = 0; // Reset parity bit |
} |
|
if (signal < 10) s_exdata[++s_excnt] = -125; // Bit = 0 -> value = -125 (min) |
if (s_excnt == 10) s_excnt = 0; // Overflow protection |
if (signal < -100) |
{ |
s_exdata[s_excnt] = 125; // Bit = 1 -> value = 125 (max) |
s_exparity = ~s_exparity; // Bit = 1 -> Invert parity bit |
} |
if (signal < 10) s_exdata[++s_excnt] = -125; // Bit = 0 -> value = -125 (min) |
if (s_excnt == 10) s_excnt = 0; // Overflow protection |
if (signal < -100) |
{ |
s_exdata[s_excnt] = 125; // Bit = 1 -> value = 125 (max) |
s_exparity = ~s_exparity; // Bit = 1 -> Invert parity bit |
} |
|
} |
} |
|
#elif defined RECEIVER_SPEKTRUM_DX8EXP |
if(index == 6) // FLIGHT-MODE - The channel used for our data uplink |
{ |
if (signal > 100) // SYNC received |
{ |
if (s_exdata[s_excnt] == 125) s_exparity = ~s_exparity; // Bit = 1 -> Re-Invert parity bit |
if (s_excnt == 9 && ((s_exparity == 0 && s_exdata[s_excnt] == -125) || (s_exparity != 0 && s_exdata[s_excnt] == 125))) // Parity check |
{ |
if (s_exdata[1] == 125 && s_exdata[2] == -125) PPM_in[5] = -125; // Reconstruct tripole Flight-Mode value (CH5) |
else if (s_exdata[1] == -125 && s_exdata[2] == -125) PPM_in[5] = 0; // Reconstruct tripole Flight-Mode value (CH5) |
else if (s_exdata[1] == -125 && s_exdata[2] == 125) PPM_in[5] = 125; // Reconstruct tripole Flight-Mode value (CH5) |
|
if (s_exdata[3] == 125 && s_exdata[6] == -125) PPM_in[6] = 125; // Reconstruct tripole Elev D/R value (CH6) |
else if (s_exdata[3] == -125 && s_exdata[6] == -125) PPM_in[6] = 0; // Reconstruct tripole Elev D/R value (CH6) |
else if (s_exdata[3] == -125 && s_exdata[6] == 125) PPM_in[6] = -125; // Reconstruct tripole Elev D/R value (CH6) |
|
|
if (s_exdata[7] == 125 && s_exdata[8] == -125) PPM_in[9] = -125; // Reconstruct tripole AIL D/R value (CH9) |
else if (s_exdata[7] == -125 && s_exdata[8] == -125) PPM_in[9] = 0; // Reconstruct tripole AIL D/R value (CH9) |
else if (s_exdata[7] == -125 && s_exdata[8] == 125) PPM_in[9] = 125; // Reconstruct tripole AIL D/R value (CH9) |
|
PPM_in[10] = s_exdata[5]; // Gear (CH10) |
PPM_in[12] = s_exdata[4]; // Mix (CH12) |
} |
|
s_excnt = 0; // Reset bitcounter |
s_exparity = 0; // Reset parity bit |
} |
|
if (signal < 10) s_exdata[++s_excnt] = -125; // Bit = 0 -> value = -125 (min) |
if (s_excnt == 10) s_excnt = 0; // Overflow protection |
if (signal < -100) |
{ |
s_exdata[s_excnt] = 125; // Bit = 1 -> value = 125 (max) |
s_exparity = ~s_exparity; // Bit = 1 -> Invert parity bit |
} |
|
} |
#endif |
if(SenderOkay >= 180) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
if(SenderOkay >= 180) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
else PPM_diff[index] = 0; |
|
#ifdef RECEIVER_SPEKTRUM_EXP |
if (index < 5 ) PPM_in[index] = tmp; // Update normal potis (CH1-4) |
else if (index == 5) PPM_in[7] = signal; // Gear (CH7) |
else if (index == 7) PPM_in[9] = signal; // Hover Throttle (CH9) |
#ifdef RECEIVER_SPEKTRUM_DX7EXP |
if (index < 5 ) PPM_in[index] = tmp; // Update normal potis (CH1-4) |
else if (index == 5) PPM_in[7] = signal; // Gear (CH7) |
else if (index == 7) PPM_in[9] = signal; // Hover Throttle (CH9) |
#elif defined RECEIVER_SPEKTRUM_DX8EXP |
if (index < 5 ) PPM_in[index] = tmp; // Update normal potis (CH1-4) |
else if (index == 7) PPM_in[7] = signal; // R Trim (CH7) |
else if (index == 5) PPM_in[8] = signal; // AUX2 (CH8) |
else if (index == 8) PPM_in[11] = signal; // AUX3 (CH11) |
#else |
PPM_in[index] = tmp; |
PPM_in[index] = tmp; |
#endif |
} |
} |
else if(index > 17) ReSync = 1; // hier stimmt was nicht: neu synchronisieren |
} |
else |
405,3 → 449,4 |
} |
} |
} |
|