            LIST P=12C508A,R=HEX
;
;       MISSILE LAUNCH CONTROLLOR FOR R/C AIRPLANE
;       SUN, PU-NENG
;       
;	
;	VERSION 1.0  (FEB/25/2005)
;	TRIGGER TO LAUNCH, IF CONTINUOUS "ON", LAUNCH EVERY 3.3 SECONDS
;	GPIO 0 (PIN 7) OPEN = MODE 0, GROUNDING = MODE 1
;	MODE 0 LAUNCH BY SEQUENCE 1 -> 2 -> 3 ->4 
;	MODE 1 LAUNCH BY SEQUENCE 1&2 -> 3&4 
;	
;
;	CHIP CONFIG : INTERC, WDT OFF 
;	
;===================================================       
;       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'
W       EQU 0           
F       EQU 1    
;
;
;----  USER registers DEFINE  ------
;
TMR2    EQU H'11'       ;
TMR3    EQU H'12'       ;PWM WIDTH, INPUT
TMR4    EQU H'13'       ; 
TEMP1	EQU H'14'   
TEMP2	EQU H'15' 
TEMP3	EQU H'16' 
SAFE_C  EQU H'17'       ;COUNTERS FOR SECURE BEFORE FIRE
FLAG_REG  EQU H'18'	
FIRE_REG  EQU H'19'	
LOWEST_C  EQU H'1A'	
MODE_FLAG EQU 0		;FLAG IN FLAG_REG
;
;
;----  VARIABLES DEFINE ----
;
FIRE_PWM   EQU D'180'   ;PWM WIDE THAN THIS DEFINE AS TRIGGLER ON
SAFE_N	EQU D'3'	;MUST HAVE X CONTINUOUS "ON", BEFORE FIRE
FTIME	EQU D'15'      ;FTIME *100MS = TIME OF CURRENT SUPPLY
DTIME	EQU D'10'      ;DTIME *100MS = TIME DELAY BEFORE NEXT LAUNCH

;
;----  HARDWARE PINS DEFINE ----
;
INPIN   EQU 3           ;GPIO 3 = INPUT PIN 
SETPIN	EQU 0		;GPIO 0, OPEN = MODE 0, GROUNDING = MODE 1
OUT1	EQU 1		;OUTPUT 1 = GPIO 1
OUT2	EQU 2	
OUT3	EQU 4	
OUT4	EQU 5	
;
;----  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
	
	MOVLW B'00001001' ;GPIO 0&3=INPUT, OTHERS =OUTPUT		
	TRIS GPIO 
	MOVLW B'00000000' ;GPPU=0 TO ENBALE PULL-UP,
	OPTION 	 	
	
	CLRF 	GPIO	;SET ALL OUTPUT LOW 
	CLRF	FLAG_REG
	CLRF	FIRE_REG
	CLRF	SAFE_C
	CLRF	LOWEST_C
		        
	BTFSS	GPIO,SETPIN		;SET MODE
	BSF	FLAG_REG,MODE_FLAG	;MODE 1		


CHECK_LOWEST			;MUST OFF FOR 5 SECONDS BEFORE FIRST ON 
	CALL GET_PWM
	MOVLW D'125'
        SUBWF TMR3,W
        SKPNC            	;IF f > w, C=1
	GOTO CHECK_LOWEST	;NO LOWEST
	DECFSZ	LOWEST_C,F	
	GOTO CHECK_LOWEST     ;WAIT UNTIL 256 LOWEST PULSE GO BY 		

MAIN	
	CALL GET_PWM
	MOVLW FIRE_PWM
        SUBWF TMR3,W
        SKPC            	;IF f > w, C= 1,SKIP
	GOTO RESET_SAFE_C      	;ELSE IT'S NOISE, NO OUTPUT

CHECK_SAFE_C
	
	INCF	SAFE_C,F	
	MOVLW SAFE_N		;FOR SAFETY
        SUBWF SAFE_C,W 
        SKPC            	;IF f > w, C= 1,SKIP
	GOTO MAIN      		;ELSE IT'S NO ENOUGH

FIRE_STATUS
	
	BTFSC	FLAG_REG,MODE_FLAG
	GOTO	MODE_1
MODE_0
	BTFSS	FIRE_REG,0
	GOTO	MODE_002	;X0
	BTFSS	FIRE_REG,1	;X1
	GOTO	MODE_02		;01
MODE_04	BSF	GPIO,OUT4	;11--
	MOVLW	FTIME
	CALL	DELAY_100MS
	BCF	GPIO,OUT4
	BCF	FIRE_REG,1
	BCF	FIRE_REG,0
	GOTO	RESET_SAFE_C 

MODE_002
	BTFSS	FIRE_REG,1	;X0
	GOTO	MODE_01		;00
MODE_03	BSF	GPIO,OUT3	;10--
	MOVLW	FTIME
	CALL	DELAY_100MS
	BCF	GPIO,OUT3
	BSF	FIRE_REG,1
	BSF	FIRE_REG,0
	GOTO	RESET_SAFE_C 

MODE_01	BSF	GPIO,OUT1	;00--
	MOVLW	FTIME
	CALL	DELAY_100MS
	BCF	GPIO,OUT1
	BCF	FIRE_REG,1	
	BSF	FIRE_REG,0
	GOTO	RESET_SAFE_C

MODE_02	BSF	GPIO,OUT2	;01--
	MOVLW	FTIME
	CALL	DELAY_100MS
	BCF	GPIO,OUT2
	BSF	FIRE_REG,1
	BCF	FIRE_REG,0
	GOTO	RESET_SAFE_C 

;-------------------------------
MODE_1
	BTFSS	FIRE_REG,0
	GOTO	MODE_11		;0
	
MODE_12	BSF	GPIO,OUT3	;1--
	BSF	GPIO,OUT4
	MOVLW	FTIME
	CALL	DELAY_100MS
	BCF	GPIO,OUT3
	BCF	GPIO,OUT4
	BCF	FIRE_REG,0
	GOTO	RESET_SAFE_C 

MODE_11	BSF	GPIO,OUT1	;0--
	BSF	GPIO,OUT2
	MOVLW	FTIME
	CALL	DELAY_100MS
	BCF	GPIO,OUT1
	BCF	GPIO,OUT2
	BSF	FIRE_REG,0
	GOTO	RESET_SAFE_C 

	
RESET_SAFE_C 
	CLRF	SAFE_C
	MOVLW	DTIME		;SECONDS BEFORE NEXT FIRE
	CALL	DELAY_100MS
	GOTO 	MAIN

	
;=====================================



;-------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
;-----------------------------------------------



;-------------  DELAY_100MS  -----------------------
;INPUT PARAMETERS,-- W
;TEMP REGISTERS,-- TEMP1,TEMP2,TEMP3 
;OUTPUT PARAMETERS,--
;------------------------------------
DELAY_100MS		;FOR 4MHz CLOCK
LOOP_L			;100 mS LOOP
	MOVWF   TEMP1	
LOOP_L1 
	MOVLW	D'100'	;100 mS
	MOVWF   TEMP2
LOOP_L2	
	MOVLW	D'249'	;(249*4)+5=1001 
	MOVWF   TEMP3
LOOP_L3
        NOP
	DECFSZ  TEMP3,1
        GOTO    LOOP_L3
	DECFSZ  TEMP2,1
        GOTO    LOOP_L2
	DECFSZ  TEMP1,1
        GOTO	LOOP_L1
	RETLW 0
;---------------------------------------------------
        END


