;----------------  パルス幅表示プログラム--------------------

;Ver9.2.0	2002.08.	By T.HINOKI

		LIST		P=16C84,R=DEC
	PC	EQU	2
	STATUS	EQU	3
	PG	EQU	5
	PORTA	EQU	5
	PORTB	EQU	6
	EEDATA	EQU	8
	EEADR	EQU	9
	OPTION_REG	EQU	H'81'
	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'	;ＴＯＰスピードの時間（揺れに使用）
	COUNT9	EQU	H'24'	;デモ走行作業用
	COUNT8	EQU	H'25'	;機銃発光のタイミング
	CENTER1	EQU	H'26'	;走行用アンプのセンター位置(左)
	CENTER2	EQU	H'27'	;走行用アンプのセンター位置(右)
	WORK	EQU	H'28'	;

	ORG	0
	GOTO	START
;------------------------表示ＤＡＴＡ---------------------
	ORG	3
CNVSEG
	ADDWF	PC,1	;X.Y
	RETLW	B'00111111'	;$0	0
	RETLW	B'00000110'	;$1	1
	RETLW	B'01011011'	;$2	2
	RETLW	B'01001111'	;$3	3
	RETLW	B'01100110'	;$4	4
	RETLW	B'01101101'	;$5	5
	RETLW	B'01111101'	;$6	6
	RETLW	B'00100111'	;$7	7
	RETLW	B'01111111'	;$8	8
	RETLW	B'01101111'	;$9	9
	RETLW	B'01110111'	;$A	A
	RETLW	B'01111100'	;$b	b
	RETLW	B'00111001'	;$C	C
	RETLW	B'01011110'	;$d	d
	RETLW	B'01111001'	;$E	E
	RETLW	B'01110001'	;$F	F

START
	CLRF	PORTB		;クリア PORTB
;	CLRF	TRISB		;TRISB=0  All output
	BSF	STATUS,PG	;Change Page1
	MOVLW	B'10000000'	;RB0-6出力
	MOVWF	TRISB		;RB7は入力
	MOVLW	B'11000'	;RA0-2出力
	MOVWF	TRISA		;RA3-4は入力
	BCF	STATUS,PG	;Change Page0
;-------------------メインルーチン -------------
LOOP1

	BTFSS	PORTB,7		;OFF の時
	GOTO	LOOP2
	CALL	PULSIN3
	MOVF	PIN3,0
	MOVWF	PIN4
	GOTO	LOOP3
LOOP2

	CALL	PULSIN4

LOOP3


	MOVLW	40
	MOVWF	COUNT8		;
LOOP100
	MOVF	PIN4,0
	CALL	DISPH100
	DECFSZ	COUNT8,1	;
	GOTO	LOOP100		;


	GOTO	LOOP1

;=======================   表示ルーチン =====================
DISPH100
	MOVWF	KEISAN1		;KEISAN1=W
;------------------------- 100の桁　---------------------
	MOVLW	0		;
	MOVWF	KEISAN2		;カウンター初期化

DISPH101
	MOVF	KEISAN1,0	;W=KEISAN1
	SUBLW	99
	BTFSS	STATUS,0	;W>99 は DISPH102
	GOTO	DISPH102
	GOTO	DISPH105
DISPH102
	INCF	KEISAN2,1	;KEISAN2=KEISAN2+1
	MOVLW	100
	SUBWF	KEISAN1,1	;KEISAN1=KEISAN1-100
	GOTO	DISPH101
DISPH105
        MOVLW	B'00001'	;RA4のLEDをON
	MOVWF	PORTA		;

	MOVF	KEISAN2,0	;W=KEISAN2
	CALL	CNVSEG		;データ読み込み
	MOVWF	PORTB		;表示
	MOVLW	15
	CALL	TIM90
	CLRF	PORTB		;クリア PORTB
	MOVLW	2
	CALL	TIM90

;------------------------- 10の桁　---------------------
	MOVLW	0		;
	MOVWF	KEISAN2		;カウンター初期化

