Subversion Repositories FlightCtrl

Compare Revisions

Ignore whitespace Rev 2247 → Rev 2248

/branches/V0.76g_dk9nw_balancekopter/794 MK FC V0.76g balance/rc.c
0,0 → 1,104
/**************************************************************************************************************************************
* File: rc.c
*
* Purpose: Decoding of the radio control sum signal
*
* Functions: void rc_sum_init(void)
* ISR(TIMER1_CAPT_vect)
*
*************************************************************************************************************************************/
#include "rc.h"
#include "main.h"
 
 
volatile int PPM_in[11]; // containing the stick signal of the according radio control chanel
volatile int PPM_diff[11]; // the differential stick signal of the appropriate radio control chanel
volatile char Channels; // containing the number of channels
volatile char tmpChannels = 0; //
volatile unsigned char NewPpmData = 1; //
 
 
//----------------------------------------------------------------------------------------------------------------------------------
// The input capture function of Timer1 is used to decode the PPM sum signal
//----------------------------------------------------------------------------------------------------------------------------------
void rc_sum_init(void)
{
//------------------------------------------------------------------------------------------------
// TCCR1B = Timer/Counter1 Control Register B -> ICNC1 ICES1 – WGM13 WGM12 CS12 CS11 CS10
//
// ICES1: Input Capture Edge Select = activated
// ICNC1: Input Capture Noise Canceler = activated
// CSn2:0 Clock Select = 1:64 from prescaler
//
TCCR1B= (1<<ICES1)|(1<<ICNC1)|(1<<CS11)|(1<<CS10);
//------------------------------------------------------------------------------------------------
// TIMSK1 = Timer/Counter1 Interrupt Mask Register -> – – ICIE1 – – OCIE1B OCIE1A TOIE1
// ICIE1: Timer/Counter1, Input Capture Interrupt Enable
//
TIMSK1 |= (1<<ICIE1);
AdNeutralGier = 0;
AdNeutralRoll = 0;
AdNeutralNick = 0;
return;
}
//----------------------------------------------------------------------------------------------------------------------------------
 
 
 
//----------------------------------------------------------------------------------------------------------------------------------
// This function works with Timer1 to decode the radio control
//----------------------------------------------------------------------------------------------------------------------------------
ISR(TIMER1_CAPT_vect)
{
static unsigned int AltICR=0;
signed int signal = 0;
signed int tmp;
static int index;
signal = (unsigned int) ICR1 - AltICR; // ICR1H and ICR1L – Input Capture Register 1
AltICR = ICR1;
if((signal > 1100) && (signal < 8000)) // Syncronisation break? (3.52 ms < signal < 25.6 ms)
{
Channels = index;
if(index >= 4) NewPpmData = 0; // zero is equal to new Data
index = 1;
}
else
{
if(index < 10)
{
if((signal > 250) && (signal < 687))
{
signal -= 466;
if(abs(signal - PPM_in[index]) < 6) // good signal
{
if(SenderOkay < 200) SenderOkay += 10;
else SenderOkay = 200;
}
tmp = (3 * (PPM_in[index]) + signal) / 4;
if(tmp > signal+1) tmp--;
else if(tmp < signal-1) tmp++;
if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3;
else PPM_diff[index] = 0;
PPM_in[index] = tmp;
}
index++;
if(index == 5) J3High; else J3Low; // Servosignal an J3 anlegen
if(index == 6) J4High; else J4Low; // Servosignal an J4 anlegen
if(index == 7) J5High; else J5Low; // Servosignal an J5 anlegen
}
}
}
//----------------------------------------------------------------------------------------------------------------------------------