;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;		ロータリーエンコーダ実験用プログラム	ＪＡ０ＱＯＮ
;
;		PIC12F683 10MHZ
;
;		12f683_re_test1.asm
;
;		
;		使用エンコーダは秋月電子のアルプス製
;		7セグボード出力は割込に対応
;
;		I/O	GP0=x	7セグボードへシリアル送信(割込み)
;			GP1=x	エンコーダ出力Ａ
;			GP2=x	エンコーダ出力Ｂ
;			GP3=0	
;			GP3=1	
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



		LIST	P=PIC12F683
		INCLUDE	P12F683.INC
		
;CONFIGURATION WORD(ADDRESS:2007H)
;bit13-12		Unimplemented
;bit11			FCMEN	0セット、使いません。
;						1=enabled,0=disabled
;bit10			IESO	0セット
;						1=enabled,0=disabled
;bit9-8			BODEN	00セット
;				___		00=disabled
;bit7			CPD		データメモリプロテクション　0セット
;						1=disabled,0=enabled
;bit6			CP		プログラムメモリプロテクション　0セット　
;						1=enabled,0=disabled
;bit5			MCLRE	0セット
;				_____	1=enabled,0=disabled(Digital input)
;bit4			PWRTE	power_up timer　0セット、使います。
;						1=disabled,0=enabled
;bit3			WDTE	Watchdog Timer　0セット、使いません。
;						1=enabled,0=disabled
;bit2-0			FOSC	今回は、010B(HS)を使用
;						111=RC:2pinでRC発振、3pinCLKOUT、I/O不可
;						110=RCIO:　〃　GP4I/O可
;						101=INTOSC:内部発振　3pinCLKOUT、GP5I/O可
;						100=INTOSCIO:内部発振、GP4-5I/O可
;						011=EC:2pin外部クロック入力、GP4I/O可
;						010=HS：外部発振子、I/O不可
;						001=XT：　〃
;						000=LP：　〃
;
;bit	15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
;data    0  0  0  0  0  0  0  0  0  0  0  0  0  0  1  0
;

		__CONFIG	B'0000000000000010'
	

;		ワークエリア定義
;
;		使用していないのもあります
;

hex0		equ		020h		;32ビットバイナリデータ
hex1		equ		021h		;広域的に使用
hex2		equ		022h
hex3		equ		023h
colum		equ		028h		;現在の桁位置
cnt0		equ		029h		;時間待ちルーチン用ワーク
cnt1		equ		02ah
cnt2		equ		02bh
cnt3		equ		02ch
tmp0		equ		02dh		;雑用
tmp1		equ		02eh
bcdw0		equ		02fh		;BCD変換ルーチン用
bcdw1		equ		030h		;
cary1		equ		031h		;演算部ワーク
cary2		equ		032h
cary3		equ		033h
shift		equ		034h		;BCD変換ルーチンでのシフトカウンタ用
txw0		equ		035h		;7セグボード　シリアル送信部ワーク
txw1		equ		036h		;7セグボード　シリアル送信部ワーク
flg			equ		037h		;7セグボード　動作設定フラグ
flgw		equ		038h		;7セグボード　シリアル送信部ワーク
tcnt0		equ		039h		;割込み用時間待ち部ワーク
tcnt1		equ		03ah
tcnt2		equ		03bh
stp0		equ		03ch		;カウントステップLバイト
stp1		equ		03dh		;カウントステップHバイト
gtime		equ		03eh		;ｹﾞｰﾄタイム設定
pscnt		equ		03fh		;プリスケーラ残カウント
hexw0		equ		040h		;演算部入力用
hexw1		equ		041h
hexw2		equ		042h
hexw3		equ		043h
het			equ		044h		;差分データ
red			equ		045h		;取得したエンコーダ出力データ保存ワーク
rew0		equ		046h		;エンコーダ処理部ワーク
rew1		equ		047h		;
rew2		equ		048h		;
;

			ORG		0h
			goto	init
			ORG		04h
			goto	init
			org		05h
			


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			PIC12F683　イニシャライズ			
;
;		CMCON0_REG
;			bit7=0	Unimplemented
;			bit6=x	COUT	コンパレータ出力ﾋﾞｯﾄ
;			bit5=0	Unimplemented
;			bit4=x	CINV
;			bit3=1	CIS
;			bit2-0	CM		コンパレータモード	111	Off
;										入力はデジタル
;										他モードは使用しない
;
;		ANSEL_REG
;			bit7=1	Unimplemented
;			bit6-4	ADCS	A/Dコンバータクロック選択
;			bit3-0	ANS		アナログ選択ビット
;							1=アナログ入力
;							0=デジタルI/O
;
;		TRISIO_REG	1=input mode,0=output mode
;			bit7=0	Unimplemented
;			bit6=0	Unimplemented
;			bit5=0	GP5	I/O	設定条件あり、コンフィグレーションワード参照
;			bit4=1	GP4	I/O　設定条件あり、　〃
;			bit3=1	GP3	Inputのみ
;			bit2=1	GP2	I/O
;			bit1=0	GP1	I/O
;			bit0=0	GP0	I/O
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
	
