Subversion Repositories FlightCtrl

Rev

Rev 1227 | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1227 Rev 1235
1
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2
// + Copyright (c) 04.2007 Holger Buss
2
// + Copyright (c) 04.2007 Holger Buss
3
// + Nur für den privaten Gebrauch
3
// + Nur für den privaten Gebrauch
4
// + www.MikroKopter.com
4
// + www.MikroKopter.com
5
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
5
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
6
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
6
// + Es gilt für das gesamte Projekt (Hardware, Software, Binärfiles, Sourcecode und Dokumentation),
7
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
7
// + dass eine Nutzung (auch auszugsweise) nur für den privaten (nicht-kommerziellen) Gebrauch zulässig ist.
8
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
8
// + Sollten direkte oder indirekte kommerzielle Absichten verfolgt werden, ist mit uns (info@mikrokopter.de) Kontakt
9
// + bzgl. der Nutzungsbedingungen aufzunehmen.
9
// + bzgl. der Nutzungsbedingungen aufzunehmen.
10
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
10
// + Eine kommerzielle Nutzung ist z.B.Verkauf von MikroKoptern, Bestückung und Verkauf von Platinen oder Bausätzen,
11
// + Verkauf von Luftbildaufnahmen, usw.
11
// + Verkauf von Luftbildaufnahmen, usw.
12
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
12
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
13
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
13
// + Werden Teile des Quellcodes (mit oder ohne Modifikation) weiterverwendet oder veröffentlicht,
14
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
14
// + unterliegen sie auch diesen Nutzungsbedingungen und diese Nutzungsbedingungen incl. Copyright müssen dann beiliegen
15
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
15
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
16
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
16
// + Sollte die Software (auch auszugesweise) oder sonstige Informationen des MikroKopter-Projekts
17
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
17
// + auf anderen Webseiten oder sonstigen Medien veröffentlicht werden, muss unsere Webseite "http://www.mikrokopter.de"
18
// + eindeutig als Ursprung verlinkt werden
18
// + eindeutig als Ursprung verlinkt werden
19
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
19
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
20
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
20
// + Keine Gewähr auf Fehlerfreiheit, Vollständigkeit oder Funktion
21
// + Benutzung auf eigene Gefahr
21
// + Benutzung auf eigene Gefahr
22
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
22
// + Wir übernehmen keinerlei Haftung für direkte oder indirekte Personen- oder Sachschäden
23
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
23
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
24
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
24
// + Die Portierung der Software (oder Teile davon) auf andere Systeme (ausser der Hardware von www.mikrokopter.de) ist nur
25
// + mit unserer Zustimmung zulässig
25
// + mit unserer Zustimmung zulässig
26
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
26
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
27
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
27
// + Die Funktion printf_P() unterliegt ihrer eigenen Lizenz und ist hiervon nicht betroffen
28
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
28
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
29
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
29
// + Redistributions of source code (with or without modifications) must retain the above copyright notice,
30
// + this list of conditions and the following disclaimer.
30
// + this list of conditions and the following disclaimer.
31
// +   * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
31
// +   * Neither the name of the copyright holders nor the names of contributors may be used to endorse or promote products derived
32
// +     from this software without specific prior written permission.
32
// +     from this software without specific prior written permission.
33
// +   * The use of this project (hardware, software, binary files, sources and documentation) is only permittet
33
// +   * The use of this project (hardware, software, binary files, sources and documentation) is only permittet
34
// +     for non-commercial use (directly or indirectly)
34
// +     for non-commercial use (directly or indirectly)
35
// +     Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
35
// +     Commercial use (for excample: selling of MikroKopters, selling of PCBs, assembly, ...) is only permitted
36
// +     with our written permission
36
// +     with our written permission
37
// +   * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
37
// +   * If sources or documentations are redistributet on other webpages, out webpage (http://www.MikroKopter.de) must be
38
// +     clearly linked as origin
38
// +     clearly linked as origin
39
// +   * porting to systems other than hardware from www.mikrokopter.de is not allowed
39
// +   * porting to systems other than hardware from www.mikrokopter.de is not allowed
40
// +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
40
// +  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
41
// +  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41
// +  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
42
// +  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
42
// +  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
43
// +  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
43
// +  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
44
// +  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
44
// +  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
45
// +  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
45
// +  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
46
// +  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
46
// +  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
47
// +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// +  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
47
// +  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN// +  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
48
// +  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
48
// +  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
49
// +  POSSIBILITY OF SUCH DAMAGE.
49
// +  POSSIBILITY OF SUCH DAMAGE.
50
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
50
// ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
51
#include <stdlib.h>
51
#include <stdlib.h>
52
#include <avr/io.h>
52
#include <avr/io.h>
53
#include <avr/interrupt.h>
53
#include <avr/interrupt.h>
54
 
