;----------------  Tiger1用 Ver.3 --------------------

;２サーボ（アンプ）コントロールプログラム
;サーボバラシアンプ使用時の補正付き
;３ｃｈ砲身上下サーボコントロール付き
;砲身上下スピード調整機能付き
;砲塔旋回用4ｃｈ出力付き
;砲塔旋回サーボ停止位置初期設定機能付き（EEPROMに保存）
;コンバットサウンドスイッチ付き
;ブローバックサーボコントロール付き
;大砲音＋車体の揺れ
;砲塔旋回スピードを固定（Ver.3）

;Ver3.0.0	2000.09.05	By T.HINOKI

		LIST		P=16C84,R=DEC
	STATUS	EQU	3
	PG	EQU	5
	PORTA	EQU	5
	PORTB	EQU	6
	EEDATA	EQU	8
	EEADR	EQU	9
	TRISA	EQU	H'85'
	TRISB	EQU	H'86'
	EECON1	EQU	H'88'
	EECON2	EQU	H'89'
	RD	EQU	0
	WR	EQU	1
	WREN	EQU	2
	COUNT1	EQU	H'10'
	COUNT2	EQU	H'11'
	PIN1	EQU	H'12'	;1ｃｈ入力パルス幅（左・右）
	PIN2	EQU	H'13'	;２ｃｈ入力パルス幅（前進・後進）
	PIN3	EQU	H'14'	;３ｃｈ入力パルス幅（砲身上下用）
	PIN4	EQU	H'15'	;４ｃｈ入力パルス幅（砲塔旋回用）

	POUT1	EQU	H'16'	;1ｃｈ出力パルス幅（左キャタ速度）
	POUT2	EQU	H'17'	;２ｃｈ出力パルス幅（右キャタ速度）
	POUT3	EQU	H'18'	;３ｃｈ出力パルス幅（砲身上下用）
	POUT4	EQU	H'19'	;４ｃｈ出力パルス幅（砲塔旋回用）
	POUT5	EQU	H'20'	;５ｃｈ出力パルス幅（ブローバックサーボ用）

	KEISAN1	EQU	H'1A'	;計算用変数
	KEISAN2	EQU	H'1B'	;計算用変数
	KEISAN3	EQU	H'1C'	;計算用変数
	HSPEED	EQU	H'1D'	;砲身の上下スピード
	COUNT3	EQU	H'1E'	;砲身の上下スピード作業用
	CENTER3	EQU	H'1F'	;砲塔旋回サーボ停止位置
	COUNT4	EQU	H'21'	;ブローバックサーボの動作カウント用
	COUNT10	EQU	H'22'	;長時間のウエイト用
	COUNT11	EQU	H'23'	;ＴＯＰスピードの時間（揺れに使用）



	CLRF	PORTB		;クリア PORTB
	BSF	STATUS,PG	;Change Page1
	MOVLW	B'1111'		;TRISA=F  All Input
	MOVWF	TRISA
	CLRF	TRISB		;TRISB=0  All output
	BCF	STATUS,PG	;Change Page0


;------------------ ＥＥＰＲＯＭ読込
	MOVLW	0		;EPPROMの0番地（先頭）のＤＡＴＡを読む
	MOVWF	EEADR		;
	BSF	STATUS,PG	;Change Page1
	BSF	EECON1,RD	;読出し開始
	BCF	STATUS,PG	;Change Page0
	MOVF	EEDATA,0
	MOVWF	CENTER3		;CENTER3=W	センターの位置を記憶
;-------ＲＯＭ値のチェック
	MOVLW	190		;
	SUBWF	CENTER3,0	;
	BTFSC	STATUS,0	;(CY=1) CENTER3>=190はLOOP00へ
	GOTO	LOOP00		;
	MOVLW	110		;
	SUBWF	CENTER3,0	;
	BTFSS	STATUS,0	;(CY=0) CENTER3<110はLOOP00へ
	GOTO	LOOP00		;
	GOTO	LOOP000
LOOP00
	MOVLW	150		;砲塔旋回値を１５０（停止）に設定
	MOVWF	CENTER3

LOOP000


