;-------------------------------------------------------------------------------
; チャンネルセレクタ (PIC12F629) 外部発振回路 8MHz
; 赤外線センサからのシリアルパルスから特定チャンネルのパルスを取り出すプログラム
; ch-selector.asm
; GP0: チャンネル選択スイッチ(S1)
; GP1: チャンネル選択スイッチ(S2)
; GP2: 選択出力(正極性)
; GP3: シリアルパルス入力(負極性)
; GP4: 外部発振器接続
; GP5: 外部発振器接続
;-------------------------------------------------------------------------------
	list	P=PIC12F629
	include	"P12F629.INC"

;----------------------------------
; コンフィギュレーションビット設定 
;----------------------------------
	__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC

CH_POS	equ	20h            	;出力チャンネル設定レジスタ

	org	0
;----------
; 初期設定 
;----------
	bsf	STATUS, RP0     ;bank1へ
	movlw	b'00001011'     ;GP0,GP1,GP3を入力に設定
	movwf	TRISIO
	movlw	b'00001000'
;		  |_____________弱プルアップを設定して外部プルアップ抵抗を省略
	movwf	OPTION_REG      ;GP3は内部プルアップがないので外部でプルアップ
	bcf	STATUS, RP0     ;bank0へ
	movlw	b'00010000'
;		     |__________TMR1のプリスケーラを1:8にして1カウント1μsecに
	movwf	T1CON
	movlw	b'00000111'     ;GP2:0をデジタルI/Oに設定
	movwf	CMCON
	clrf	GPIO

;--------------
; ギャップ検出 
;--------------
loop	clrf	TMR1H           ;TMR1の上位バイトクリア
	clrf	TMR1L           ;TMR1の下位バイトクリア
	clrf	CH_POS
lp1	btfss	GPIO, 3         ;入力がなければ(Highなら)なら次の処理へ
	goto	lp1             ;入力があればここでループ
	bsf	T1CON, 0        ;TMR1をスタート
lp2	btfsc	GPIO, 3         ;入力があったら(Lowなら)なら次の処理へ
	goto	lp2             ;入力がなければここでループ
	bcf	T1CON, 0        ;TMR1をストップ
	movlw	d'12'           ;12x256=3072usec=3.072msecのギャップ時間設定
	subwf	TMR1H, W
	btfss	STATUS, C       ;3msec以上のギャップが検出されたら次の処理へ
	goto	loop            ;ギャップでなければloopへ戻る

;------------------------
; 取り出しチャンネル判定 
;------------------------
output	btfss	GPIO, 0         ;GP0のS1がOFF(High)なら次の処理へ
	bsf	CH_POS, 0       ;GP0のS1がON(Low)ならCH_POSのbit0に1をセット
	btfss	GPIO, 1         ;GP1のS2がOFF(High)なら次の処理へ
	bsf	CH_POS, 1       ;GP1のS2がON(Low)ならCH_POSのbit1に1をセット
	movf	CH_POS, W
	addwf	PCL, F          ;PCLの値にCH_POSの値を加算してジャンプ
	goto	ch4             ;CH_POS=0ならch4の処理へ
	goto	ch1             ;CH_POS=1ならch1の処理へ
	goto	ch2             ;CH_POS=2ならch2の処理へ
	goto	ch3             ;CH_POS=3ならch3の処理へ

;------------------------
; 取り出しチャンネル出力 
;------------------------
ch4	btfsc	GPIO, 3         ;立ち下がりパルスを検出したら次の処理へ
	goto	ch4             ;それまではここでループ
lp41	btfss	GPIO, 3         ;立ち上がりパルスを検出したら次の処理へ
	goto	lp41            ;それまではここでループ

ch3	btfsc	GPIO, 3         ;立ち下がりパルスを検出したら次の処理へ
	goto	ch3             ;それまではここでループ
lp31	btfss	GPIO, 3         ;立ち上がりパルスを検出したら次の処理へ
	goto	lp31            ;それまではここでループ

ch2	btfsc	GPIO, 3         ;立ち下がりパルスを検出したら次の処理へ
	goto	ch2             ;それまではここでループ
lp21	btfss	GPIO, 3         ;立ち上がりパルスを検出したら次の処理へ
	goto	lp21            ;それまではここでループ

ch1	btfsc	GPIO, 3         ;立ち下がりパルスを検出したら次の処理へ
	goto	ch1             ;それまではここでループ
	bsf	GPIO, 2         ;GP2ポートをHighにする
lp11	btfss	GPIO, 3         ;立ち上がりパルスを検出したら次の処理へ
	goto	lp11            ;それまではここでループ
lp12	btfsc	GPIO, 3         ;立ち下がりパルスを検出したら次の処理へ
	goto	lp12            ;それまではここでループ
	bcf	GPIO, 2         ;GP2ポートをLowにする
	goto	loop

	end