;*****************************************************************************
;	ラジコンの受信機の信号を4bitバイナリデータに変換するプログラム
;
;	注意点：・書き込みのときヒューズの設定を忘れないこと
;	　　　　・ただ数字を書くとアセンブラに16進数と解釈される。
;                                                       1998.02.05
;*****************************************************************************

	include		<p16c84.inc>
;
PERIOD		EQU	5
;
;メモリーの割付(汎用フラグレジスタ)
;
;
DELAY0		EQU	15
Chcounter	EQU	16
Dcount0		EQU	17	;Loop Conter
Dcount1		EQU	18	;Temp Data Storage
Work		equ	19
;
;定数のシンボル
Bit0		EQU	0
Bit1		EQU	1
Bit2		EQU	2
Bit3		EQU	3
Bit4		EQU	4
Bit5		EQU	5
Bit6		EQU	6
Bit7		EQU	7
;
	ORG		H'0000'
;
START
	BSF	STATUS,RP0
	MOVLW	B'11100000'		;A Port を出力にセット
	MOVWF	TRISA
	BCF	STATUS,RP0		;B Portは入力で使うので
					;初期化しない(パワーオンのデフォルト)

	MOVLW	0		;
	MOVWF	PORTA		;APort初期化(停止のIDをセレクト)
;	********************************************************
;	********************************************************
Loop1
	MOVLW	0		;カウンターデータのレジスタクリア
	MOVWF	Dcount1

	call	Read_signal2
	call	Test_signal	;Dcount0に何回ディレイループに
				;行ったかセットしてシグナルテスト
	rlf	Dcount1,F
	rlf	Dcount1,F

	call	Read_signal3
	call	Test_signal

	call	Conv_dat

	goto	Loop1
;*****************************************************************************
;	Dcount1のビットパターンから動作パターンIDに解釈する。
;*****************************************************************************
Conv_dat
	btfss	Dcount1,Bit0
	goto	Backward
	btfsc	Dcount1,Bit2
	goto	F_left
	btfsc	Dcount1,Bit3
	goto	F_right
Foward
	movlw	0x01	;前進
	movwf	PORTA
	return

F_right
	movlw	0x02	;緩右旋回前進
	movwf	PORTA
	return
F_left
	movlw	0x03	;緩左旋回前進
	movwf	PORTA
	return

Backward
	btfss	Dcount1,Bit1
	goto	S_turn
	btfsc	Dcount1,Bit2
	goto	B_left
	btfsc	Dcount1,Bit3
	goto	B_right

	movlw	0x04	;後進
	movwf	PORTA
	return
B_right
	movlw	0x05	;緩右旋回後進
	movwf	PORTA
	return
B_left
	movlw	0x06	;緩左旋回後進
	movwf	PORTA
	return

S_turn
	btfsc	Dcount1,Bit2
	goto	S_left
	btfsc	Dcount1,Bit3
	goto	S_right

	movlw	0x00	;停止
	movwf	PORTA
	return
S_left
	movlw	0x07	;超信地左旋回
	movwf	PORTA
	return
S_right
	movlw	0x08	;超信地右旋回
	movwf	PORTA
	return
;*****************************************************************************
;*****************************************************************************
DELAY
	MOVLW	PERIOD
	MOVWF	DELAY0
DEL0
	DECFSZ	DELAY0,F
	GOTO	DEL0
	bsf	PORTA,Bit4

	MOVLW	PERIOD
	MOVWF	DELAY0
DEL1
	DECFSZ	DELAY0,F
	GOTO	DEL1
	bcf	PORTA,Bit4

	return
;*****************************************************************************
;	Dcount0の内容を読み、Dcount1の下位2ビットにスティックの
;	High,Middle,Lowを2,1,0として返す。
;*****************************************************************************
Test_signal
	movf	Dcount0,W	;W　に　Dcount0をセット
	sublw	0x29		;　k - (W) -> (W)
	btfsc	STATUS,C	;C Flugが0(負)かテスト
	goto	Mitest		;もし正ならばHiに達していない

	bsf	Dcount1,Bit0	;Dcount1の下位2ビットを01(2進数)にセット
	bcf	Dcount1,Bit1	;
	return

Mitest
	movf	Dcount0,W	;W　に　Dcount0をセット
	sublw	0x20		;　k - (W) -> (W)
	btfsc	STATUS,C	;C Flugが0(負)かテスト
	goto	Lotest		;もし正ならばHiに達していない

	bcf	Dcount1,Bit0	;Dcount1の下位2ビットを00(2進数)にセット
	bcf	Dcount1,Bit1
	return

Lotest
	bcf	Dcount1,Bit0	;Dcount1の下位2ビットを10(2進数)にセット
	bsf	Dcount1,Bit1
	return
;*****************************************************************************
;	RC受信機出力信号ハイレベルの長さを測る
;*****************************************************************************
Read_signal0
	BTFSS	PORTB,Bit0	;信号立ち上がりを待つ
	goto	Read_signal0

	MOVLW	0		;カウンターデータのレジスタクリア
	MOVWF	Dcount0

Loop00
	CALL	DELAY

	INCF	Dcount0,F	;カウンタデータインクリメント

	BTFSC	PORTB,Bit0	;信号立ち下がりを待つ
	goto	Loop00
	return
;*****************************************************************************
Read_signal1
	BTFSS	PORTB,Bit1	;信号立ち上がりを待つ
	goto	Read_signal1

	MOVLW	0		;カウンターデータのレジスタクリア
	MOVWF	Dcount0

Loop01
	CALL	DELAY

	INCF	Dcount0,F	;カウンタデータインクリメント

	BTFSC	PORTB,Bit1	;信号立ち下がりを待つ
	goto	Loop01
	return
;*****************************************************************************
Read_signal2
	BTFSS	PORTB,Bit2	;信号立ち上がりを待つ
	goto	Read_signal2

	MOVLW	0		;カウンターデータのレジスタクリア
	MOVWF	Dcount0

Loop02
	CALL	DELAY

	INCF	Dcount0,F	;カウンタデータインクリメント

	BTFSC	PORTB,Bit2	;信号立ち下がりを待つ
	goto	Loop02
	return
;*****************************************************************************
Read_signal3
	BTFSS	PORTB,Bit3	;信号立ち上がりを待つ
	goto	Read_signal3

	MOVLW	0		;カウンターデータのレジスタクリア
	MOVWF	Dcount0

Loop03
	CALL	DELAY

	INCF	Dcount0,F	;カウンタデータインクリメント

	BTFSC	PORTB,Bit3	;信号立ち下がりを待つ
	goto	Loop03
	return
;*****************************************************************************
;*****************************************************************************
	END