;-----------------  砲塔旋回サーボの停止位置設定（電源投入時、前進後進スティックが１番下の時に設定登録）

	CALL	PULSOFF		;電源入れていきなり受け取るとノイズがあるかも...ちょっと待とう
	CALL	PULSIN2		;2chパルス幅取得

	MOVLW	190		;前後スティックが190以上だったら設定開始
	SUBWF	PIN2,0		;
	BTFSS	STATUS,0	;(CY=0) PIN2<190はLOOP01へ
	GOTO	LOOP01		;

LOOP0
	CALL	PULSIN4		;4chパルス幅取得
	CALL	PULSIN2		;2chパルス幅取得

	MOVF	PIN4,0		;-------  プロポの左右スティック値を
	MOVWF	POUT4		;-------  そのまま砲塔旋回サーボへ出力
	BSF	PORTB,3		;PULS3 on
	MOVF	POUT4,0		;
	CALL	TIM25		;
	BCF	PORTB,3		;PULS off

	CALL	PULSOFF
	CALL	PULSOFF

	MOVLW	110		;前後スティックが110以下だったら設定終了
	SUBWF	PIN2,0		;
	BTFSC	STATUS,0	;(CY=1) PIN2>=110はLOOP0へ
	GOTO	LOOP0		;

	MOVF	PIN4,0		;W=PIN4
	MOVWF	CENTER3		;CENTER3=W	センターの位置を記憶

;-------- ＥＥＰＲＯＭ書き込み
	MOVWF	EEDATA
	MOVLW	0		;
	MOVWF	EEADR		;
	BSF	STATUS,PG	;Change Page1
	BSF	EECON1,WREN	;EECON1のWREN=1(書込許可)
	MOVLW	H'55'
	MOVWF	EECON2		;書込開始
	MOVLW	H'AA'
	MOVWF	EECON2
	BSF	EECON1,WR	;
WR_LP
	BTFSC	EECON1,WR	;書込終了チェック
	GOTO	WR_LP
	BCF	STATUS,PG	;Change Page0


;---------砲身のデフォルト位置＆上下スピード
LOOP01
	MOVLW	150		;スイッチを入れたときの砲身のデフォルト角度設定
	MOVWF	POUT3		;

	MOVLW	2		;砲身上下のスピード0-5
	MOVWF	HSPEED		;
	MOVWF	COUNT3		;

;-----------ブローバック用サーボ停止位置 ------------
	MOVLW	200		;
	MOVWF	POUT5
	MOVLW	255		;
	MOVWF	COUNT4

;-------------------メインルーチン -------------
LOOP1

	CALL	PULSIN1		;1chパルス幅取得
	CALL	PULSIN2		;2chパルス幅取得
	CALL	PULSIN3		;3chパルス幅取得
	CALL	PULSIN4		;4chパルス幅取得

	MOVF	PIN2,0
	MOVWF	POUT1
	MOVWF	POUT2

;	MOVF	PIN4,0		;砲塔旋回サーボ直結の時使用
;	MOVWF	POUT4

	MOVF	CENTER3,0	;W=CENTER3
	MOVWF	POUT4		;POUT4=W	砲塔旋回サーボを停止


;--------停止中
	MOVLW	154		;前後スティックが154以下だったら
	SUBWF	PIN2,0		;
	BTFSC	STATUS,0	;(CY=1) PIN2>=154はNEXT51へ
	GOTO	NEXT51		;
	MOVLW	147		;前後スティックが147以上だったら停止
	SUBWF	PIN2,0		;
	BTFSS	STATUS,0	;(CY=0) PIN2<147はNEXT51へ
	GOTO	NEXT51		;
	MOVLW	150		;左右中間(停止)に
	MOVWF	POUT1
	MOVWF	POUT2

;-----------------　音　---------------
	MOVLW	115		;1chスティックが115以下だったら
	SUBWF	PIN1,0		;
	BTFSC	STATUS,0	;(CY=1) PIN1>=115はOTO10へ
	GOTO	OTO10		;

	BSF	PORTB,7		;PULS7 on(機関銃音)
	BSF	PORTB,5		;LED on
	GOTO	OTO80		;

