;------------------------------------------------------------------------------- ; チャンネルセレクタ (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