;
; 位相差２信号ロータリーエンコーダ回転検出（デコードプログラム）
;
; Assembler: CVASM16
; MPU      : PIC10F206 (4MHz Internal RC Osc.)
; 
; 2005.2.16 by RUU http://www.mars.dti.ne.jp/~ogura/
;
; 機械式エンコーダのA,B出力を時計回り／反時計回りいずれかのパルス
; 出力に変換します。
; 出力はGP1,GP2がそれぞれCW(時計回り),CCW(反時計回り)でアクティブ
; ロー出力です。
; 回転速度に応じたパルス幅およびパルス周期となります
; (数ms～,エンコーダの分解能に依存)
; ロータリーエンコーダはALPS社のEC16Bにて動作確認。
;

			include	'10f206.inc'
			FUSES	_IntRC_OSC
			FUSES	_WDT_OFF
			FUSES	_MCLRE_OFF
			FUSES	_CP_OFF


OUT_CW		=	GP1					; CW出力
OUT_CCW		=	GP2					; CCW出力
IN_A		=	GP0					; A入力
IN_B		=	GP3					; B入力

ROT_DTCT	=	00000000b			; 回転検出(CW/CCW)
ROT_RST		=	00001001b			; 定常状態
ROT_CW		=	00001000b			; CW確定直前
ROT_CCW		=	00000001b			; CCW確定直前
ROT_MSK		=	00001001b			; 入力マスク

CW			=	00000100b			; CW
CCW			=	00000010b			; CCW
C_RST		=	00000110b			; STOP


;; レジスタ定義
			org		008h

ab_in		ds		1				; A,B入力状態


;; 初期化
			org		000h
			mov		osccal,w					; RCクロック校正値設定
			clrb	FOSC4						; fosc/4無効
			mov		!option,#10000000b			; Pullup on
			mov		cmcon0,#11110011b			; Comparator off
			mov		gpio,#C_RST
			mov		!gpio,#00001001b			; GP1,2は出力、GP0,3は入力

;; メインループ
loop0
			mov		ab_in,gpio					; A,B入力
			and		ab_in,#ROT_MSK
			cjne	ab_in,#ROT_RST,loop0		; 変化なければそのまま
			mov		gpio,#C_RST					; 定常状態
loop_cw
			mov		ab_in,gpio
			and		ab_in,#ROT_MSK
			cje		ab_in,#ROT_DTCT,set_cw		; CW検出
			cje		ab_in,#ROT_CCW,loop_ccw
			goto	loop_cw						; 変化なし
loop_ccw
			mov		ab_in,gpio
			and		ab_in,#ROT_MSK
			cje		ab_in,#ROT_DTCT,set_ccw		; CCW検出
			cje		ab_in,#ROT_CW,loop_cw
			goto	loop_ccw					; 変化なし
set_cw
			mov		gpio,#CW					; CW出力
			goto	loop0
set_ccw
			mov		gpio,#CCW					; CCW出力
			goto	loop0


;;;;;;;;;;;;;;;;;;; おしまい ;;;;;;;;;;;;;;;;;;;;;;