54
 
55
#include "rc.h"
55
#include "rc.h"
56
#include "main.h"
56
#include "main.h"
57
 
57
 
58
volatile int16_t PPM_in[15]; //PPM24 supports 12 channels per frame
58
volatile int16_t PPM_in[15]; //PPM24 supports 12 channels per frame
59
volatile int16_t PPM_diff[15];
59
volatile int16_t PPM_diff[15];
60
volatile uint8_t NewPpmData = 1;
60
volatile uint8_t NewPpmData = 1;
61
volatile int16_t RC_Quality = 0;
61
volatile int16_t RC_Quality = 0;
62
 
62
 
63
 
63
 
64
 
64
 
65
/***************************************************************/
65
/***************************************************************/
66
/*  16bit timer 1 is used to decode the PPM-Signal            */
66
/*  16bit timer 1 is used to decode the PPM-Signal            */
67
/***************************************************************/
67
/***************************************************************/
68
void RC_Init (void)
68
void RC_Init (void)
69
{
69
{
70
        uint8_t sreg = SREG;
70
        uint8_t sreg = SREG;
71
 
71
 
72
        // disable all interrupts before reconfiguration
72
        // disable all interrupts before reconfiguration
73
        cli();
73
        cli();
74
 
74
 
75
        // PPM-signal is connected to the Input Capture Pin (PD6) of timer 1
75
        // PPM-signal is connected to the Input Capture Pin (PD6) of timer 1
76
        DDRD &= ~(1<<DDD6);
76
        DDRD &= ~(1<<DDD6);
77
        PORTD |= (1<<PORTD6);
77
        PORTD |= (1<<PORTD6);
78
 
78
 
79
        // Channel 5,6,7 is decoded to servo signals at pin PD5 (J3), PD4(J4), PD3(J5)
79
        // Channel 5,6,7 is decoded to servo signals at pin PD5 (J3), PD4(J4), PD3(J5)
80
        // set as output
80
        // set as output
81
        DDRD |= (1<<DDD5)|(1<<DDD4);
81
        DDRD |= (1<<DDD5)|(1<<DDD4);
82
        // low level
82
        // low level
83
        PORTD &= ~((1<<PORTD5)|(1<<PORTD4));
83
        PORTD &= ~((1<<PORTD5)|(1<<PORTD4));
84
 
84
 
85
        // PD3 can't be used if 2nd UART is activated
85
        // PD3 can't be used if 2nd UART is activated
86
        // because TXD1 is at that port
86
        // because TXD1 is at that port
87
        if(CPUType != ATMEGA644P)
87
        if(CPUType != ATMEGA644P)
88
        {
88
        {
89
                DDRD |= (1<<PORTD3);
89
                DDRD |= (1<<PORTD3);
90
                PORTD &= ~(1<<PORTD3);
90
                PORTD &= ~(1<<PORTD3);
91
        }
91
        }
92
 
92
 
93
        // Timer/Counter1 Control Register A, B, C
93
        // Timer/Counter1 Control Register A, B, C
94
 
94
 
95
        // Normal Mode (bits: WGM13=0, WGM12=0, WGM11=0, WGM10=0)
95
        // Normal Mode (bits: WGM13=0, WGM12=0, WGM11=0, WGM10=0)
96
        // Compare output pin A & B is disabled (bits: COM1A1=0, COM1A0=0, COM1B1=0, COM1B0=0)
96
        // Compare output pin A & B is disabled (bits: COM1A1=0, COM1A0=0, COM1B1=0, COM1B0=0)
97
        // Set clock source to SYSCLK/64 (bit: CS12=0, CS11=1, CS10=1)
97
        // Set clock source to SYSCLK/64 (bit: CS12=0, CS11=1, CS10=1)
98
        // Enable input capture noise cancler (bit: ICNC1=1)
98
        // Enable input capture noise cancler (bit: ICNC1=1)
99
        // Trigger on positive edge of the input capture pin (bit: ICES1=1),
99
        // Trigger on positive edge of the input capture pin (bit: ICES1=1),
100
        // Therefore the counter incremets at a clock of 20 MHz/64 = 312.5 kHz or 3.2µs
100
        // Therefore the counter incremets at a clock of 20 MHz/64 = 312.5 kHz or 3.2µs
101
    // The longest period is 0xFFFF / 312.5 kHz = 0.209712 s.
101
    // The longest period is 0xFFFF / 312.5 kHz = 0.209712 s.
102
        TCCR1A &= ~((1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM11)|(1<<WGM10));
102
        TCCR1A &= ~((1<<COM1A1)|(1<<COM1A0)|(1<<COM1B1)|(1<<COM1B0)|(1<<WGM11)|(1<<WGM10));
103
        TCCR1B &= ~((1<<WGM13)|(1<<WGM12)|(1<<CS12));
103
        TCCR1B &= ~((1<<WGM13)|(1<<WGM12)|(1<<CS12));
104
        TCCR1B |= (1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);
104
        TCCR1B |= (1<<CS11)|(1<<CS10)|(1<<ICES1)|(1<<ICNC1);
105
        TCCR1C &= ~((1<<FOC1A)|(1<<FOC1B));
105
        TCCR1C &= ~((1<<FOC1A)|(1<<FOC1B));
106
 
106
 
107
        // Timer/Counter1 Interrupt Mask Register
107
        // Timer/Counter1 Interrupt Mask Register
108
 
108
 
109
        // Enable Input Capture Interrupt (bit: ICIE1=1)
109
        // Enable Input Capture Interrupt (bit: ICIE1=1)
110
        // Disable Output Compare A & B Match Interrupts (bit: OCIE1B=0, OICIE1A=0)
110
        // Disable Output Compare A & B Match Interrupts (bit: OCIE1B=0, OICIE1A=0)
111
        // Enable Overflow Interrupt (bit: TOIE1=0)
111
        // Enable Overflow Interrupt (bit: TOIE1=0)
112
        TIMSK1 &= ~((1<<OCIE1B)|(1<<OCIE1A)|(1<<TOIE1));
112
        TIMSK1 &= ~((1<<OCIE1B)|(1<<OCIE1A)|(1<<TOIE1));
113
    TIMSK1 |= (1<<ICIE1);
113
    TIMSK1 |= (1<<ICIE1);
114
 
114
 
115
    RC_Quality = 0;
115
    RC_Quality = 0;
116
 
116
 
117
    SREG = sreg;
117
    SREG = sreg;
118
}
118
}
119
 