OTO10
	MOVLW	185		;1chスティックが185以上だったら
	SUBWF	PIN1,0		;
	BTFSS	STATUS,0	;(CY=0) PIN1<185はOTO20へ
	GOTO	OTO20		;

	MOVLW	255		;COUNT4<>255だったら
	SUBWF	COUNT4,0	;
	BTFSS	STATUS,2	;(Z=0) COUNT4<>255
	GOTO	OTO80

	BSF	PORTB,6		;PULS6 on（音切り換え）
	CALL	TIM20		;ちょっと待つ
	BSF	PORTB,7		;PULS7 on（大砲音）

;-----------  砲身後退　-----------
	MOVLW	90		;砲身後退サーボの値を９０にして
	MOVWF	POUT5		;砲身を一挙に後退
	MOVLW	90		;後退した後の一瞬の停止時間の設定
	MOVWF	COUNT4		;80～100（100で停止無し）

;----------- 車体の揺れ？？ --------

	MOVLW	5		;バックの時間
	CALL	BACKSP
	CALL	PULSOFF
	CALL	PULSOFF
	MOVLW	7		;前進の時間
	CALL	TOPSP

	CALL	PULSOFF

	BSF	PORTB,0		;PULS1 on
	MOVLW	150		;停止位置にに戻す
	CALL	TIM25
	BCF	PORTB,0		;PULS off

	BSF	PORTB,1		;PULS2 on
	MOVLW	150		;停止位置にに戻す
	CALL	TIM25
	BCF	PORTB,1		;PULS off

	GOTO	OTO80		;

OTO20
	BCF	PORTB,6		;PULS off
	BCF	PORTB,7		;PULS off

OTO80

	GOTO	PULSOUT
NEXT51

;--------超信地旋回左
	MOVLW	106		;左右スティックが107以下だったら
	SUBWF	PIN1,0		;
	BTFSC	STATUS,0	;(CY=1) PIN1>=106はNEXT2へ
	GOTO	NEXT2		;
	MOVLW	210		;
	MOVWF	POUT1		;逆転速度＝210-（速度－90）
	MOVLW	90		;
	SUBWF	PIN2,0		;(W=PIN2-90)
	SUBWF	POUT1,1		;(POUT1＝210-W)
	GOTO	PULSOUT
NEXT2
;--------超信地旋回右
	MOVLW	194		;左右スティックが194以上だったら
	SUBWF	PIN1,0		;
	BTFSS	STATUS,0	;(CY=0) PIN1<194はNEXT3へ
	GOTO	NEXT3		;
	MOVLW	210		;
	MOVWF	POUT2		;逆転速度＝210-（速度－90）
	MOVLW	90		;
	SUBWF	PIN2,0		;(W=PIN2-90)
	SUBWF	POUT2,1		;(POUT2＝210-W)
	GOTO	PULSOUT
NEXT3
;--------信地旋回左
	MOVLW	114		;左右スティックが115以下だったら
	SUBWF	PIN1,0		;
	BTFSC	STATUS,0	;(CY=1) PIN1>=114はNEXT4へ
	GOTO	NEXT4		;
	MOVLW	150		;
	MOVWF	POUT1		;速度＝150(片側停止)
	GOTO	PULSOUT
NEXT4
;--------信地旋回右
	MOVLW	185		;左右スティックが185以上だったら
	SUBWF	PIN1,0		;
	BTFSS	STATUS,0	;(CY=0) PIN1<185はNEXT5へ
	GOTO	NEXT5		;
	MOVLW	150		;
	MOVWF	POUT2		;速度＝150(片側停止)
	GOTO	PULSOUT
NEXT5

;--------左旋回
	MOVLW	148		;左右スティックが147以下だったら
	SUBWF	PIN1,0		;
	BTFSC	STATUS,0	;(CY=1) PIN1>=148はNEXT7へ
	GOTO	NEXT7		;