init
			bcf		STATUS,RP0	;Bank0
			clrf	GPIO		;Init GPIO
			movlw	07h
			movwf	CMCON0		;コンパレータoff、アナログポート→デジタル
			bsf		STATUS,RP0	;バンク１に切替
			clrf	ANSEL		;デジタルI/O
			bcf		ADCON0,ADON	;ADコンバータOFF
			movlw	0f8H		;11111000b
			movwf	OPTION_REG	;プリスケーラ無しにセット
			movlw	0eh			;00001110b
			movwf	TRISIO		;GP1,2,3入力　GP0出力モード
			bcf		STATUS,RP0	;バンク０に切替
			bsf		GPIO,0		;DATA BUSY
;			goto	main_dbg

;
;			初期値設定
;
;			オフセット周波数=10MHZ（0989680h)
;			ステップ　1KHZ=03e8h
;
coldst
			clrf	hex0		;保存データクリア
			clrf	hex1
			clrf	hex2
			clrf	hex3
			movlw	0e8h		;カウントステップ初期設定
			movwf	stp0
			movlw	03h
			movwf	stp1		;1KHZ
			call	re_data
			movlw	080h		;オフセット周波数初期設定
			movwf	hex0
			movlw	096h
			movwf	hex1
			movlw	098h
			movwf	hex2
			movlw	0h
			movwf	hex3		;10MHZ
			movlw	04fh		;01001111b
        	movwf	flg			;8桁表示、4,7桁ドット表示指定
        	call	tx_data		;オフセット値を7セグボードへ送信


main
			call	re_data		;エンコーダ出力データ取得
			iorlw	0h			;W=1新データ有,W=0新データ無
			btfss	STATUS,Z	;戻り値チェック
			call	tx_data		;7セグボードへ送信
			goto	main




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			動作モードセット
;
;		使用ワーク
;				カウンタモード			het=0(SW_OFF=1)
;				受信周波数表示モード	het=1(SW_ON=0)
;
;				2桁表示指令		flg=xxxxx001
;				4桁表示指令		flg=xxxxx011
;				6桁表示指令		flg=xxxxx101
;				8桁表示指令		flg=xxxxx111
;				ゼロブランキング動作指令	flg=xxxx1xxx
;				ドット表示指令		flg=x000xxxx　表示なし
;									bit4=1	2,5桁点燈
;									bit5=1	3,6桁点燈
;									bit6=1	4,7桁点燈
;				オーバーフロー		flg=1xxxxxxx
;
;		OPTION_REG
;			bit7=1	GPPU	GPIOプルアップOFF
;							0=enabled,1=disabled
;			bit6=1	INTEGE	INT割り込み信号エッジ↑
;							1=↑,0=↓
;			bit5=1	T0CS	TMR0クロックは外部
;							1=外部入力GP2,0=内部
;			bit4=0	T0SE	TMR0カウントエッジ↑
;							1=↑,0=↓
;			bit3=1	PSA		プリスケーラ無し
;							1=WDT,0=TMR0
;			bit2-0	PS		プリスケーラ分周比	000 1/2
;										001	1/4
;										010	1/8
;										011	1/16
;										100	1/32
;										101	1/64
;										110	1/128
;										111	1/256
;		注）　現在このルーチンは使用されていない
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