DISPH201
	MOVF	KEISAN1,0	;W=KEISAN1
	SUBLW	9
	BTFSS	STATUS,0	;W>9 は DISPH202
	GOTO	DISPH202
	GOTO	DISPH205
DISPH202
	INCF	KEISAN2,1	;KEISAN2=KEISAN2+1
	MOVLW	10
	SUBWF	KEISAN1,1	;KEISAN1=KEISAN1-10
	GOTO	DISPH201
DISPH205
        MOVLW	B'00010'	;RA1のLEDをON
	MOVWF	PORTA		;

	MOVF	KEISAN2,0	;W=KEISAN2
	CALL	CNVSEG		;データ読み込み
	MOVWF	PORTB		;表示

	MOVLW	15
	CALL	TIM90
	CLRF	PORTB		;クリア PORTB
	MOVLW	2
	CALL	TIM90

;------------------------- 1の桁　---------------------
        MOVLW	B'00100'	;RA2のLEDをON
	MOVWF	PORTA		;
	MOVF	KEISAN1,0	;W=KEISAN1
	CALL	CNVSEG		;データ読み込み
	MOVWF	PORTB		;表示

	MOVLW	15
	CALL	TIM90
	CLRF	PORTB		;クリア PORTB
	MOVLW	2
	CALL	TIM90
	RETURN




;***********　Ｗ÷５＝Ｗ
WARU5
	MOVWF	KEISAN1		;Ｗ=KEISAN1
	MOVLW	0		;
	MOVWF	KEISAN2		;カウンター初期化
	MOVF	KEISAN1,0	;W=KEISAN1
	SUBLW	4
	BTFSS	STATUS,0	;W>4
	GOTO	WARU51
	RETURN
WARU51
	MOVLW	5		;
	SUBWF	KEISAN1,1
	BTFSS	STATUS,0	;CY=0　で終了
	RETURN
	INCF	KEISAN2,1	;KEISAN2=KEISAN2+1
	GOTO	WARU51




;-------------  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


;-------------  時間稼ぎ
TIM90

;	MOVLW	20
	MOVWF	COUNT9		;
TIM92
	CALL	TIM25		;
	DECFSZ	COUNT9,1	;
	GOTO	TIM92		;
	RETURN			;

;-----------1CHパルス幅測定（PIN1）前進・後進のスティックの信号チェック-------
PULSIN1A
	BTFSS	PORTA,0		;OFF の時
	GOTO	PULSIN1		;入力開始
	CALL	TIM20
	GOTO	PULSIN1A	;次の信号まで待つ
;-----------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）前進・後進のスティックの信号チェック-------
PULSIN2A
	BTFSS	PORTA,1		;OFF の時
	GOTO	PULSIN2		;入力開始
	CALL	TIM20
	GOTO	PULSIN2A	;次の信号まで待つ

;-----------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）前進・後進のスティックの信号チェック-------
PULSIN3A
	BTFSS	PORTA,4		;OFF の時
	GOTO	PULSIN3		;入力開始
	CALL	TIM20
	GOTO	PULSIN3A	;次の信号まで待つ

;-----------3CHパルス幅測定（PIN3）砲身上下用-----------
PULSIN3
	BTFSS	PORTA,4		;OFF の時
	GOTO	PULSIN3		;入力待ちループ
	MOVLW	0		;
	MOVWF	PIN3		;カウンター初期化
PULSIN31
	CALL	TIM20		;20サイクル待ち
	INCF	PIN3,1		;PIN3=PIN3+1
	BTFSC	PORTA,4		;ＯＮの時は、
	GOTO	PULSIN31	;カウント継続

	MOVLW	70		;カウントが70以下だったら
	SUBWF	PIN3,0		;カウントしなおし！
	BTFSS	STATUS,0	;(CY=0) PIN3<70
	GOTO	PULSIN3		;
	RETURN
;-----------4CHパルス幅測定（PIN4）前進・後進のスティックの信号チェック-------
PULSIN4A
	BTFSS	PORTA,3		;OFF の時
	GOTO	PULSIN4		;入力開始
	CALL	TIM20
	GOTO	PULSIN4A	;次の信号まで待つ

;-----------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

