赤外線送信機から 38KHz あるいは 56.9KHz で変調されて送り出された赤外線シリアルパルスは、赤外線受光素子からその変調が取り除かれて負極性のシリアルパルスとして出力される。その出力を PIC 入力にする。図では GP3 を入力にして、PIC 内部で GP0 と GP1 に接続されたデジタルスイッチ (S1、S2) の状態により、シリアルパルスの中から必要なチャンネルパルスを取り出して GP2 に出力する。出力パルスは正極性とした。
ここで外部発振回路と内部発振回路を使うときの違い見てみよう。 内部発振回路を使うときはコンフィギュレーションビットの設定で _INTRC_OSC_NOCLKOUT としたが、8MHz のクリスタルを使うときは _HS_OSC とする。外部発振回路を使う場合は GP4 と GP5 に接続する。クリスタルと組み合わせるコンデンサの推奨値はデータシートに記載されている。 特定チャンネルのパルスを取り出すには、まずギャップ検出をしたあとシリアルパルスの先頭パルスを取り出す。次にデジタルスイッチの設定を読み込み、取り出すチャンネルに応じて、設定されたチャンネルの立ち下がりパルスで出力を開始し、次の立ち下がりパルスで出力を停止する。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 ;CH_POS の値をWレジスタにロード addwf PCL, F ;プログラムカウンタの値にWレジスタの値を加算してジャンプ goto CH4 ;Wレジスタの値が0なら4チャンネルの処理へ goto CH1 ;Wレジスタの値が1なら1チャンネルの処理へ goto CH2 ;Wレジスタの値が2なら2チャンネルの処理へ goto CH3 ;Wレジスタの値が3なら3チャンネルの処理へ
CH2 btfsc GPIO, 3 ;最初の入力パルスの立ち下がり(チャンネル1)を検出したら次の処理へ goto CH2 ;それまでここでループ LP21 btfss GPIO, 3 ;入力パルスの立ち上がり(まだチャンネル1)を検出したら次の処理へ goto LP21 ;それまでここでループ CH1 btfsc GPIO, 3 ;入力パルスの立ち下がり(チャンネル2)を検出したら次の処理へ goto CH1 ;それまでここでループ bsf GPIO, 2 ;GP2出力をHighにする LP11 btfss GPIO, 3 ;入力パルスの立ち上がり(まだチャンネル2)を検出したら次の処理へ goto LP11 ;それまでここでループ LP12 btfsc GPIO, 3 ;入力パルスの立ち下がり(チャンネル3)を検出したら次の処理へ goto LP12 ;それまでここでループ bcf GPIO, 2 ;GP2出力をLowにする
2005/01/22