Rev 766 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 766 | Rev 800 | ||
---|---|---|---|
Line 16... | Line 16... | ||
16 | #include "main.h" |
16 | #include "main.h" |
Line 17... | Line 17... | ||
17 | 17 | ||
18 | volatile int16_t PPM_in[15]; //PPM24 supports 12 channels per frame |
18 | volatile int16_t PPM_in[15]; //PPM24 supports 12 channels per frame |
19 | volatile int16_t PPM_diff[15]; |
19 | volatile int16_t PPM_diff[15]; |
20 | volatile uint8_t NewPpmData = 1; |
20 | volatile uint8_t NewPpmData = 1; |
- | 21 | volatile uint8_t RC_Quality = 0; |
|
Line 21... | Line 22... | ||
21 | volatile uint8_t SenderOkay = 0; |
22 | |
22 | 23 | ||
23 | /***************************************************************/ |
24 | /***************************************************************/ |
24 | /* 16bit timer 1 is used to decode the PPM-Signal */ |
25 | /* 16bit timer 1 is used to decode the PPM-Signal */ |
Line 68... | Line 69... | ||
68 | // Disable Output Compare A & B Match Interrupts (bit: OCIE1B=0, OICIE1A=0) |
69 | // Disable Output Compare A & B Match Interrupts (bit: OCIE1B=0, OICIE1A=0) |
69 | // Disable Overflow Interrupt (bit: TOIE1=0) |
70 | // Disable Overflow Interrupt (bit: TOIE1=0) |
70 | TIMSK1 &= ~((1<<OCIE1B)|(1<<OCIE1A)|(1<<TOIE1)); |
71 | TIMSK1 &= ~((1<<OCIE1B)|(1<<OCIE1A)|(1<<TOIE1)); |
71 | TIMSK1 |= (1<<ICIE1); |
72 | TIMSK1 |= (1<<ICIE1); |
Line -... | Line 73... | ||
- | 73 | ||
- | 74 | RC_Quality = 0; |
|
72 | 75 | ||
73 | SREG = sreg; |
76 | SREG = sreg; |
Line 74... | Line 77... | ||
74 | } |
77 | } |
Line 98... | Line 101... | ||
98 | ISR(TIMER1_CAPT_vect) // typical rate of 1 ms to 2 ms |
101 | ISR(TIMER1_CAPT_vect) // typical rate of 1 ms to 2 ms |
99 | { |
102 | { |
100 | static uint16_t oldICR1 = 0; |
103 | static uint16_t oldICR1 = 0; |
101 | int16_t signal = 0, tmp; |
104 | int16_t signal = 0, tmp; |
102 | static int16_t index; |
105 | static int16_t index; |
- | 106 | static int16_t Sum_RC_Quality = 0; |
|
Line 103... | Line 107... | ||
103 | 107 | ||
104 | // 16bit Input Capture Register ICR1 contains the timer value TCNT1 |
108 | // 16bit Input Capture Register ICR1 contains the timer value TCNT1 |
Line 105... | Line 109... | ||
105 | // at the time the edge was detected |
109 | // at the time the edge was detected |
- | 110 | ||
- | 111 | // calculate the time delay to the previous event time which is stored in oldICR1 |
|
106 | 112 | // calculatiing the difference of the two uint16_t and converting the result to an int16_t |
|
107 | // calculate the time delay to the previous event time which is stored in oldICR1 |
113 | // implicit handles a timer overflow 65535 -> 0 the right way. |
Line 108... | Line 114... | ||
108 | signal = (uint16_t) ICR1 - oldICR1; |
114 | signal = (uint16_t) ICR1 - oldICR1; |
Line 127... | Line 133... | ||
127 | if((signal > 250) && (signal < 687)) |
133 | if((signal > 250) && (signal < 687)) |
128 | { |
134 | { |
129 | // shift signal to zero symmetric range -154 to 159 |
135 | // shift signal to zero symmetric range -154 to 159 |
130 | signal -= 466; // offset of 1.4912 ms ??? (469 * 3.2µs = 1.5008 ms) |
136 | signal -= 466; // offset of 1.4912 ms ??? (469 * 3.2µs = 1.5008 ms) |
131 | // check for stable signal |
137 | // check for stable signal |
132 | // the deviation of the current signal level from the average must be less than 6 (aprox. 1%) |
- | |
133 | if(abs(signal - PPM_in[index]) < 6) |
- | |
134 | { |
- | |
135 | // a good signal condition increases SenderOkay by 10 |
- | |
136 | // SignalOkay is decremented every 2 ms in main.c |
138 | Sum_RC_Quality -= Sum_RC_Quality/128; |
137 | // this variable is a level for the average rate of a noiseless rc signal |
139 | Sum_RC_Quality += 200 - abs(signal - PPM_in[index]); // max 200*128 = 25600 |
138 | if(SenderOkay < 200) SenderOkay += 10; |
- | |
139 | } |
- | |
140 | // calculate exponential history for signal |
140 | // calculate exponential history for signal |
141 | tmp = (3 * (PPM_in[index]) + signal) / 4; |
141 | tmp = (3 * (PPM_in[index]) + signal) / 4; |
142 | if(tmp > signal+1) tmp--; else |
142 | if(tmp > signal+1) tmp--; else |
143 | if(tmp < signal-1) tmp++; |
143 | if(tmp < signal-1) tmp++; |
144 | // calculate signal difference on good signal level |
144 | // calculate signal difference on good signal level |
145 | if(SenderOkay >= 195) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; // cut off lower 3 bit for nois reduction |
145 | if(RC_Quality >= 170) PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; // cut off lower 3 bit for nois reduction |
146 | else PPM_diff[index] = 0; |
146 | else PPM_diff[index] = 0; |
147 | PPM_in[index] = tmp; // update channel value |
147 | PPM_in[index] = tmp; // update channel value |
148 | } |
148 | } |
- | 149 | else |
|
- | 150 | { // invalid PPM time |
|
- | 151 | Sum_RC_Quality -= Sum_RC_Quality/4; |
|
- | 152 | } |
|
- | 153 | if(Sum_RC_Quality < 0) Sum_RC_Quality = 0; |
|
- | 154 | RC_Quality = (uint8_t)(Sum_RC_Quality/128); |
|
149 | index++; // next channel |
155 | index++; // next channel |
150 | // demux sum signal for channels 5 to 7 to J3, J4, J5 |
156 | // demux sum signal for channels 5 to 7 to J3, J4, J5 |
151 | if(index == 5) PORTD |= (1<<PORTD5); else PORTD &= ~(1<<PORTD5); |
157 | if(index == 5) PORTD |= (1<<PORTD5); else PORTD &= ~(1<<PORTD5); |
152 | if(index == 6) PORTD |= (1<<PORTD4); else PORTD &= ~(1<<PORTD4); |
158 | if(index == 6) PORTD |= (1<<PORTD4); else PORTD &= ~(1<<PORTD4); |
153 | if(BoardRelease == 10) |
159 | if(BoardRelease == 10) |