Rev 2011 | Rev 2309 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 2011 | Rev 2185 | ||
---|---|---|---|
Line 2... | Line 2... | ||
2 | Decodieren eines RC Summen Signals oder Spektrum Empfänger-Satellit |
2 | Decodieren eines RC Summen Signals oder Spektrum Empfänger-Satellit |
3 | #######################################################################################*/ |
3 | #######################################################################################*/ |
Line 4... | Line 4... | ||
4 | 4 | ||
5 | #include "Spektrum.h" |
5 | #include "Spektrum.h" |
6 | #include "main.h" |
- | |
Line 7... | Line 6... | ||
7 | // Achtung: RECEIVER_SPEKTRUM_DX7EXP oder RECEIVER_SPEKTRUM_DX8EXP wird in der Main.h gesetzt |
6 | #include "main.h" |
Line -... | Line 7... | ||
- | 7 | ||
8 | 8 | unsigned char SpektrumTimer = 0; |
|
9 | unsigned char SpektrumTimer = 0; |
9 | |
10 | 10 | // Achtung: RECEIVER_SPEKTRUM_DX7EXP oder RECEIVER_SPEKTRUM_DX8EXP wird in der main.h gesetzt |
|
11 | #if defined (RECEIVER_SPEKTRUM_DX7EXP) || defined (RECEIVER_SPEKTRUM_DX8EXP) |
11 | #if defined (RECEIVER_SPEKTRUM_DX7EXP) || defined (RECEIVER_SPEKTRUM_DX8EXP) |
- | 12 | unsigned char s_excnt = 0; // Bitcounter for Spektrum-Expander |
|
- | 13 | unsigned char s_exparity = 0; // Parity Bit for Spektrum-Expander |
|
- | 14 | signed char s_exdata[11]; // Data for Spektrum-Expander |
|
- | 15 | ||
- | 16 | void s_update(unsigned char channel, signed int value) // Channel-Diff numbercrunching and finally assign new stickvalue to PPM_in |
|
- | 17 | { |
|
- | 18 | if(SenderOkay >= 180) PPM_diff[channel] = ((value - PPM_in[channel]) / 3) * 3; |
|
12 | unsigned char s_excnt = 0; // Counter for Spektrum-Expander |
19 | else PPM_diff[channel] = 0; |
- | 20 | PPM_in[channel] = value; |
|
13 | unsigned char s_exparity = 0; // Parity Bit for Spektrum-Expander |
21 | } |
14 | signed char s_exdata[11]; // Data for Spektrum-Expander |
22 | #endif |
15 | #endif |
23 | |
16 | //--------------------------------------------------------------// |
24 | //--------------------------------------------------------------// |
17 | //--------------------------------------------------------------// |
25 | //--------------------------------------------------------------// |
Line 308... | Line 316... | ||
308 | index++; |
316 | index++; |
309 | if(index < 13) |
317 | if(index < 13) |
310 | { |
318 | { |
311 | // Stabiles Signal |
319 | // Stabiles Signal |
312 | #if defined (RECEIVER_SPEKTRUM_DX7EXP) || defined (RECEIVER_SPEKTRUM_DX8EXP) |
320 | #if defined (RECEIVER_SPEKTRUM_DX7EXP) || defined (RECEIVER_SPEKTRUM_DX8EXP) |
313 | if (index == 2) index = 4; // Analog channel reassigment (2 <-> 4) for logical numbering (1,2,3,4) |
321 | if (index == 2) index = 4; // Analog channel reassigment (2 <-> 4) for logical numbering (1,2,3,4) |
314 | else if (index == 4) index = 2; |
322 | else if (index == 4) index = 2; |
315 | #endif |
323 | #endif |
316 | if(abs(signal - PPM_in[index]) < 6) |
324 | if(abs(signal - PPM_in[index]) < 6) |
317 | { |
325 | { |
318 | if(EE_Parameter.FailsafeChannel == 0 || PPM_in[EE_Parameter.FailsafeChannel] < 100) // forces Failsafe if the receiver doesn't have 'signal loss' on Failsafe |
326 | if(EE_Parameter.FailsafeChannel == 0 || PPM_in[EE_Parameter.FailsafeChannel] < 100) // forces Failsafe if the receiver doesn't have 'signal loss' on Failsafe |
319 | { |
- | |
- | 327 | { |
|
320 | if(SenderOkay < 200) SenderOkay += 10; |
328 | if(SenderOkay < 200) SenderOkay += 10; |
321 | else |
329 | else |
322 | { |
330 | { |
323 | SenderOkay = 200; |
331 | SenderOkay = 200; |
324 | TIMSK1 &= ~_BV(ICIE1); // disable PPM-Input |
332 | TIMSK1 &= ~_BV(ICIE1); // disable PPM-Input |
325 | } |
333 | } |
326 | } |
- | |
- | 334 | } |
|
327 | } |
335 | } |
328 | tmp = (3 * (PPM_in[index]) + signal) / 4; |
336 | tmp = (3 * (PPM_in[index]) + signal) / 4; |
329 | if(tmp > signal+1) tmp--; else |
337 | if(tmp > signal+1) tmp--; else |
330 | if(tmp < signal-1) tmp++; |
338 | if(tmp < signal-1) tmp++; |
Line 331... | Line 339... | ||
331 | 339 | ||
332 | #ifdef RECEIVER_SPEKTRUM_DX7EXP |
340 | #ifdef RECEIVER_SPEKTRUM_DX7EXP |
333 | if(index == 6) // FLIGHT-MODE - The channel used for our data uplink |
341 | if(index == 6) // FLIGHT-MODE - The channel used for our data uplink |
334 | { |
342 | { |
335 | if (signal > 100) // SYNC received |
343 | if (signal > 100) // SYNC received |
336 | { |
344 | { |
337 | if (s_exdata[s_excnt] == 125) s_exparity = ~s_exparity; // Bit = 1 -> Re-Invert parity bit |
345 | if (s_exdata[s_excnt] == 125) s_exparity = ~s_exparity; // Bit = 1 -> Re-Invert parity bit |
338 | 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 |
346 | 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 |
339 | { |
347 | { |
340 | if (s_exdata[1] == 125 && s_exdata[2] == -125) PPM_in[5] = -125; // Reconstruct tripole Flight-Mode value (CH5) |
348 | if (s_exdata[1] == 125 && s_exdata[2] == -125) s_update(5,-125); // Reconstruct tripole Flight-Mode value (CH5) |
341 | else if (s_exdata[1] == -125 && s_exdata[2] == -125) PPM_in[5] = 0; // Reconstruct tripole Flight-Mode value (CH5) |
349 | else if (s_exdata[1] == -125 && s_exdata[2] == -125) s_update(5,0); // Reconstruct tripole Flight-Mode value (CH5) |
342 | else if (s_exdata[1] == -125 && s_exdata[2] == 125) PPM_in[5] = 125; // Reconstruct tripole Flight-Mode value (CH5) |
350 | else if (s_exdata[1] == -125 && s_exdata[2] == 125) s_update(5,125); // Reconstruct tripole Flight-Mode value (CH5) |
343 | PPM_in[6] = s_exdata[3]; // Elevator (CH6) |
351 | s_update(6,s_exdata[3]); // Elevator (CH6) |
344 | PPM_in[11] = s_exdata[4]; // Aileron (CH11) |
352 | s_update(11,s_exdata[4]); // Aileron (CH11) |
Line 345... | Line 353... | ||
345 | PPM_in[12] = s_exdata[5]; // Rudder (CH12) |
353 | s_update(12,s_exdata[5]); // Rudder (CH12) |
346 | 354 | ||
347 | if (s_excnt == 9) // New Mode (12 Channels) |
355 | if (s_excnt == 9) // New Mode (12 Channels) |
348 | { |
356 | { |
349 | if (s_exdata[7] == 125) PPM_in[8] += 5; // Hover Pitch UP (CH8) |
357 | if (s_exdata[7] == 125) s_update(8,PPM_in[8]+5); // Hover Pitch UP (CH8) |
350 | if (s_exdata[8] == 125) PPM_in[8] -= 5; // Hover Pitch DN (CH8) |
358 | if (s_exdata[8] == 125) s_update(8,PPM_in[8]-5); // Hover Pitch DN (CH8) |
351 | if (PPM_in[8] < -125) PPM_in[8] = -125; // Range-Limit |
359 | if (PPM_in[8] < -125) PPM_in[8] = -125; // Range-Limit |
352 | else if (PPM_in[8] > 125) PPM_in[8] = 125; // Range-Limit |
360 | else if (PPM_in[8] > 125) PPM_in[8] = 125; // Range-Limit |
353 | PPM_in[10] = s_exdata[6]; // AUX2 (CH10) |
361 | s_update(10,s_exdata[6]); // AUX2 (CH10) |
Line 354... | Line 362... | ||
354 | } |
362 | } |
355 | } |
363 | } |
356 | 364 | ||
Line 357... | Line 365... | ||
357 | s_excnt = 0; // Reset bitcounter |
365 | s_excnt = 0; // Reset bitcounter |
358 | s_exparity = 0; // Reset parity bit |
366 | s_exparity = 0; // Reset parity bit |
359 | } |
367 | } |
360 | 368 | ||
361 | if (signal < 10) s_exdata[++s_excnt] = -125; // Bit = 0 -> value = -125 (min) |
369 | if (signal < 10) s_exdata[++s_excnt] = -125; // Bit = 0 -> value = -125 (min) |
362 | if (s_excnt == 10) s_excnt = 0; // Overflow protection |
370 | if (s_excnt == 10) s_excnt = 0; // Overflow protection |
363 | if (signal < -100) |
371 | if (signal < -100) |
Line 364... | Line 372... | ||
364 | { |
372 | { |
Line -... | Line 373... | ||
- | 373 | s_exdata[s_excnt] = 125; // Bit = 1 -> value = 125 (max) |
|
- | 374 | s_exparity = ~s_exparity; // Bit = 1 -> Invert parity bit |
|
- | 375 | } |
|
- | 376 | ||
365 | s_exdata[s_excnt] = 125; // Bit = 1 -> value = 125 (max) |
377 | } |
366 | s_exparity = ~s_exparity; // Bit = 1 -> Invert parity bit |
378 | |
367 | } |
379 | if (index < 5 ) s_update(index,tmp); // Update normal potis (CH1-4) |
368 | 380 | else if (index == 5) s_update(7,signal); // Gear (CH7) |
|
369 | } |
381 | else if (index == 7) s_update(9,signal); // Hover Throttle (CH9) |
370 | 382 | ||
371 | #elif defined RECEIVER_SPEKTRUM_DX8EXP |
383 | #elif defined RECEIVER_SPEKTRUM_DX8EXP |
372 | if(index == 6) // FLIGHT-MODE - The channel used for our data uplink |
384 | if(index == 6) // FLIGHT-MODE - The channel used for our data uplink |
373 | { |
385 | { |
374 | if (signal > 100) // SYNC received |
386 | if (signal > 100) // SYNC received |
375 | { |
387 | { |
Line 376... | Line 388... | ||
376 | if (s_exdata[s_excnt] == 125) s_exparity = ~s_exparity; // Bit = 1 -> Re-Invert parity bit |
388 | if (s_exdata[s_excnt] == 125) s_exparity = ~s_exparity; // Bit = 1 -> Re-Invert parity bit |
377 | if (s_excnt == 9 && ((s_exparity == 0 && s_exdata[s_excnt] == -125) || (s_exparity != 0 && s_exdata[s_excnt] == 125))) // Parity check |
389 | if (s_excnt == 9 && ((s_exparity == 0 && s_exdata[s_excnt] == -125) || (s_exparity != 0 && s_exdata[s_excnt] == 125))) // Parity check |
378 | { |
390 | { |
Line 379... | Line 391... | ||
379 | if (s_exdata[1] == 125 && s_exdata[2] == -125) PPM_in[5] = -125; // Reconstruct tripole Flight-Mode value (CH5) |
391 | if (s_exdata[1] == 125 && s_exdata[2] == -125) s_update(5,-125); // Reconstruct tripole Flight-Mode value (CH5) |
380 | else if (s_exdata[1] == -125 && s_exdata[2] == -125) PPM_in[5] = 0; // Reconstruct tripole Flight-Mode value (CH5) |
392 | else if (s_exdata[1] == -125 && s_exdata[2] == -125) s_update(5,0); // Reconstruct tripole Flight-Mode value (CH5) |
381 | else if (s_exdata[1] == -125 && s_exdata[2] == 125) PPM_in[5] = 125; // Reconstruct tripole Flight-Mode value (CH5) |
393 | else if (s_exdata[1] == -125 && s_exdata[2] == 125) s_update(5,125); // Reconstruct tripole Flight-Mode value (CH5) |
Line 382... | Line 394... | ||
382 | 394 | ||
383 | if (s_exdata[3] == 125 && s_exdata[6] == -125) PPM_in[6] = 125; // Reconstruct tripole Elev D/R value (CH6) |
395 | if (s_exdata[3] == 125 && s_exdata[6] == -125) s_update(6,125); // Reconstruct tripole Elev D/R value (CH6) |
384 | else if (s_exdata[3] == -125 && s_exdata[6] == -125) PPM_in[6] = 0; // Reconstruct tripole Elev D/R value (CH6) |
396 | else if (s_exdata[3] == -125 && s_exdata[6] == -125) s_update(6,0); // Reconstruct tripole Elev D/R value (CH6) |
Line 385... | Line 397... | ||
385 | else if (s_exdata[3] == -125 && s_exdata[6] == 125) PPM_in[6] = -125; // Reconstruct tripole Elev D/R value (CH6) |
397 | else if (s_exdata[3] == -125 && s_exdata[6] == 125) s_update(6,-125); // Reconstruct tripole Elev D/R value (CH6) |
386 | 398 | ||
387 | 399 | ||
Line 404... | Line 416... | ||
404 | s_exdata[s_excnt] = 125; // Bit = 1 -> value = 125 (max) |
416 | s_exdata[s_excnt] = 125; // Bit = 1 -> value = 125 (max) |
405 | s_exparity = ~s_exparity; // Bit = 1 -> Invert parity bit |
417 | s_exparity = ~s_exparity; // Bit = 1 -> Invert parity bit |
406 | } |
418 | } |
Line 407... | Line 419... | ||
407 | 419 | ||
408 | } |
- | |
409 | #endif |
- | |
410 | if(SenderOkay >= 180) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
- | |
Line 411... | Line -... | ||
411 | else PPM_diff[index] = 0; |
- | |
412 | 420 | } |
|
413 | #ifdef RECEIVER_SPEKTRUM_DX7EXP |
- | |
414 | if (index < 5 ) PPM_in[index] = tmp; // Update normal potis (CH1-4) |
- | |
415 | else if (index == 5) PPM_in[7] = signal; // Gear (CH7) |
- | |
416 | else if (index == 7) PPM_in[9] = signal; // Hover Throttle (CH9) |
- | |
417 | #elif defined RECEIVER_SPEKTRUM_DX8EXP |
421 | |
418 | if (index < 5 ) PPM_in[index] = tmp; // Update normal potis (CH1-4) |
422 | if (index < 5 ) s_update(index,tmp); // Update normal potis (CH1-4) |
419 | else if (index == 7) PPM_in[7] = signal; // R Trim (CH7) |
423 | else if (index == 7) s_update(7,signal); // R Trim (CH7) |
- | 424 | else if (index == 5) s_update(8,signal); // AUX2 (CH8) |
|
420 | else if (index == 5) PPM_in[8] = signal; // AUX2 (CH8) |
425 | else if (index == 8) s_update(11,signal); // AUX3 (CH11) |
- | 426 | ||
- | 427 | #else |
|
421 | else if (index == 8) PPM_in[11] = signal; // AUX3 (CH11) |
428 | if(SenderOkay >= 180) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; |
422 | #else |
429 | else PPM_diff[index] = 0; |
423 | PPM_in[index] = tmp; |
430 | PPM_in[index] = tmp; |
424 | #endif |
431 | #endif |
425 | } |
432 | } |
Line 451... | Line 458... | ||
451 | SpektrumTimer = MIN_FRAMEGAP; |
458 | SpektrumTimer = MIN_FRAMEGAP; |
452 | } |
459 | } |
453 | } |
460 | } |
454 | } |
461 | } |
Line -... | Line 462... | ||
- | 462 |