;--------前進
	MOVLW	150		;前後スティックが150以下だったら
	SUBWF	PIN2,0		;
	BTFSC	STATUS,0	;(CY=1) PIN2>=150はNEXT62へ
	GOTO	NEXT62		;

	MOVF	POUT1,0
	SUBLW	150		;150-速度
	CALL	WARU6		;(150-速度)÷6
	DECF	KEISAN2,0	;W=KEISAN2-1
	MOVWF	KEISAN3		;KEISAN3=W
	MOVF	PIN1,0
	SUBLW	150		;150-角度
	CALL	WARU5		;(150-角度)÷5

	INCF	KEISAN2,1	;KEISAN2=KEISAN2+1(補正)

NEXT61
	MOVF	KEISAN3,0	;W=KEISAN3
	ADDWF	POUT1,1		;POUT1=POUT1+W
	DECFSZ	KEISAN2,1	;KEISAN2=KEISAN2-1
	GOTO	NEXT61		;KEISAN2が0になるまで繰り返し
;--------------------------微速補正
	MOVLW	150		;
	SUBWF	POUT1,0		;
	BTFSS	STATUS,0	;(CY=0) POUT1<150はNEXT611へ
	GOTO	NEXT611		;
	MOVLW	148
	MOVWF	POUT1		;POUT1=148

NEXT611

	GOTO	PULSOUT

NEXT62
;--------後進
	MOVLW	150		;W=150
	SUBWF	POUT1,0		;速度-150
	CALL	WARU6		;(速度-150)÷6
	DECF	KEISAN2,0	;W=KEISAN2-1
	MOVWF	KEISAN3		;KEISAN3=W
	MOVF	PIN1,0
	SUBLW	150		;150-角度
	CALL	WARU5		;(150-角度)÷5

	INCF	KEISAN2,1	;KEISAN2=KEISAN2+1(補正)

NEXT63
	MOVF	KEISAN3,0	;W=KEISAN3
	SUBWF	POUT1,1		;POUT1=POUT1-W
	DECFSZ	KEISAN2,1	;KEISAN2=KEISAN2-1
	GOTO	NEXT63		;KEISAN2が0になるまで繰り返し

;--------------------------微速補正
	MOVLW	151
	SUBWF	POUT1,0		;
	BTFSC	STATUS,0	;(CY=1) POUT1>=151はNEXT631へ
	GOTO	NEXT631		;
	MOVLW	153
	MOVWF	POUT1		;POUT1=153

NEXT631

	GOTO	PULSOUT

NEXT7

;--------右旋回
	MOVLW	153		;左右スティックが153以上だったら
	SUBWF	PIN1,0		;
	BTFSS	STATUS,0	;(CY=0) PIN1<153はNEXT8へ
	GOTO	NEXT8		;

;--------前進
	MOVLW	150		;前後スティックが150以下だったら
	SUBWF	PIN2,0		;
	BTFSC	STATUS,0	;(CY=1) PIN2>=150はNEXT72へ
	GOTO	NEXT72		;

	MOVF	POUT2,0
	SUBLW	150		;150-速度
	CALL	WARU6		;(150-速度)÷6
	DECF	KEISAN2,0	;W=KEISAN2-1
	MOVWF	KEISAN3		;KEISAN3=W


	MOVLW	150
	SUBWF	PIN1,0		;角度-150
	CALL	WARU5		;(角度-150)÷5

	INCF	KEISAN2,1	;KEISAN2=KEISAN2+1(補正)

NEXT71
	MOVF	KEISAN3,0	;W=KEISAN3
	ADDWF	POUT2,1		;POUT2=POUT2+W
	DECFSZ	KEISAN2,1	;KEISAN2=KEISAN2-1
	GOTO	NEXT71		;KEISAN2が0になるまで繰り返し

;--------------------------微速補正
	MOVLW	150
	SUBWF	POUT2,0		;
	BTFSS	STATUS,0	;(CY=0) POUT1<150はNEXT711へ
	GOTO	NEXT711		;
	MOVLW	148
	MOVWF	POUT2		;POUT1=148

NEXT711

	GOTO	PULSOUT

