$regfile = "M32DEF.DAT" $crystal = 16000000 $hwstack = 64 $swstack = 64 $framesize = 32 Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.4 , Db7 = Portc.5 , E = Portc.1 , Rs = Portc.0 Config Lcd = 16 * 2 Config Timer1 = Timer , Prescale = 8 'counts 0.5µs Stop Timer1 On Timer1 Timer1isr Config Adc = Single , Prescaler = 64 Start Adc Enable Interrupts Enable Timer1 'The PPM signal is a frame of 25ms (timer1 50000), pause is low 'Start to fill up the 25ms 'Pause always 0.3ms (600) (counts to full signal lenth of 1 to 2 ms) 'Channel 1 to 8 neutral 1.2ms (2400), +/-500µs (1000) plus setting to 140% +/-700µs Ddrb.3 = 1 Swon Alias Portb.3 'the main switch for power Button Alias Pinb.4 'the pushbutton for ON Ddrc.7 = 1 'Output PPM Ppm Alias Portc.7 Ddrc.6 = 1 Led Alias Portc.6 Portd = 255 'Pullups Dig in 0-10 Portb.0 = 1 Portb.1 = 1 Portb.2 = 1 Din0 Alias Pind.0 'Dig in 0-10 Din1 Alias Pind.1 Din2 Alias Pind.2 Din3 Alias Pind.3 Din4 Alias Pind.4 Din5 Alias Pind.5 Din6 Alias Pind.6 Din7 Alias Pind.7 Din8 Alias Pinb.0 Din9 Alias Pinb.1 Din10 Alias Pinb.2 Dim Battery As Word Dim State As Byte Dim Stateid As Byte Dim Value(9) As Long Dim Ch As Byte Dim Stickup(8) As Integer Dim Stickdown(8) As Integer Dim Neutral(8) As Integer Dim Invert(8) As Byte Dim Modelno As Byte Dim Rate1up(8) As Byte Dim Rate1down(8) As Byte Dim Rate2up(8) As Byte Dim Rate2down(8) As Byte Dim Rate3up(8) As Byte Dim Rate3down(8) As Byte Dim Rate4up(8) As Byte Dim Rate4down(8) As Byte Dim Rate5up(8) As Byte Dim Rate5down(8) As Byte Dim Rate6up(8) As Byte Dim Rate6down(8) As Byte Dim Rate7up(8) As Byte Dim Rate7down(8) As Byte Dim Rate8up(8) As Byte Dim Rate8down(8) As Byte Dim E_stickup(8) As Eram Integer Dim E_stickdown(8) As Eram Integer Dim E_neutral(8) As Eram Integer Dim E_invert(8) As Eram Byte Dim E_modelno As Eram Byte Dim E_rate1up(8) As Eram Byte Dim E_rate1down(8) As Eram Byte Dim E_rate2up(8) As Eram Byte Dim E_rate2down(8) As Eram Byte Dim E_rate3up(8) As Eram Byte Dim E_rate3down(8) As Eram Byte Dim E_rate4up(8) As Eram Byte Dim E_rate4down(8) As Eram Byte Dim E_rate5up(8) As Eram Byte Dim E_rate5down(8) As Eram Byte Dim E_rate6up(8) As Eram Byte Dim E_rate6down(8) As Eram Byte Dim E_rate7up(8) As Eram Byte Dim E_rate7down(8) As Eram Byte Dim E_rate8up(8) As Eram Byte Dim E_rate8down(8) As Eram Byte Dim I As Byte 'just counting '####### Init ####### Wait 2 Swon = 1 Modelno = E_modelno 'read model number from Eram If Modelno = 255 Then Gosub Fill_eram 'fill up with default values at first start Gosub Read_eram 'get saved values from eram Cls Lcd "go" Do nop Loop Until Button = 0 Start Timer1 '####### Main Loop ############ Do Battery = Getadc(7) If Button = 1 Then Swon = 0 Wait 1 Cls Lcd "R " Lcd Rate1up(1) Wait 1 Cls Lcd "Sup " Lcd Stickup(1) Wait 1 Cls Lcd "Sdown " Lcd Stickdown(1) Wait 1 Cls Lcd "modelno " Lcd Modelno Loop '####### Subroutines ########### Timer1isr: Incr State If State = 19 Then State = 1 Stateid = State Mod 2 If Stateid = 0 Then Gosub 300us 'state even -> pause Else Stateid = State / 2 'now it's 0,1,2,3...8 for 1,3,5,7...17 Ch = Stateid 'Channel 1...8 On Stateid Gosub Startbit , Ch1 , Ch2 , Ch3 , Ch4 , Ch5 , Ch6 , Ch7 , Ch8 End If Return 300us: Ppm = 0 Timer1 = 65535 - 600 '300µs Return Startbit: Ppm = 1 Value(9) = 24000 For I = 1 To 8 Value(9) = Value(9) - Value(i) Next I Timer1 = 65535 - value(9) Return Ch1: Ppm = 1 Value(ch) = Value(ch) + 2400 'value1 is the travel up/down in 0,5µs, 2400µs is neutral Timer1 = 65535 - Value(ch) 'preload timer Value(ch) = Getadc(0) Value(ch) = Value(ch) - Neutral(ch) 'now pos/neg travel from neutral Value(ch) = Value(ch) * 1000 'upscaled to to 500µs travel If Value(ch) >= 0 Then Value(ch) = Value(ch) / Stickup(ch) 'scaled to upper stick range Value(ch) = Value(ch) * Rate1up(modelno) 'Rate of channel up % If Value(ch) > 140000 Then Value(ch) = 140000 'limit to the max allowed value Else Value(ch) = Value(ch) / Stickdown(ch) 'scaled to lower stick range Value(ch) = Value(ch) * Rate1down(modelno) 'Rate of channel down % If Value(ch) < -140000 Then Value(ch) = -140000 'limit to the max allowed value End If Value(ch) = Value(ch) / 100 'Rate was in % If Invert(ch) = 1 Then Value(ch) = Value(ch) * -1 'invert Return Ch2: Ppm = 1 Value(ch) = Value(ch) + 2400 'value1 is the travel up/down in 0,5µs, 2400µs is neutral Timer1 = 65535 - Value(ch) 'preload timer Value(ch) = 700 'Getadc(1) Value(ch) = Value(ch) - Neutral(ch) 'now pos/neg travel from neutral Value(ch) = Value(ch) * 1000 'upscaled to to 500µs travel If Value(ch) >= 0 Then Value(ch) = Value(ch) / Stickup(ch) 'scaled to upper stick range Value(ch) = Value(ch) * Rate2up(modelno) 'Rate of channel up % If Value(ch) > 140000 Then Value(ch) = 140000 'limit to the max allowed value Else Value(ch) = Value(ch) / Stickdown(ch) 'scaled to lower stick range Value(ch) = Value(ch) * Rate2down(modelno) 'Rate of channel down % If Value(ch) < -140000 Then Value(ch) = -140000 'limit to the max allowed value End If Value(ch) = Value(ch) / 100 'Rate was in % If Invert(ch) = 1 Then Value(ch) = Value(ch) * -1 'invert Return Ch3: Ppm = 1 Value(ch) = Value(ch) + 2400 'value1 is the travel up/down in 0,5µs, 2400µs is neutral Timer1 = 65535 - Value(ch) 'preload timer Value(ch) = 500 'Getadc(2) Value(ch) = Value(ch) - Neutral(ch) 'now pos/neg travel from neutral Value(ch) = Value(ch) * 1000 'upscaled to to 500µs travel If Value(ch) >= 0 Then Value(ch) = Value(ch) / Stickup(ch) 'scaled to upper stick range Value(ch) = Value(ch) * Rate3up(modelno) 'Rate of channel up % If Value(ch) > 140000 Then Value(ch) = 140000 'limit to the max allowed value Else Value(ch) = Value(ch) / Stickdown(ch) 'scaled to lower stick range Value(ch) = Value(ch) * Rate3down(modelno) 'Rate of channel down % If Value(ch) < -140000 Then Value(ch) = -140000 'limit to the max allowed value End If Value(ch) = Value(ch) / 100 'Rate was in % If Invert(ch) = 1 Then Value(ch) = Value(ch) * -1 'invert Return Ch4: Ppm = 1 Value(ch) = Value(ch) + 2400 'value1 is the travel up/down in 0,5µs, 2400µs is neutral Timer1 = 65535 - Value(ch) 'preload timer Value(ch) = 500 'Getadc(3) Value(ch) = Value(ch) - Neutral(ch) 'now pos/neg travel from neutral Value(ch) = Value(ch) * 1000 'upscaled to to 500µs travel If Value(ch) >= 0 Then Value(ch) = Value(ch) / Stickup(ch) 'scaled to upper stick range Value(ch) = Value(ch) * Rate4up(modelno) 'Rate of channel up % If Value(ch) > 140000 Then Value(ch) = 140000 'limit to the max allowed value Else Value(ch) = Value(ch) / Stickdown(ch) 'scaled to lower stick range Value(ch) = Value(ch) * Rate4down(modelno) 'Rate of channel down % If Value(ch) < -140000 Then Value(ch) = -140000 'limit to the max allowed value End If Value(ch) = Value(ch) / 100 'Rate was in % If Invert(ch) = 1 Then Value(ch) = Value(ch) * -1 'invert Return Ch5: Ppm = 1 Value(ch) = Value(ch) + 2400 'value1 is the travel up/down in 0,5µs, 2400µs is neutral Timer1 = 65535 - Value(ch) 'preload timer Value(ch) = 500 'Getadc(4) Value(ch) = Value(ch) - Neutral(ch) 'now pos/neg travel from neutral Value(ch) = Value(ch) * 1000 'upscaled to to 500µs travel If Value(ch) >= 0 Then Value(ch) = Value(ch) / Stickup(ch) 'scaled to upper stick range Value(ch) = Value(ch) * Rate5up(modelno) 'Rate of channel up % If Value(ch) > 140000 Then Value(ch) = 140000 'limit to the max allowed value Else Value(ch) = Value(ch) / Stickdown(ch) 'scaled to lower stick range Value(ch) = Value(ch) * Rate5down(modelno) 'Rate of channel down % If Value(ch) < -140000 Then Value(ch) = -140000 'limit to the max allowed value End If Value(ch) = Value(ch) / 100 'Rate was in % If Invert(ch) = 1 Then Value(ch) = Value(ch) * -1 'invert Return Ch6: Ppm = 1 Value(ch) = Value(ch) + 2400 'value1 is the travel up/down in 0,5µs, 2400µs is neutral Timer1 = 65535 - Value(ch) 'preload timer Value(ch) = 500 'Getadc(5) Value(ch) = Value(ch) - Neutral(ch) 'now pos/neg travel from neutral Value(ch) = Value(ch) * 1000 'upscaled to to 500µs travel If Value(ch) >= 0 Then Value(ch) = Value(ch) / Stickup(ch) 'scaled to upper stick range Value(ch) = Value(ch) * Rate6up(modelno) 'Rate of channel up % If Value(ch) > 140000 Then Value(ch) = 140000 'limit to the max allowed value Else Value(ch) = Value(ch) / Stickdown(ch) 'scaled to lower stick range Value(ch) = Value(ch) * Rate6down(modelno) 'Rate of channel down % If Value(ch) < -140000 Then Value(ch) = -140000 'limit to the max allowed value End If Value(ch) = Value(ch) / 100 'Rate was in % If Invert(ch) = 1 Then Value(ch) = Value(ch) * -1 'invert Return Ch7: Ppm = 1 Value(ch) = Value(ch) + 2400 'value1 is the travel up/down in 0,5µs, 2400µs is neutral Timer1 = 65535 - Value(ch) 'preload timer Value(ch) = 500 '500Getadc(6) Value(ch) = Value(ch) - Neutral(ch) 'now pos/neg travel from neutral Value(ch) = Value(ch) * 1000 'upscaled to to 500µs travel If Value(ch) >= 0 Then Value(ch) = Value(ch) / Stickup(ch) 'scaled to upper stick range Value(ch) = Value(ch) * Rate7up(modelno) 'Rate of channel up % If Value(ch) > 140000 Then Value(ch) = 140000 'limit to the max allowed value Else Value(ch) = Value(ch) / Stickdown(ch) 'scaled to lower stick range Value(ch) = Value(ch) * Rate7down(modelno) 'Rate of channel down % If Value(ch) < -140000 Then Value(ch) = -140000 'limit to the max allowed value End If Value(ch) = Value(ch) / 100 'Rate was in % If Invert(ch) = 1 Then Value(ch) = Value(ch) * -1 'invert Return Ch8: Ppm = 1 Value(ch) = Value(ch) + 2400 'value1 is the travel up/down in 0,5µs, 2400µs is neutral Timer1 = 65535 - Value(ch) 'preload timer Value(ch) = 0 Return Fill_eram: For I = 1 To 8 '#### set default values #### Stickup(i) = 250 'typical for MPX-Stick Stickdown(i) = 250 Neutral(i) = 512 Rate1up(i) = 100 Rate1down(i) = 100 Rate2up(i) = 100 Rate2down(i) = 100 Rate3up(i) = 100 Rate3down(i) = 100 Rate4up(i) = 100 Rate4down(i) = 100 Rate5up(i) = 100 Rate5down(i) = 100 Rate6up(i) = 100 Rate6down(i) = 100 Rate7up(i) = 100 Rate7down(i) = 100 Rate8up(i) = 100 Rate8down(i) = 100 '#### store values in eram #### E_stickup(i) = Stickup(i) E_stickdown(i) = Stickdown(i) E_neutral(i) = Neutral(i) E_rate1up(i) = Rate1up(i) E_rate1down(i) = Rate1up(i) E_rate2up(i) = Rate2up(i) E_rate2down(i) = Rate2up(i) E_rate3up(i) = Rate3up(i) E_rate3down(i) = Rate3up(i) E_rate4up(i) = Rate4up(i) E_rate4down(i) = Rate4up(i) E_rate5up(i) = Rate5up(i) E_rate5down(i) = Rate5up(i) E_rate6up(i) = Rate6up(i) E_rate6down(i) = Rate6up(i) E_rate7up(i) = Rate7up(i) E_rate7down(i) = Rate7up(i) E_rate8up(i) = Rate8up(i) E_rate8down(i) = Rate8up(i) Next I Modelno = 1 E_modelno = Modelno Return '##### Read_eram: Modelno = E_modelno For I = 1 To 8 Stickup(i) = E_stickup(i) Stickdown(i) = E_stickdown(i) Neutral(i) = E_neutral(i) Rate1up(i) = E_rate1up(i) Rate1down(i) = E_rate1up(i) Rate2up(i) = E_rate2up(i) Rate2down(i) = E_rate2up(i) Rate3up(i) = E_rate3up(i) Rate3down(i) = E_rate3up(i) Rate4up(i) = E_rate4up(i) Rate4down(i) = E_rate4up(i) Rate5up(i) = E_rate5up(i) Rate5down(i) = E_rate5up(i) Rate6up(i) = E_rate6up(i) Rate6down(i) = E_rate6up(i) Rate7up(i) = E_rate7up(i) Rate7down(i) = E_rate7up(i) Rate8up(i) = E_rate8up(i) Rate8down(i) = E_rate8up(i) Next I Return