;------------------------------------------------------------------------------- ; decode.asm for PIC12F629 ; 3チャンネルデコーダー ; GP3: 入力(負論理) ; GP0: ch1出力(正論理) ; GP1: ch2出力(正論理) ; GP2: ch3出力(正論理) ;------------------------------------------------------------------------------- list P=PIC12F629 include "P12F629.INC" ; -- コンフィギュレーションビットの設定 -- __CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT temp equ 20h ;12F629では20hから64バイトがユーザーエリア gapcnt1 equ 21h gapcnt2 equ 22h org 0 bsf STATUS, RP0 ;bank1に切り替え(以下の設定はbank1にマップされているため) call 3ffh ;内部発振周波数校正値の読み込み movwf OSCCAL ;OCCALレジスタに校正値をセット movlw b'00001000' ;BP3のみ入力GP5:4,2:0を出力に設定 movwf TRISIO ;TRISIOを設定しない場合の初期値はb'00111111' ;つまり全部入力設定になっている movlw b'00000000' ; ||||||||_______PS0: Prescaler Rate Select bits ; |||||||________PS1: Prescaler Rate Select bits ; ||||||_________PS2: Prescaler Rate Select bits ; |||||__________PSA: Prescaler Assignment bit 今回は未使用 ; ||||___________T0SE: TMR0 Source Edge Select bit 今回は未使用 ; |||____________T0CS: TMR0 Clock Source Select bit 今回は未使用 ; ||_____________INTEDG: Interrupt Edge Select bit 今回は未使用 ; |______________GPPU: 0=GPIO pull-ups are enabled movwf OPTION_REG ;OPTION_REG を設定しない場合初期値は b'11111111' bcf STATUS, RP0 ;bank0へ clrf GPIO movlw b'00000111' ;GP2:0 をデジタルI/Oに設定 movwf CMCON call clr_cnt ;ギャップカウンタークリア ;-- ギャップ検出 -- loop btfsc GPIO, 3 ;入力がゼロなら次をスキップ goto out_h ;入力が1ならout_hへ movlw d'2' ;wレジスタに2をセット 3.588msec subwf gapcnt2, w ;w = gapcnt2 - w btfss STATUS, C ;STATUSレジスタのキャリービットが1なら次をスキップ goto lp1 ;gapcnt2 < 2 ならlp1へ call clr_cnt goto output ;ギャップが検出されたのでoutputへ lp1 call clr_cnt ;ギャップカウンタークリア goto loop out_h incf gapcnt1, f btfss STATUS, Z ;桁上げが発生したら次をスキップ goto loop incf gapcnt2, f goto loop ;-- ギャップカウンタークリアルーチン -- clr_cnt clrf gapcnt1 clrf gapcnt2 return ;-- 出力 -- output ;-- ch1 -- o1 bsf GPIO, 0 ;GP0 ON btfss GPIO, 3 ;入力が1なら次をスキップ goto o1 o2 btfsc GPIO, 3 ;入力がゼロなら次をスキップ goto o2 bcf GPIO, 0 ;GP0 OFF ;-- ch2 -- o3 bsf GPIO, 1 ;GP1 ON btfss GPIO, 3 ;入力が1なら次をスキップ goto o3 o4 btfsc GPIO, 3 ;入力がゼロなら次をスキップ goto o4 bcf GPIO, 1 ;GP1 OFF ;-- ch3 -- o5 bsf GPIO, 2 ;GP2 ON btfss GPIO, 3 ;入力が1なら次をスキップ goto o5 o6 btfsc GPIO, 3 ;入力がゼロなら次をスキップ goto o6 bcf GPIO, 2 ;GP2 OFF goto loop ; -- 発振周波数校正値呼び出しルーチン -- org 0x3ff retlw 0x9c ;とりあえず手持ち個体の値をセット end