NEXT72
;--------後進
	MOVLW	150		;W=150
	SUBWF	POUT1,0		;速度-150
	CALL	WARU6		;(速度-150)÷6
	DECF	KEISAN2,0	;W=KEISAN2-1
	MOVWF	KEISAN3		;KEISAN3=W
	MOVF	PIN1,0

	MOVLW	150		;W=150
	SUBWF	PIN1,0		;角度-150
	CALL	WARU5		;(角度-150)÷5

	INCF	KEISAN2,1	;KEISAN2=KEISAN2+1(補正)

NEXT73
	MOVF	KEISAN3,0	;W=KEISAN3
	SUBWF	POUT2,1		;POUT2=POUT2-W
	DECFSZ	KEISAN2,1	;KEISAN2=KEISAN2-1
	GOTO	NEXT73		;KEISAN2が0になるまで繰り返し

;--------------------------微速補正
	MOVLW	151
	SUBWF	POUT2,0		;
	BTFSC	STATUS,0	;(CY=1) POUT2>=151はNEXT731へ
	GOTO	NEXT731		;
	MOVLW	153
	MOVWF	POUT2		;POUT2=153

NEXT731

	GOTO	PULSOUT

NEXT8


PULSOUT
	BSF	PORTB,0		;PULS1 on
	MOVF	POUT1,0
	CALL	TIM25
	BCF	PORTB,0		;PULS off

	CALL	PULSOFF

	BSF	PORTB,1		;PULS2 on
	MOVF	POUT2,0
	CALL	TIM25
	BCF	PORTB,1		;PULS off

	CALL	PULSOFF


;--------- 砲塔旋回

	MOVLW	110		;左右旋回スティックが110以下だったら
	SUBWF	PIN4,0		;
	BTFSC	STATUS,0	;(CY=1) PIN4>=110はNEXT5201へ
	GOTO	NEXT52		;


	MOVLW	8		;
	SUBWF	CENTER3,0	;POUT4=CENTER3-8
	MOVWF	POUT4		;
	GOTO	NEXT53		;

NEXT52

	MOVLW	190		;左右旋回スティックが190以上だったら
	SUBWF	PIN4,0		;
	BTFSS	STATUS,0	;(CY=0) PIN4<180はNEXT5301へ
	GOTO	NEXT53

	MOVLW	8		;
	ADDWF	CENTER3,0	;POUT4=CENTER3+8
	MOVWF	POUT4		;
NEXT53

	BSF	PORTB,3		;PULS4 on
	MOVF	POUT4,0
	CALL	TIM25
	BCF	PORTB,3		;PULS off

;------------　　砲身を戻す処理
	MOVLW	250		;250以上だったら
	SUBWF	COUNT4,0	;
	BTFSS	STATUS,0	;(CY=0) COUNT4<250は
	GOTO	PULSOUT31
	MOVLW	255		;
	MOVWF	COUNT4		;COUNT4=255
	GOTO	PULSOUT32
PULSOUT31
	MOVLW	5		;砲身を戻すスピード（1-10）
	ADDWF	COUNT4,1	;COUNT4=COUNT4+5
PULSOUT32
	MOVLW	200		;200以上だったら
	SUBWF	COUNT4,0	;
	BTFSS	STATUS,0	;(CY=0) COUNT4<200は
	GOTO	PULSOUT30	;
	MOVLW	200		;
	MOVWF	POUT5		;POUT5=200
	GOTO	PULSOUT40	;

PULSOUT30
	MOVLW	100		;100以上だったら
	SUBWF	COUNT4,0	;
	BTFSS	STATUS,0	;(CY=0) COUNT4<100は
	GOTO	PULSOUT40	;

	MOVF	COUNT4,0	;W=COUNT4
	MOVWF	POUT5		;POUT5=W

PULSOUT40
	BSF	PORTB,4		;PULS5 on
	MOVF	POUT5,0
	CALL	TIM25
	BCF	PORTB,4		;PULS off

	CALL	PULSOFF

