        LIST P=12F675,R=HEX
;
;       Retractable Landing Gear CONTROLLOR FOR R/C airccraft
;       SUN, PU-NENG
;       
;	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  ---------
TMR0	EQU 1		;TIMER 0
PCL     EQU 2           ;PROGRAM COUNTER
STATUS  EQU 3
FSR     EQU 4           ;BUFFER OF INDIRECT ADDR
GPIO	EQU 5
OPTION_reg	EQU 0x81
TRISIO	EQU 0x85
OSCCAL  EQU 0x90	
RP0	EQU 5
CMCON	EQU 0x19	;CMCON REGISTER
ANSEL   EQU 0x9F	;ANALOG SEL
CM0     EQU 0
CM1     EQU 1
CM2     EQU 2
;
;
;----  USER registers DEFINE  ------
;
TMR2    EQU H'21'       ;
TMR3    EQU H'22'       ;PWM WIDTH, INPUT
TMR4    EQU H'23'       ; 
POINT   EQU H'24'       ;CURRENT POSITION
DELAY   EQU H'25'       ;DALEY
POINT2  EQU H'26'	;SERVO2 POSITION
;
;----  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'03'       ;DTIME X 2SEC =6 SEC, 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
;
;----  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'3F84' ;_INTRC_OSC_NOCLKOUT,WDT OFF,PWRTE ON
;
;
;
;
;
;==========   MAIN PROGRAM   =========
;------------------------------------
;INPUT PARAMETERS,
;TEMP REGISTERS 
;OUTPUT PARAMETERS
;------------------------------------
;--- RESTORE OSC CALIBRATION ---------

	ORG     0
	BSF STATUS,RP0	;;BANK1
	CALL 3FFh
	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		
	MOVWF TRISIO 
	MOVLW H'C0'	;T0CS=0, TO ENABLE GP2
	MOVWF OPTION_reg 	
	CLRF  ANSEL	;Turn off ADC on the 12F675 - All pins digital
	BCF STATUS,RP0	;BANK0
	BSF   CMCON,CM2	;turn the input pins back to digital
	BSF   CMCON,CM1
	BSF   CMCON,CM0
	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 T5	;RESTORE TMR4
	MOVWF TMR4
	RETURN
;---------------------------------------------










;-------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
	RETURN
;-----------------------------------------------










;-------  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
	RETURN
	MOVLW DTIME
        MOVWF DELAY
;---------------------
	MOVF POINT,W	;LOAD CURRENT POINT
        SUBWF TMR3,W
        SKPNZ           ;IF f = w, Z=1,NO SKIP 
        RETURN       
	SKPC		;IF TMR3 f > POINT w, C=1, SKIP
	GOTO	OPEN2	;IF f < w, C=0, 
	INCF POINT,F	
        RETURN

OPEN2 	DECF POINT,F	
        RETURN
;----------------------------------









;-------  CLOSE CABIN & RETRIEVE THE LANDING GEAR  ------------
;TMR3,POINT,DTIME,OPENPOSI, CLOSEPOSI
;DELAY
;POINT,POINT2
;-----------------------------------------------
CLOSE	DECFSZ DELAY,F
	RETURN
	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	
        RETURN

CLOSE2 	DECF POINT,F	
        RETURN

CLOSE3 	MOVLW	CLOSEPOSI
	MOVWF 	POINT2
	BCF	GPIO,LL1	;LANDING LIGHT OFF
	RETURN
;---------------------------------------








;-------       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	;
	RETURN
	MOVLW T5	;RESTORE TMR4
	MOVWF TMR4
        BTFSS GPIO,ACSL1
	GOTO K6		;LSTA=0
	BCF GPIO,ACSL1	;LSTA=1
	BSF GPIO,ACSL2	
	RETURN
K6	BSF GPIO,ACSL1	;LSTA=0
	BCF GPIO,ACSL2	
	RETURN

;---------------------------------------------------
        END


