;	受信機のパルス幅を取得するプログラム
;	取得したパルス幅はそのままサーボに出力する
;Ver1.0.0	2000.06.27	By T.HINOKI

		LIST		P=16C84,R=DEC
	STATUS	EQU	3
	PG	EQU	5
	PORTA	EQU	5
	PORTB	EQU	6
	TRISA	EQU	H'85'
	TRISB	EQU	H'86'
	COUNT1	EQU	H'10'
	PIN1	EQU	H'12'	;入力パルス幅
	POUT1	EQU	H'14'	;出力パルス幅


	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
LOOP1

	CALL	PULSIN1		;パルス幅取得

	MOVF	PIN1,0
	MOVWF	POUT1


	BSF	PORTB,0		;PULS on
	MOVF	POUT1,0
	CALL	TIM25
	BCF	PORTB,0		;PULS off

	CALL	PULSOFF

	GOTO	LOOP1


;-------------  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	255
	CALL	TIM25		;
	MOVLW	255
	CALL	TIM25		;
	RETURN

;-----------パルス幅測定（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

	END
