Hi Alexandros
I had committed that from what you wrote ...
...Code:'**************************************************************************** ' (c)2009 Alexandros Zahariadis (E.A.TH.) Greece * ' Electric Glider electronic switch to be used in F3J-GR competitions. ' The device will cut-off motor if 200m ALT reached or 30seconds passed ' whichever comes first! ' There is also a status led option which idicates if you have reached 200m ' or not (may be because of luck of power!) ' steady led -> 200m ALT reached , blinking led -> 30 secs passed. ' NOTE: after a lot of experiments and because of code execution speed ' I use direct ADC raw sample values without converting them to meters first! ' :: thanks to Acetronics (Alain) and picbasic forum for codding ideas :: '**************************************************************************** '@ DEVICE FCMEN_OFF '@ DEVICE IESO_OFF '@ DEVICE BOD_ON '@ DEVICE CPD_OFF '@ DEVICE PROTECT_OFF '@ DEVICE MCLR_OFF '@ DEVICE PWRT_OFF '@ DEVICE WDT_OFF '@ DEVICE INTRC_OSC @ __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _BOD_ON INCLUDE "modedefs.bas" clear DEFINE OSC 4 define PULSIN_MAX 250 ;DEFINE DEBUG_REG GPIO ;DEFINE DEBUG_BIT 2 ;DEFINE DEBUG_BAUD 9600 ;DEFINE DEBUG_MODE 1 OSCCON = $60 ' $60:4 Mhz $70:8 Mhz int. CMCON0 = 7 'TURN COMPARATORS OFF TRISIO = %00001010 'Set GPIO1 and GPIO3 0 INPUTS, others to OUTPUT ANSEL = %00000100 'Set AN2 , Fosc/32 ADCON0 = %00000000 'AN2 select & Right Justify for 10-bit ;--------------------------------------------------------------------------- THROTTLE VAR GPIO.0 'Outputs to throttle servo RADIO VAR GPIO.1 'Input from receiver LED var GPIO.2 'status indicator ADC_DATA var GPIO.3 ' adc serial data ADC_SCLK var GPIO.5 ' adc serial clock ADC_CS var GPIO.4 ' adc chip select ;--------------------------------------------------------------------------- advalue var word ' value read from adc groundALT var word difalt var word P VAR WORD ' This stores the PULSIN value x var byte ' general var y var byte ' general var SEC_COUNT VAR BYTE ' seconds counter O_FLOWS VAR BYTE ' holds the number of timer1 overflows BRAKE_PULSE var word ' servo pulse to STOP (brake on) THR servo BRAKE_PULSE = 100 '-= vars for averaging routine =- AvgCount CON 6 ' = Number of samples to average FAspread CON 1000 ' = Fast Average threshold +/- Value VAR WORD '-= end of vars for averaging routine =- '****************************************************************************** ' TIMER1 Cycle MUST be longer than a R/C frame duration to be sure not to miss any ticks. ' 50 ms is a good value for timing precision. ' PL = 15543 @ 4Mhz ( reload = 7 cycle ) '****************************************************************************** T1LO CON $49 'timer1 preload values T1HI CON $C3 '$C349 -> -15543 low throttle INTCON = 0 ' disable interrupts T1CON = %00010000 ' 1:2 prescale (1uS per tick), timer1 off (max 1:8!) ' 11 = 1:8 ,10 = 1:4, 01 = 1:2, 00 = 1:1 Prescale Value TMR1H = T1HI ' 65,536-15536 = 50.000 TMR1L = T1LO ' 50.000 ticks * 1uS =50.000usec.=100msec ' 1 second= 100*10 ' every 10 timer1 overflows = 1 second 1uS= '--------------------------------------------------------------------------- pause 3000 for x=1 to 4 high led pause 200 low led pause 100 next x '****************************************************************************** CAL_BP: ' CALIBRATING Brake_Pulse ( P ) '****************************************************************************** Pause 50 LOW led P = 0 For x = 1 TO 16 PulsIn radio,1,P IF ( P < 80 ) OR ( P > 220 ) Then Led = 1 GoTo CAL_BP EndIF IF P = $00 Then prems IF ( P < (Brake_Pulse -1)) OR ( P > (Brake_Pulse +1)) THEN Led = 1 GoTo CAL_BP ENDIF prems: Brake_Pulse = P Next x LOW Throttle ''****************************************************************************** 'calibrate: 'check for valid signal ' 'For x = 1 TO 2 ' ' PulsIn radio,1,P ' pauseus 10 ' IF ( P < 80 ) OR ( P > 200 ) Then calibrate ' next x ' 'for x=1 to 3 ' PulsIn radio,1,P ' brake_pulse = P 'next x ' 'low led ' 'low throttle '***************************************************************************** precheck: 'leave some seconds to do a motor test 'then motor brake is ON for some seconds for y=1 to 3 for x=1 to 255 PULSIN RADIO,1,P IF ( P < 80 ) OR ( P > 220 ) Then Led = 1 GoTo Precheck EndIF Led = 0 LOW Throttle pULSOUT THROTTLE, p next x next y for x=1 to 160 LOW Throttle PULSOUT THROTTLE, brake_pulse pause 18 next x low THROTTLE GOSUB GetAdc 'Get ground ALT groundalt=value '****************************************************************************** armcheck: ' Now, we can launch the beast ... PULSIN RADIO,1,P IF ( P < 80 ) OR ( P > 220 ) Then Led = 1 ' Show Problem !!! LOW Throttle GoTo Armcheck ENDIF Led = 0 low throttle PULSOUT THROTTLE, p if difalt < 2 OR difalt > 10000 then Armcheck 'Arm if>=5mALT (in adc samples) reached!! '****************************************************************************** '****************************************************************************** start: ' We are flying , now ... preset timer1 SEC_COUNT=28 ' load for 30 to 0 seconds countdown O_FLOWS=0 ' clear overflow count PIR1.0=0 ' clear timer1 overflow flag T1CON.0=1 ' start timer1 low throttle ' to be sure ... '****************************************************************************** main: gosub GetADC PULSIN RADIO,1,P pauseUS 10 pULSOUT THROTTLE, p ' Note: Timer1 overflows every 0.050 seconds IF PIR1.0 THEN ' if timer1 overflow then O_FLOWS = O_FLOWS + 1 ' inc oveflow counter IF O_FLOWS = 20 THEN ' if 1 second elapsed SEC_COUNT = SEC_COUNT - 1 ' decrement seconds count O_FLOWS=0 ' reset overflow counter ENDIF PIR1.0=0 ' clear timer1 overflow flag T1CON.0 = 0 ' stop timer1 TMR1H = T1HI ' Reload values TMR1L = T1LO T1CON.0=1 ' re-start timer1 ENDIF if difalt>=89 and difalt<10000 then KILL_MOTOR_ALT 'Check if 100mALT '(in adc samples) reached!! if sec_count<=0 then KILL_MOTOR_TMR goto main ' SUBROUTINES '****************************************************************************** '****************************************************************************** GetADC: 'Read MAX187 12bit ADC value low ADC_CS PAUSEUS 10 shiftin ADC_DATA,ADC_SCLK,msbpost,[advalue\12] high ADC_CS Average:' -=-=-=-=-=-= Average 6 X Analog values -=-=-=-=-=-=-=-=-=-= IF Value = advalue Then NoChange IF ABS (Value - advalue) > FAspread OR Value < AvgCount Then FastAvg IF ABS (Value - advalue) < AvgCount Then RealClose advalue = advalue - (advalue/AvgCount) advalue = advalue + (Value/AvgCount) GoTo AVGok FastAvg: advalue = Value GoTo AVGok RealClose:'If averaging more than 8 samples,change to (AvgCount/4) advalue = advalue - (advalue/(AvgCount/2)) advalue = advalue + (Value/(AvgCount/2)) AVGok: Value = advalue ' Put Average back into Value NoChange:' -=-=-=-=-=-= End of Averageing -=-=-=-=-=-=-=-=-=-= difalt=value-groundalt return END '****************************************************************************** KILL_MOTOR_ALT: low throttle high led LOOP1: PULSOUT throttle, brake_pulse ; Kill motor - adjust this value. 4Mhz ->> 10uSec pause 18 goto LOOP1 END '****************************************************************************** KILL_MOTOR_TMR: x = 0 LOOP2: low throttle PULSOUT throttle, brake_pulse ; Kill motor - adjust this value. 4Mhz ->> 10uSec IF X = 0 THEN led = led ^ 1 x = ( x+1 ) // 18 ' Counter for led Blinking @ 1.5 Hz pause 18 goto LOOP2 END '****************************************************************************** '******************************************************************************
But did not try it ...
have fun
Alain




Bookmarks