;------------砲身上下サーボ
	DECFSZ	COUNT3,1		;COUNT3=COUNT3-1
	GOTO	PULSOUT10		;COUNT3>0はサーボはそのまま

	MOVF	HSPEED,0	;COUNT3＝HSPEED(砲身上下のスピード)
	MOVWF	COUNT3		;


	MOVLW	180		;砲身上下スティックが180以上だったら
	SUBWF	PIN3,0		;
	BTFSS	STATUS,0	;(CY=0) PIN3<180はPULSOUT3へ
	GOTO	PULSOUT3	;


	INCF	POUT3,1		;POUT3=POUT3+1

	MOVLW	170		;砲身上下サーボがすでに200以上だったら
	SUBWF	POUT3,0		;
	BTFSS	STATUS,0	;(CY=0) POUT3<200はPULSOUT10へ
	GOTO	PULSOUT10	;

	MOVLW	170		;砲身上下サーボを200に固定
	MOVWF	POUT3		;POUT3=200
	GOTO	PULSOUT10

PULSOUT3
	MOVLW	120		;砲身上下スティックが120以下だったら
	SUBWF	PIN3,0		;
	BTFSC	STATUS,0	;(CY=1) PIN3>=120はPULSOUT10へ
	GOTO	PULSOUT10	;

	DECF	POUT3,1		;POUT3=POUT3-1

	MOVLW	100		;砲身上下サーボがすでに100以下だったら
	SUBWF	POUT3,0		;
	BTFSC	STATUS,0	;(CY=1) POUT3>=100はPULSOUT10へ
	GOTO	PULSOUT10	;

	MOVLW	100		;砲身上下サーボを100に固定
	MOVWF	POUT3		;POUT3=100

PULSOUT10

	BSF	PORTB,2		;PULS3 on
	MOVF	POUT3,0
	CALL	TIM25
	BCF	PORTB,2		;PULS3 off

	CALL	PULSOFF

	BCF	PORTB,5		;LED off

	GOTO	LOOP1

;***********　Ｗ÷５＝Ｗ
WARU5
	MOVWF	KEISAN1		;ＷをKEISAN1に代入
	MOVLW	0		;
	MOVWF	KEISAN2		;カウンター初期化
WARU51
	MOVLW	5		;
	SUBWF	KEISAN1,1
	BTFSS	STATUS,0	;CY=0　で終了
	RETURN
	INCF	KEISAN2,1	;KEISAN2=KEISAN2+1
	GOTO	WARU51

;***********　Ｗ÷６＝Ｗ
WARU6
	MOVWF	KEISAN1		;ＷをKEISAN1に代入
	MOVLW	0		;
	MOVWF	KEISAN2		;カウンター初期化
WARU61
	MOVLW	6		;
	SUBWF	KEISAN1,1
	BTFSS	STATUS,0	;CY=0　で終了
	RETURN
	INCF	KEISAN2,1	;KEISAN2=KEISAN2+1
	GOTO	WARU61


;-------------  20サイクルタイマー（実際は19サイクル）
TIM20
	GOTO	$+1	;2
	GOTO	$+1	;+2=4
	GOTO	$+1	;+2=6
	GOTO	$+1	;+2=8
	GOTO	$+1	;+2=10
	GOTO	$+1	;+2=12
	GOTO	$+1	;+2=14
	GOTO	$+1	;+2=16
	NOP		;+1=17
	RETURN		;+2=19

;-------------  Ｗレジスタ分のカウントタイマー(1カウント=25サイクル)×Ｗ
TIM25
	MOVWF	COUNT1		;1+1=2
TIM26
	CALL	TIM20		;19+2=21
	NOP			;+1=22
	DECFSZ	COUNT1,1	;+1=23
	GOTO	TIM26		;+2=25
	RETURN			;+1+(W*25)+2-1

;-----------パルスとパルスの間の空き時間-----------------
PULSOFF
	MOVLW	150
	CALL	TIM25		;
;	MOVLW	255
;	CALL	TIM25		;
	RETURN

;-------------  時間稼ぎ
TIM90
	MOVWF	COUNT10		;
TIM91
	MOVLW	255
	CALL	TIM25		;
	NOP			;
	DECFSZ	COUNT10,1	;
	GOTO	TIM91		;
	RETURN			;

;-------------  揺れ（一瞬ＴＯＰに）
TOPSP
	MOVWF	COUNT11		;