119
 
120
 
120
 
121
/********************************************************************/
121
/********************************************************************/
122
/*         Every time a positive edge is detected at PD6            */
122
/*         Every time a positive edge is detected at PD6            */
123
/********************************************************************/
123
/********************************************************************/
124
/*                               t-Frame
124
/*                               t-Frame
125
       <----------------------------------------------------------------------->
125
       <----------------------------------------------------------------------->
126
         ____   ______   _____   ________                ______    sync gap      ____
126
         ____   ______   _____   ________                ______    sync gap      ____
127
        |    | |      | |     | |        |              |      |                |
127
        |    | |      | |     | |        |              |      |                |
128
        |    | |      | |     | |        |              |      |                |
128
        |    | |      | |     | |        |              |      |                |
129
     ___|    |_|      |_|     |_|        |_.............|      |________________|
129
     ___|    |_|      |_|     |_|        |_.............|      |________________|
130
        <-----><-------><------><-------->              <------>                <---
130
        <-----><-------><------><-------->              <------>                <---
131
          t0       t1      t2       t4                     tn                     t0
131
          t0       t1      t2       t4                     tn                     t0
132
 
132
 
133
The PPM-Frame length is 22.5 ms.
133
The PPM-Frame length is 22.5 ms.
134
Channel high pulse width range is 0.7 ms to 1.7 ms completed by an 0.3 ms low pulse.
134
Channel high pulse width range is 0.7 ms to 1.7 ms completed by an 0.3 ms low pulse.
135
The mininimum time delay of two events coding a channel is ( 0.7 + 0.3) ms = 1 ms.
135
The mininimum time delay of two events coding a channel is ( 0.7 + 0.3) ms = 1 ms.
136
The maximum time delay of two events coding a chanel is ( 1.7 + 0.3) ms = 2 ms.
136
The maximum time delay of two events coding a chanel is ( 1.7 + 0.3) ms = 2 ms.
137
The minimum duration of all channels at minimum value is  8 * 1 ms = 8 ms.
137
The minimum duration of all channels at minimum value is  8 * 1 ms = 8 ms.
138
The maximum duration of all channels at maximum value is  8 * 2 ms = 16 ms.
138
The maximum duration of all channels at maximum value is  8 * 2 ms = 16 ms.
139
The remaining time of (22.5 - 8 ms) ms = 14.5 ms  to (22.5 - 16 ms) ms = 6.5 ms is
139
The remaining time of (22.5 - 8 ms) ms = 14.5 ms  to (22.5 - 16 ms) ms = 6.5 ms is
140
the syncronization gap.
140
the syncronization gap.
141
*/
141
*/
142
ISR(TIMER1_CAPT_vect) // typical rate of 1 ms to 2 ms
142
ISR(TIMER1_CAPT_vect) // typical rate of 1 ms to 2 ms
143
{
143
{
144
    int16_t signal = 0, tmp;
144
    int16_t signal = 0, tmp;
145
        static int16_t index;
145
        static int16_t index;
146
        static uint16_t oldICR1 = 0;
146
        static uint16_t oldICR1 = 0;
147
 
147
 
148
        // 16bit Input Capture Register ICR1 contains the timer value TCNT1
148
        // 16bit Input Capture Register ICR1 contains the timer value TCNT1
149
        // at the time the edge was detected
149
        // at the time the edge was detected
150
 
150
 
151
        // calculate the time delay to the previous event time which is stored in oldICR1
151
        // calculate the time delay to the previous event time which is stored in oldICR1
152
        // calculatiing the difference of the two uint16_t and converting the result to an int16_t
152
        // calculatiing the difference of the two uint16_t and converting the result to an int16_t
153
        // implicit handles a timer overflow 65535 -> 0 the right way.
153
        // implicit handles a timer overflow 65535 -> 0 the right way.
154
        signal = (uint16_t) ICR1 - oldICR1;
154
        signal = (uint16_t) ICR1 - oldICR1;
155
        oldICR1 = ICR1;
155
        oldICR1 = ICR1;
156
 
156
 
157
    //sync gap? (3.52 ms < signal < 25.6 ms)
157
    //sync gap? (3.52 ms < signal < 25.6 ms)
158
        if((signal > 1100) && (signal < 8000))
158
        if((signal > 1100) && (signal < 8000))
159
        {
159
        {
160
                // if a sync gap happens and there where at least 4 channels decoded before
160
                // if a sync gap happens and there where at least 4 channels decoded before
161
                // then the NewPpmData flag is reset indicating valid data in the PPM_in[] array.
161
                // then the NewPpmData flag is reset indicating valid data in the PPM_in[] array.
162
                if(index >= 4)
162
                if(index >= 4)
163
                {
163
                {
164
                        NewPpmData = 0;  // Null means NewData for the first 4 channels
164
                        NewPpmData = 0;  // Null means NewData for the first 4 channels
165
                }
165
                }
166
                // synchronize channel index
166
                // synchronize channel index
167
                index = 1;
167
                index = 1;
168
        }
168
        }
169
        else // within the PPM frame
169
        else // within the PPM frame
170
    {
170
    {
171
        if(index < 14) // PPM24 supports 12 channels
171
        if(index < 14) // PPM24 supports 12 channels
172
        {
172
        {
173
                        // check for valid signal length (0.8 ms < signal < 2.1984 ms)
173
                        // check for valid signal length (0.8 ms < signal < 2.1984 ms)
174
                        // signal range is from 1.0ms/3.2us = 312 to 2.0ms/3.2us = 625
174
                        // signal range is from 1.0ms/3.2us = 312 to 2.0ms/3.2us = 625
175
            if((signal > 250) && (signal < 687))
175
            if((signal > 250) && (signal < 687))
176
            {
176
            {
177
                                // shift signal to zero symmetric range  -154 to 159
177
                                // shift signal to zero symmetric range  -154 to 159
178
                signal -= 466; // offset of 1.4912 ms ??? (469 * 3.2µs = 1.5008 ms)
178
                signal -= 466; // offset of 1.4912 ms ??? (469 * 3.2µs = 1.5008 ms)
179
                // check for stable signal
179
                // check for stable signal
180
                if(abs(signal - PPM_in[index]) < 6)
180
                if(abs(signal - PPM_in[index]) < 6)
181
                {
181
                {
182
                                        if(RC_Quality < 200) RC_Quality +=10;
182
                                        if(RC_Quality < 200) RC_Quality +=10;
183
                                        else RC_Quality = 200;
183
                                        else RC_Quality = 200;
184
                                }
184
                                }
185
                                // calculate exponential history for signal
185
                                // calculate exponential history for signal
186
                tmp = (3 * (PPM_in[index]) + signal) / 4;
186
                tmp = (3 * (PPM_in[index]) + signal) / 4;
187
                if(tmp > signal+1) tmp--; else
187
                if(tmp > signal+1) tmp--; else
188
                if(tmp < signal-1) tmp++;
188
                if(tmp < signal-1) tmp++;
189
                // calculate signal difference on good signal level
189
                // calculate signal difference on good signal level
190
                if(RC_Quality >= 195)  PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; // cut off lower 3 bit for nois reduction
190
                if(RC_Quality >= 195)  PPM_diff[index] = ((tmp - PPM_in[index]) / 3) * 3; // cut off lower 3 bit for nois reduction
191
                else PPM_diff[index] = 0;
191
                else PPM_diff[index] = 0;
192
                PPM_in[index] = tmp; // update channel value
192
                PPM_in[index] = tmp; // update channel value
193
            }
193
            }
194
            index++; // next channel
194
            index++; // next channel
195
            // demux sum signal for channels 5 to 7 to J3, J4, J5
195
            // demux sum signal for channels 5 to 7 to J3, J4, J5
196
                if(index == 5) J3HIGH; else J3LOW;
196
                if(index == 5) J3HIGH; else J3LOW;
197
                if(index == 6) J4HIGH; else J3LOW;
197
                if(index == 6) J4HIGH; else J4LOW;
198
                if(CPUType != ATMEGA644P) // not used as TXD1
198
                if(CPUType != ATMEGA644P) // not used as TXD1
199
                {
199
                {
200
                                if(index == 7) J5HIGH; else J5LOW;
200
                                if(index == 7) J5HIGH; else J5LOW;
201
                }
201
                }
202
        }
202
        }
203
        }
203
        }
204
}
204
}
205
 
205
 
206
 
206
 
207
 
207
 
208
 
208
 
209
 
209
 
210
 
210