get_mode
			clrf	red
			movlw	04fh		;01001111b
        	movwf	flg			;8桁表示、4,7桁ドット表示指定
			movlw	0e8h
			movwf	stp0
			movlw	03h
			movwf	stp1		;1KHZ

			return		

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;
;		ロータリーエンコーダ入力パルス　カウントサブルーチン
;
;		想定部品	ALPS	EC12E2420801(クリックタイプ）
;						EC12E2420803(ノンクリックタイプ)
;						チャタリング	3ms(max),R=10KΩ
;						バウンズ	2ms(max),R=10KΩ
;		エンコーダA端子	GP1
;		エンコーダB端子	GP2
;		合成出力データ	hex0
;					hex1
;					hex2
;					hex3
;
;		エンコーダ右回り	アップカウント
;		エンコーダ左回り	ダウンカウント
;
;
;		状態変化無ならWreg=0でリターン
;		状態変化有ならWreg=1、redに記録
;		red		データビット記録
;		旧ビットデータは左シフトされ、フロービットは破棄される
;		t(0)	→bit1,0
;		t(-1)	→bit3,2
;		t(-3)	→bit5,4
;		t(-4)	→bit7,6
;
;		使用ワーク	rew0,rew1,red
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

re_data
;			ポートデータチェック
;			rew0	取得データ（下位2ビット有効）
			movf	GPIO,W		;GP1,GP2ポート読込(1'st)
			movwf	rew0
			rrf		rew0,F		;bit0=REA,bit1=REB
			movlw	03h			;
			andwf	rew0,F		;不要ビットをクリア
			call	d1m			;チャタリング終了待ち3ms
			call	d1m
			call	d1m
			movf	GPIO,W		;GP1,GP2ポート読込(2'st)
			movwf	rew1		;
			rrf		rew1,F
			movlw	03h			;不要ビットをクリア
			andwf	rew1,W
			xorwf	rew0,W		;1'stと2'stを比較
			btfss	STATUS,Z	;Z=1ならば取得データ有効
			goto	re_data	;データ読込エラー リトライ

;			ポートデータ新旧比較
			movf	red,W
			movwf	rew1		;過去データをコピー
			movlw	03h
			andwf	rew1,W		;不要ビットをクリア
			xorwf	rew0,W		;新旧データ比較
			btfsc	STATUS,Z	;Z=0ならば状態変化有
			retlw	0h			;状態変化無で終了



;			保存データ更新
;			過去データ		red
;			一時保存ワーク	rew1
			movf	red,W		;過去ビット保存データ
			movwf	rew1		;過去データ一時保存
			rlf		red,F		;新データ挿入のため2ビット左シフト
			rlf		red,F		;ついでにCフラグデータもbit0に入ります
			movlw	0fch		;
			andwf	red,F		;データ領域(bit0-1)をクリア
			movf	rew0,W
			iorwf	red,F		;保存データ更新

;			回転方向判別
			movlw	03h			;
			andwf	rew1,F		;rew=F(-1)の2ビットのみとする
			bcf		STATUS,C	;Cフラグをクリア
			rlf		rew1,W		;F(-1)ビットを左シフト
			xorwf	rew0,F		;(取得ビット)XOR(旧ビット)
			btfsc	rew0,1		;Lなら時計回転
			goto	ccw			;Hなら反時計回転

;			右回転処理		hex(0-3)を指定ステップでインクリメント
;			stp0=アップダウンステップ下位バイト
;			stp1=アップダウンステップ上位バイト
cw			movf	stp0,W
			movwf	hexw0
			movf	stp1,W
			movwf	hexw1
			clrf	hexw2
			clrf	hexw3
			call	add32b		;ステップ周波数分を加算
			retlw	01h

;			左回転処理		hex(0-3)を指定ステップでデクリメント
ccw			movf	stp0,W
			movwf	hexw0
			movf	stp1,W
			movwf	hexw1
			clrf	hexw2
			clrf	hexw3
			call	sub32b		;ステップ周波数分を減算
			retlw	01h


;
;			32ビット10倍演算
;
;		入力	hex3-0	32ビット
;		出力　hex3-0	
;
;		使用ワーク	hexw0-3	4バイト
;

x10
;			データ保存
			movf	hex0,W
			movwf	hexw0
			movf	hex1,W
			movwf	hexw1
			movf	hex2,W
			movwf	hexw2
			movf	hex3,W
			movwf	hexw3			

;			32ビットデータを8倍

			bcf		STATUS,C	;
			rlf		hex0,F		;2倍を3回実行する
			rlf		hex1,F
			rlf		hex2,F
			rlf		hex3,F
			bcf		STATUS,C	;
			rlf		hex0,F
			rlf		hex1,F
			rlf		hex2,F
			rlf		hex3,F
			bcf		STATUS,C
			rlf		hex0,F
			rlf		hex1,F
			rlf		hex2,F
			rlf		hex3,F

			call	add32b		;元データを加算
			call	add32b
			retlw	0h


;			32ビットバイナリ加算
;
;		(hex0-3) = (hex0-3) + (hexw0-3)
;

add32b
			movf	hexw0,W		;hex0=hex0+hexw0
			addwf	hex0,F
			movlw	01h
			btfss	STATUS,C	;if c=1 then hex1=hex1+1	
			goto	adb1
			addwf	hex1,F
			btfsc	STATUS,C	;if c=1 then hex2=hex2+1
			addwf	hex2,F
			btfsc	STATUS,C	;if c=1 then hex3=hex3+1
			addwf	hex3,F
			
adb1		movf	hexw1,W
			addwf	hex1,F
			movlw	01h
			btfsc	STATUS,C
			addwf	hex2,F
			btfsc	STATUS,C
			addwf	hex3,F
			
adb2		movf	hexw2,W
			addwf	hex2,F
			movlw	01h
			btfsc	STATUS,C
			addwf	hex3,F
			movf	hexw3,W
			addwf	hex3,F
			retlw	0h

;
;		455KHz減算
;
;		hex(0-3)=hex(0-3)-455KHZ
;
;		W=0で減算成功
;		W=1でエラー発生
;
offset

loc455k
			movf	hex3,W		;４バイト目のデータ存在チェック
			andlw	0ffh
			btfss	STATUS,Z
			goto	loc01
			movf	hex2,W		;３バイト目上位４ビットのデータ存在チェック
			movwf	hexw2
			andlw	0f0h
			btfss	STATUS,Z
			goto	loc01
			
			swapf	hexw2,W		;３バイト目下位４ビットを上位４ビットへ
			andlw	0f0h
			movwf	hexw2

			movf	hex1,W		;500KHz=7a120h
			andlw	0f0h		;07a100h以下はエラーと判定
			movwf	hexw1
			swapf	hexw1,W
			iorwf	hexw2,W
			sublw	07ah
			btfsc	STATUS,C
			retlw	01h			;減算エラー･リターン
			
loc01								;減算開始
			movlw	058h		;455KHz=455000HZ
			movwf	hexw0		;=0006f158h
			movlw	0f1h
			movwf	hexw1
			movlw	06h
			movwf	hexw2
			clrf	hexw3

;
;
;			32ビットバイナリ減算
;
;		(hex0-3) = (hex0-3) - (hexw0-3)
;

sub32b
			movf	hexw0,W		;hex0=hex0-hexw0
			subwf	hex0,F
			movlw	01h
			btfsc	STATUS,C	;if c=0 then hex1=hex1-1
			goto	sbb1
			subwf	hex1,F
			btfss	STATUS,C	;if c=0 then hex2=hex2-1
			subwf	hex2,F
			btfss	STATUS,C	;if c=0 then hex3=hex3-1
			subwf	hex3,F

sbb1		movf	hexw1,W
			subwf	hex1,F
			movlw	01h
			btfss	STATUS,C
			subwf	hex2,F
			btfss	STATUS,C
			subwf	hex3,F

sbb2		movf	hexw2,W
			subwf	hex2,F
			movlw	01h
			btfss	STATUS,C
			subwf	hex3,F
			movf	hexw3,W
			subwf	hex3,F
			retlw	0h


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			シリアルデータ転送サブルーチン(ビット幅10us版)
;
;		入力		hex0	16進バイナリ24ビット
;				hex1
;				hex2
;				hex3
;				flg
;				これらのデータは破壊されない
;		出力		W=0	送信成功
;				W=1	送信失敗
;
;		データ線	GP0		1bit width = 10us
;		使用ワーク	txw0,shift,flgw,hexw0-3
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

tx_data
			movf	hex0,W
			movwf	hexw0
			movf	hex1,W
			movwf	hexw1
			movf	hex2,W
			movwf	hexw2
			movf	hex3,W
			movwf	hexw3
			movf	flg,W
			movwf	flgw



;
;		送信開始
;

tx_start
			bcf		GPIO,0		;スタートビット　セット
			movlw	05h
			movwf	txw0
txb13		decfsz	txw0,F
			goto	txb13		;2+3*4+2=16c/s

;			hex3
			movlw	08H			;
			movwf	shift		;左シフトカウンタ

txb10		nop					;tx loopここから送信まで7c/s
			nop
			rlf		hexw3,F		;左シフトで最上位ビットはキャリーへ
			btfss	STATUS,C	;キャリービット　チェック
			GOTO	send10
			nop
send11		bsf		GPIO,0		;DATA 1 send
			goto	txb11
send10		bcf		GPIO,0		;DATA 0 send
			nop
			nop					;txb0からここまで9c/s
txb11			
			movlw	04h			;時間調整
			movwf	txw0		;2+3*3+2=13cycles
txb12		decfsz	txw0,F
			goto	txb12
		
			decfsz	shift,F		;(shift-1)=0 then return 
			goto	txb10		;(9+3）+13=25cycles
								;最終ビット送出から17c/s経過

;			hex2

			movlw	08H			;
			movwf	shift		;左シフトカウンタ

txb20		nop					;tx loopここから送信まで7c/s
			nop
			rlf		hexw2,F		;左シフトで最上位ビットはキャリーへ
			btfss	STATUS,C	;キャリービット　チェック
			GOTO	send20
			nop
send21		bsf		GPIO,0		;DATA 1 send
			goto	txb21
send20		bcf		GPIO,0		;DATA 0 send
			nop
			nop					;txb0からここまで9c/s
txb21			
			movlw	04h			;時間調整
			movwf	txw0		;2+3*3+2=13cycles
txb22		decfsz	txw0,F
			goto	txb22
		
			decfsz	shift,F		;(shift-1)=0 then return 
			goto	txb20		;(9+3）+13=25cycles
								;最終ビット送出から17c/s経過


;			hex1
	
			movlw	08H			;
			movwf	shift		;左シフトカウンタ

txb30		nop						;tx loopここから送信まで7c/s
			nop
			rlf		hexw1,F		;左シフトで最上位ビットはキャリーへ
			btfss	STATUS,C	;キャリービット　チェック
			GOTO	send30
			nop
send31		bsf		GPIO,0		;DATA 1 send
			goto	txb31
send30		bcf		GPIO,0		;DATA 0 send
			nop
			nop					;txb0からここまで9c/s
txb31			
			movlw	04h			;時間調整
			movwf	txw0		;2+3*3+2=13cycles
txb32		decfsz	txw0,F
			goto	txb32
		
			decfsz	shift,F		;(shift-1)=0 then return 
			goto	txb30		;(9+3）+13=25cycles
								;最終ビット送出から17c/s経過

;			hex0

			movlw	08H			;
			movwf	shift		;左シフトカウンタ

txb40		nop						;tx loopここから送信まで7c/s
			nop
			rlf		hexw0,F		;左シフトで最上位ビットはキャリーへ
			btfss	STATUS,C	;キャリービット　チェック
			GOTO	send40
			nop
send41		bsf		GPIO,0		;DATA 1 send
			goto	txb41
send40		bcf		GPIO,0		;DATA 0 send
			nop
			nop					;txb0からここまで9c/s
txb41			
			movlw	04h			;時間調整
			movwf	txw0		;2+3*3+2=13cycles
txb42		decfsz	txw0,F
			goto	txb42
		
			decfsz	shift,F		;(shift-1)=0 then return 
			goto	txb40		;(9+3）+13=25cycles
								;最終ビット送出から17c/s経過

;			FLG

			movlw	08H			;
			movwf	shift		;左シフトカウンタ

txb50		nop					;tx loopここから送信まで7c/s
			nop
			rlf		flgw,F		;左シフトで最上位ビットはキャリーへ
			btfss	STATUS,C	;キャリービット　チェック
			GOTO	send50
			nop
send51		bsf		GPIO,0		;DATA 1 send
			goto	txb51
send50		bcf		GPIO,0		;DATA 0 send
			nop
			nop					;txb0からここまで9c/s
txb51			
			movlw	04h			;時間調整
			movwf	txw0		;2+3*3+2=13cycles
txb52		decfsz	txw0,F
			goto	txb52
		
			decfsz	shift,F		;(shift-1)=0 then return 
			goto	txb50		;(9+3）+13=25cycles
								;最終ビット送出から17c/s経過

;
;			送信終了
;

			bsf		GPIO,0		;ストップビット　セット
			call	d10u
			retlw	0h			;送信終了




;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			シリアルデータ転送サブルーチン(ビット幅50us版)
;
;		入力		hex0	16進バイナリ24ビット
;				hex1
;				hex2
;				hex3
;				flg
;		出力		W=0	送信成功
;				W=1	送信失敗
;
;
;		データ線	GP0		1bit width = 50us
;				RX（受信）	GP3 =0	受信不可
;						GP3 =1	受信可
;
;		使用ワーク	bsyc0
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

txs_data
;
;		送信準備OK
;
;		DATAとRXラインを使用して送信タイミングを合わせる
;

		bcf			GPIO,0		;TX_ON(データラインと兼用）

;
;		応答待ち
;
stbs1
		call		d10u
		btfss		GPIO,3		;RX line check
		goto		stbs1
;
;		送信開始
;
;		割込み使用の場合はここからスタート
;

txs_start
		bcf			GPIO,0		;スタートビット　セット
		call		wait50u		;　
		movf		hex3,W		;DATAビット
		call		txs_byte
		movf		hex2,W
		call		txs_byte
		movf		hex1,W
		call		txs_byte
		movf		hex0,W
		call		txs_byte
		movf		flg,W
		call		txs_byte

;
;		送信終了
;

		bsf			GPIO,0		;ストップビット　セット
		call		wait50u
		retlw		0h			;送信終了

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;		１バイト転送サブルーチン
;
;		上位ビットから送信します
;
;		1ビット幅は概ね50usで送出
;
;		使用ワーク	shift,txw0-1
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


								;
txs_byte
		movwf		txw0		;送信バイトをワークへ保存
		movlw		08H			;
		movwf		shift		;左シフトカウンタ

txsb0							;tx loop
		rlf			txw0,F		;左シフトで最上位ビットはキャリーへ
		btfss		STATUS,C	;キャリービット　チェック
		GOTO		sends0
		nop
sends1	bsf			GPIO,0		;DATA 1 send
		goto		txsb1
sends0	bcf			GPIO,0		;DATA 0 send
		nop
		nop
txsb1	call		d10u		;40us delay
		call		d10u
		call		d10u
		call		d10u
		
		movlw		04h			;時間調整
		movwf		txw1		;2+3*3+2=13cycles/5.2us
txsb2	decfsz		txw1,F
		goto		txsb2
		
		decfsz		shift,F		;(shift-1)=0 then return 
		goto		txsb0		;(7+3）+13=23cycles/9.2us
		return					;





;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			遅延時間サブルーチン
;
;		clock = 10MHz(0.1usec)
;		use work reg = cnt0,cnt1,cnt2,cnt3
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


wait100u							;呼び出しも含めて、100usec
									;call is 2cycles
			movlw		08h			;1
			movwf		cnt2		;1
w1u			nop						;
			nop						;
			call		d10u		;10*8=80usec(ここだけ命令ステップを数えない）
			decfsz		cnt2,F		;5*8+4=44cycles
			goto		w1u
			return					;2+44+4=50cycles=20usec
			
wait50u								;呼び出しも含めて、50us
			movlw		04h
			movwf		cnt2
w05u		nop
			call		d10u
			decfsz		cnt2,F		;4*4+3=19cycles
			goto		w05u
			return					;2+19+4=25cycles=10us


wait5m								; 5msec delay
			movlw		05h
			movwf		cnt2
w5m			call		d1m
			decfsz		cnt2,F
			goto		w5m
			return

wait10m								; 10msec delay
			movlw		d'10'
			movwf		cnt2
w10m		call		d1m
			decfsz		cnt2,F
			goto		w10m
			return

wait20m								; 20msec delay
			movlw		d'20'
			movwf		cnt2
w20m		call		d1m
			decfsz		cnt2,F
			goto		w20m
			return

wait50m								; 50msec delay
			movlw		d'50'
			movwf		cnt2
w50m		call		d1m
			decfsz		cnt2,F
			goto		w50m
			return

wait100m							; 100msec delay
			movlw		d'100'
			movwf		cnt2
w100m		call		d1m
			decfsz		cnt2,F
			goto		w100m
			return

wait500m							; 500msec delay
			movlw		05h
			movwf		cnt3
w500m		call		wait100m
			decfsz		cnt3,F
			goto		w500m
			return

wait1s								; 1sec delay
			movlw		d'10'
			movwf		cnt3
w1s			call		wait100m
			decfsz		cnt3,F
			goto		w1s
			return

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			1msec Base delay 
;
;		clock = 10MHz(0.1usec)
;		1cycle = 0.4usec
;		1msec = 0.4usec * 2500cycles
;
;		# goto and call and return - 2cycles
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
d1m
			movlw		02h
			movwf		cnt0		;loop0 2times
d1m0		movlw		d'249'		;
			movwf		cnt1		;loop1 249times

d1m1		nop						;5cycles*cnt1
			nop						;5*249=1245
			decfsz		cnt1,F		;
			goto		d1m1		;

			decfsz		cnt0,F		;(d1m1-1+3)*cnt0
			goto		d1m0		;(1245-1+5)*2=2498cycles
			return					;other=3cycles
									;Total 2501*0.4usec=1msec

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;
;			10usec Base delay
;			呼び出しも含めて、10usecとなる。
;
;		clock = 10MHZ(0.1usec)
;		1cycle = 0.4usec
;		10usec = 0.4usec * 25cycles
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

									;"call" inst = 2cycles
d10u
			movlw		05h			;1
			movwf		cnt0		;1
d10u0		nop						;4*4+3=19
			decfsz		cnt0,F		;
			goto		d10u0		;
			return					;2+1+1+19+2=25cycles
			


			end
			
			