TOPSP1
	BSF	PORTB,0		;PULS1 on
	MOVLW	200		;
	CALL	TIM25
	BCF	PORTB,0		;PULS off

	BSF	PORTB,1		;PULS2 on
	MOVLW	200		;
	CALL	TIM25
	BCF	PORTB,1		;PULS off

	CALL	PULSOFF
	CALL	PULSOFF
	DECFSZ	COUNT11,1	;COUNT11が0になるまで繰り返す
	GOTO	TOPSP1		;
	RETURN			;

;-------------  揺れ（一瞬バックに）
BACKSP
	MOVWF	COUNT11		;
BACKSP1
	BSF	PORTB,0		;PULS1 on
	MOVLW	100		;
	CALL	TIM25
	BCF	PORTB,0		;PULS off

	BSF	PORTB,1		;PULS2 on
	MOVLW	100		;
	CALL	TIM25
	BCF	PORTB,1		;PULS off

	CALL	PULSOFF
	CALL	PULSOFF
	DECFSZ	COUNT11,1	;COUNT11が0になるまで繰り返す
	GOTO	BACKSP1		;
	RETURN			;


;-----------1CHパルス幅測定（PIN1）左右のステック-----------
PULSIN1
	BTFSS	PORTA,0		;OFF の時
	GOTO	PULSIN1		;入力待ちループ
	MOVLW	0		;
	MOVWF	PIN1		;カウンター初期化
PULSIN11
	CALL	TIM20		;20サイクル待ち	(19+2)
	INCF	PIN1,1		;PIN1=PIN1+1	(22)
	BTFSC	PORTA,0		;ＯＮの時は	(23)
	GOTO	PULSIN11	;カウント継続	(25)

	MOVLW	90		;カウントが90以下だったら
	SUBWF	PIN1,0		;カウントしなおし！
	BTFSS	STATUS,0	;(CY=0) PIN1<90
	GOTO	PULSIN1		;
	RETURN

;-----------2CHパルス幅測定（PIN2）前進・後進のスティック-----------
PULSIN2
	BTFSS	PORTA,1		;OFF の時
	GOTO	PULSIN2		;入力待ちループ
	MOVLW	0		;
	MOVWF	PIN2		;カウンター初期化
PULSIN21
	CALL	TIM20		;20サイクル待ち
	INCF	PIN2,1		;PIN1=PIN1+1
	BTFSC	PORTA,1		;ＯＮの時は、
	GOTO	PULSIN21	;カウント継続

	MOVLW	90		;カウントが90以下だったら
	SUBWF	PIN2,0		;カウントしなおし！
	BTFSS	STATUS,0	;(CY=0) PIN2<90
	GOTO	PULSIN2		;
	RETURN

;-----------3CHパルス幅測定（PIN3）砲身上下用-----------
PULSIN3
	BTFSS	PORTA,2		;OFF の時
	GOTO	PULSIN3		;入力待ちループ
	MOVLW	0		;
	MOVWF	PIN3		;カウンター初期化
PULSIN31
	CALL	TIM20		;20サイクル待ち
	INCF	PIN3,1		;PIN3=PIN3+1
	BTFSC	PORTA,2		;ＯＮの時は、
	GOTO	PULSIN31	;カウント継続

	MOVLW	70		;カウントが70以下だったら
	SUBWF	PIN3,0		;カウントしなおし！
	BTFSS	STATUS,0	;(CY=0) PIN3<70
	GOTO	PULSIN3		;
	RETURN

;-----------4CHパルス幅測定（PIN4）砲身上下用-----------
PULSIN4
	BTFSS	PORTA,3		;OFF の時
	GOTO	PULSIN4		;入力待ちループ
	MOVLW	0		;
	MOVWF	PIN4		;カウンター初期化
PULSIN41
	CALL	TIM20		;20サイクル待ち
	INCF	PIN4,1		;PIN4=PIN4+1
	BTFSC	PORTA,3		;ＯＮの時は、
	GOTO	PULSIN41	;カウント継続

	MOVLW	70		;カウントが70以下だったら
	SUBWF	PIN4,0		;カウントしなおし！
	BTFSS	STATUS,0	;(CY=0) PIN4<70
	GOTO	PULSIN4		;
	RETURN


	END
