LIST P=12C509A,R=HEX ; ; Retractable Landing Gear CONTROLLOR FOR R/C airccraft ; SUN, PU-NENG ; ; code for 12C509A and 12F509A ; for 12F508A and 12C508A , change the first line (P=12C508A) ; ; V 4.1 (2015/06) ; ; ; VERSION 4.0 (FEB/19/2005) ; ADD ONE MORE SERVO TO CONTROL LANDING-GEAR CABIN DOOR ; ; VERSION 3.0 (MAY/05/2004) ; END POINTS ADJUSTABLE, FOR HIGH-END LIKE FUTABA FF8, JR 9X ; DTIME * 2SEC = TIME TO MOVE FROM SIDE TO SIDE ; ; CHIP CONFIG : INTERC, WDT OFF TO AVOID SERVOS CONFLICT. ; ; ; DEFINE RAM ;----- SYSTEM --------- INDF EQU H'0000' TMR0 EQU H'0001' PCL EQU H'0002' STATUS EQU H'0003' FSR EQU H'0004' OSCCAL EQU H'0005' GPIO EQU H'0006' ; ; ;---- USER registers DEFINE ------ ; TMR2 EQU H'11' ; TMR3 EQU H'12' ;PWM WIDTH, INPUT TMR4 EQU H'13' ; POINT EQU H'14' ;CURRENT POSITION DELAY EQU H'15' ;DALEY for gear retraction POINT2 EQU H'16' ;SERVO2 POSITION delay2 EQU H'17' ; delay registor between gear retraction and door close ;///////////// ; ;---- USER FLAGS IN FLAGR DEFINE ------ ; ;---- VARIABLES DEFINE ---- ; W EQU 0 ;d VALUE FOR INCF...... F EQU 1 ;d VALUE NOISE EQU D'80' ;PULSE LESS THEN THIS DEFINE AS NOISE, 0.8mS T5 EQU D'25' ;25 X 20mS =0.5S, HALF OF ACSL FLASH TIME *** DTIME EQU D'01' ;DTIME X 2SEC =2 SEC, retraction RUN FROM SIDE TO SIDE RLIMIT EQU D'180' ;INPUT PWM > 170 = OPEN LLIMIT EQU D'120' ;INPUT PWM < 130 = CLOSE INITPOSI EQU D'110' ;INITIAL POSITION OF GEAR OPENPOSI EQU D'200' ;OPEN POSITION OF SERVO 2 CLOSEPOSI EQU D'100' ;CLOSE POSITION OF SERVO 2 dtime2 EQU D'140' ;delay value between gear retraction and door close (140/25) sec ;///////////// ; ;---- HARDWARE PINS DEFINE ---- INPIN EQU 3 ;RB0 AS INPUT PORT OUTPIN EQU 2 ;RB2 AS OUTPUT PORT ACSL1 EQU 0 ;Anti-Collision Strobe Light, FLASH ACSL2 EQU 1 ;INVERT OF ACSL1 LL1 EQU 4 ;Landing Lights ON/OFF ACTION*** SERVO2 EQU 5 ;CABIN DOOR ; ;---- SYSTEM CONFIG ---- __CONFIG H'0FEA' ;INTRC, WDT OFF ; ; ; ; ; ;========== MAIN PROGRAM ========= ;------------------------------------ ;INPUT PARAMETERS, ;TEMP REGISTERS ;OUTPUT PARAMETERS ;------------------------------------ ;--- RESTORE OSC CALIBRATION --------- ORG 0 MOVWF OSCCAL ;RESTORE OSC CALI ;---------------------------------- START CALL INIT_SYS ;---------------------------------------- ;TMR3,NOISE,RLIMIT,LLIMIT ; ; ;--------------------------------------- MAIN CALL GET_PWM MOVLW NOISE SUBWF TMR3,W SKPC ;IF f > w, C= 1,SKIP GOTO MAIN ;ELSE IT'S NOISE, NO OUTPUT MOVLW RLIMIT ;LOAD CURRENT POINT SUBWF TMR3,W SKPNC ;IF TMR3 f > w, C=1 CALL OPEN ;IF TMR3 f < w, C=0, MOVLW LLIMIT ;LOAD CURRENT POINT SUBWF TMR3,W SKPC ;IF TMR3 f > w, C=1, CALL CLOSE ;IF TMR3 f < w, C=0 CALL OUT_PUT GOTO MAIN ;===================================== ;------- INIT_SYS ---------------------- ;T5,DTIME ; ;TMR4, DELAY, POINT, POINT2 ;--------------------------------------- INIT_SYS MOVLW 8 ;PA3=INPUT, OTHERS =OUTPUT TRIS GPIO MOVLW H'C0' ; OPTION CLRF GPIO ;SET ALL OUTPUT LOW *** MOVLW INITPOSI ;INITIAL POSITION OF GEAR MOVWF POINT MOVLW OPENPOSI ;INITIAL POSITION OF CABIN DOOR MOVWF POINT2 MOVLW DTIME MOVWF DELAY MOVLW DTIME2 ; ///////////// MOVWF DELAY2 ; ///////////// MOVLW T5 ;RESTORE TMR4 MOVWF TMR4 RETLW 0 ;--------------------------------------------- ;-------GET INPUT PWM FROM INPIN ------------ ;GPIO_INPIN ; ;TMR3 ;--------------------------------------- GET_PWM BTFSS GPIO,INPIN ;IF INPIN = HIGH, INCREASE TMR3 GOTO GET_PWM CLRF TMR3 ;READ INPIN PULSE WEITH GET_PWM2 INCF TMR3,F ;START LOOP NOP NOP ;10 uS LOOP NOP NOP NOP NOP BTFSC GPIO,INPIN ;UNTIL INPIN GO LOW GOTO GET_PWM2 ;END LOOP RETLW 0 ;----------------------------------------------- ;------- OPEN CABIN & RELEASE THE LANDING GEAR ------------ ;TMR3,POINT,DTIME,OPENPOSI, CLOSEPOSI ;DELAY ;POINT,POINT2 ;----------------------------------------------- OPEN MOVLW OPENPOSI MOVWF POINT2 BSF GPIO,LL1 ;LANDING LIGHT ON ;--------------------- DECFSZ DELAY,F RETLW 0 MOVLW DTIME MOVWF DELAY ;--------------------- MOVF POINT,W ;LOAD CURRENT POINT SUBWF TMR3,W SKPNZ ;IF f = w, Z=1,NO SKIP RETLW 0 SKPC ;IF TMR3 f > POINT w, C=1, SKIP GOTO OPEN2 ;IF f < w, C=0, INCF POINT,F RETLW 0 OPEN2 DECF POINT,F RETLW 0 ;---------------------------------- ;------- CLOSE CABIN & RETRIEVE THE LANDING GEAR ------------ ;TMR3,POINT,DTIME,OPENPOSI, CLOSEPOSI ;DELAY ;POINT,POINT2 ;----------------------------------------------- CLOSE DECFSZ DELAY,F RETLW 0 MOVLW DTIME MOVWF DELAY ;--------------------- MOVF POINT,W ;LOAD CURRENT POINT SUBWF TMR3,W SKPNZ ;IF f = w, Z=1,NO SKIP GOTO CLOSE3 SKPC ;IF TMR3 f > POINT w, C=1, SKIP GOTO CLOSE2 ;IF f < w, C=0, INCF POINT,F RETLW 0 CLOSE2 DECF POINT,F RETLW 0 CLOSE3 DECFSZ DELAY2,F ; ///////////// RETLW 0 ; ///////////// MOVLW DTIME2 ; ///////////// MOVWF DELAY2 ; ///////////// MOVLW CLOSEPOSI MOVWF POINT2 BCF GPIO,LL1 ;LANDING LIGHT OFF RETLW 0 ;--------------------------------------- ;------- OUTPUT ------------ ;POINT, POINT2,T5 ;TMR2,TMR4 ;GPIO_OUTPIN,GPIO_SERVO2,GPIO_ACSL1,GPIO_ACSL2, ;--------------------------------------- OUT_PUT BSF GPIO,OUTPIN ;PULL OUTPIN HIGH MOVF POINT,W ; MOVWF TMR2 K3 NOP NOP NOP NOP NOP NOP NOP ;MAKE THIS LOOP 10 uS DECFSZ TMR2,F GOTO K3 ;END OF LOOP BCF GPIO,OUTPIN ;PULL PULSE LOW ;--------------------------- BSF GPIO,SERVO2 ;PULL OUTPIN HIGH MOVF POINT2,W ; MOVWF TMR2 K4 NOP NOP NOP NOP NOP NOP NOP ;MAKE THIS LOOP 10 uS DECFSZ TMR2,F GOTO K4 ;END OF LOOP BCF GPIO,SERVO2 ;PULL PULSE LOW ;-------FLASH ASCL K5 DECFSZ TMR4,F ; RETLW 0 MOVLW T5 ;RESTORE TMR4 MOVWF TMR4 BTFSS GPIO,ACSL1 GOTO K6 ;LSTA=0 BCF GPIO,ACSL1 ;LSTA=1 BSF GPIO,ACSL2 RETLW 0 K6 BSF GPIO,ACSL1 ;LSTA=0 BCF GPIO,ACSL2 RETLW 0 ;--------------------------------------------------- END