        LIST    P=PIC12F675, R=HEX
;
;       DSC AUTO SHOOT CONTROLLER FOR R/C MODEL
;       SUN, PU-NENG
;       AUGUST/14/2004
;
; 	       
;       VERSION 1.0
;       USE A SPARE CHANNEL ON R/C RECEIVER,
;       TO CONTROL DSC
;       FOR PULSE WIDTH 0.7~2.3mS, FRAME TIME 16~23mS
;	
;
;	CONFIG: IntOSC GP4, OTHERS DON'T CHECK
;       
;       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
WPU     EQU 0x95	
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 DEFINE  ------
;
CNA    EQU H'27'       
CNB    EQU H'28'       
CNC    EQU H'29'       
CND    EQU H'2A'       
DCNT    EQU H'2B'       
HCNT    EQU H'2C'       
NCNT    EQU H'2D'       
DTIME   EQU H'2E'       
;
;       DEFINE BIT
;
W       EQU 0           ;d VALUE FOR INCF......
F       EQU 1           ;d VALUE
INPIN   EQU 3           ;GPIO 3 IS INPUT ONLY PIN
SHOOT   EQU 2           ;DSC AUTO SHOOT OUT      
SEL1    EQU 1           ;                        
SEL0    EQU 0           ;                        
RSH     EQU 4           ;REVERSE OF SHOOT        
ONFLAG  EQU 5           ;ON                      
;
;      DEFINE VARIABLES
;
NOISE   EQU H'15'       ;35*20uS= 0.7 mS, PULSE < 0.6 DEFINE AS NOISE
ACTION  EQU H'30'       ;80 *20uS= 1.6 mS, PULSE > 1.6 DEFINE AS VALID
PASS_NO	EQU H'03'	
DT2	EQU H'20'	;CALIBRATION OF CNTB

;=====================================
;
        ORG     0
	BSF STATUS,RP0	;;BANK1
	CALL 3FFh
	MOVWF OSCCAL	
;
;-------SETUP 
START   MOVLW H'0B'         ;PA3=INPUT, OTHERS =OUTPUT		
	MOVWF TRISIO 
	MOVLW H'0'	;T0CS=0, TO ENABLE GP2 ,**C0
	MOVWF OPTION_reg 	
	MOVLW 	H'03'	;		**
	MOVWF 	WPU	;PULL-UP GPIO 0,1	**
	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 ***BSF 	STATUS,RP0	;;BANK1
;---------------------------------------
  	BTFSS 	GPIO,SEL0
        GOTO 	ST1
	BTFSS 	GPIO,SEL1
        GOTO 	ST2
	MOVLW 	H'FF'	;DEFAULT 5/2 SECOND
	MOVWF 	DTIME 	;SEL0 = OPEN SEL1 = OPEN  
	GOTO 	ST4
ST1	BTFSS 	GPIO,SEL1
        GOTO 	ST3
	MOVLW 	H'CC'	;4/2 SECOND
	MOVWF 	DTIME	;SEL0 = CLOSE SEL1 = OPEN  
	GOTO 	ST4
ST2	MOVLW 	H'99'	;3/2 SECOND
	MOVWF 	DTIME	;SEL0 = OPEN SEL1 = CLOSE  
	GOTO 	ST4
ST3	MOVLW 	H'66' 	;2/2 SECOND
	MOVWF 	DTIME	;SEL0 =CLOSE SEL1 = CLOSE  
ST4	BCF 	GPIO,ONFLAG
	BSF 	GPIO,SHOOT
	BCF 	GPIO,RSH
        MOVF 	DTIME,W
	MOVWF 	CNB
;---------------------
MAIN    CLRF NCNT
MAIN1   NOP
        BTFSC GPIO,INPIN
        GOTO MAIN2
        CALL SUB1
	GOTO MAIN1
MAIN2   INCF NCNT,F
        BTFSS GPIO,INPIN
        GOTO MAIN3
        CALL SUB1
	GOTO MAIN2
MAIN3   MOVLW NOISE
        SUBWF NCNT,W
        SKPC            ;IF f > w, C= 1,SKIP
        GOTO MAIN       ;ELSE IT'S NOISE
MAIN4   MOVLW ACTION
        SUBWF NCNT,W
        SKPC            ;IF f > w, C=1, SKIP TO HIGH
        GOTO LOW1       ;ELSE IT'S LOW 
HIGH1   INCF HCNT,F
	GOTO MAIN       
LOW1    MOVF HCNT,F 
	SKPNZ             
 	GOTO MAIN         
 	DECF HCNT,F       
 	GOTO MAIN         
	

  
;========================================== 
	
SUB1    DECFSZ CNA,F
        GOTO RE1
SUB2    DECFSZ CNB,F
        GOTO RE2
SUB3 	MOVF  DTIME,W
	MOVWF CNB
	MOVLW PASS_NO
        SUBWF HCNT,W
        SKPC            ;IF f > w, C= 1,SKIP
	GOTO TDOWN
	CLRF HCNT
RR1	BSF 	GPIO,ONFLAG
	BTFSS 	GPIO,SHOOT
	GOTO 	RR3
RR2	BCF 	GPIO,SHOOT
	BSF 	GPIO,RSH
	GOTO 	RE5
RR3	BSF 	GPIO,SHOOT
	BCF 	GPIO,RSH
	GOTO 	RE5
TDOWN	BCF 	GPIO,ONFLAG
	BCF 	GPIO,SHOOT
	BSF 	GPIO,RSH
	GOTO 	RE6
RE1	NOP
RE2	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
RE3	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
RE5 	NOP
	NOP
	NOP
RE6	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	RETLW 0
;---------------------------
	END