PIC12F629 入門 NO.5 (channel-selector)

[Previous] [Next] [Index]
PIC12F629 を使ったチャンネルセレクタ
 PIC12F629 入門 NO.4 でデコーダプログラムを紹介しているが、デコーダプログラムではそれぞれのチャンネルを別々のポートに出力していた。今回は出力ポートを 1 ヵ所に固定して、出力したいチャンネルをスイッチで切り替える方法を紹介する。

 今回は PIC12F629 に備わっている 16 ビットのタイマ 1 を使って、シリアルパルスの中から 3msec 以上のギャップを検出して、先頭のパルスを検出する。また、できるだけ分解能を高くするために、8MHz の外部発信回路で動作させる。

 赤外線送信機から 38KHz あるいは 56.9KHz で変調されて送り出された赤外線シリアルパルスは、赤外線受光素子からその変調が取り除かれて負極性のシリアルパルスとして出力される。その出力を PIC 入力にする。図では GP3 を入力にして、PIC 内部で GP0 と GP1 に接続されたデジタルスイッチ (S1、S2) の状態により、シリアルパルスの中から必要なチャンネルパルスを取り出して GP2 に出力する。出力パルスは正極性とした。

 ここで外部発振回路と内部発振回路を使うときの違い見てみよう。  内部発振回路を使うときはコンフィギュレーションビットの設定で _INTRC_OSC_NOCLKOUT としたが、8MHz のクリスタルを使うときは _HS_OSC とする。外部発振回路を使う場合は GP4 と GP5 に接続する。クリスタルと組み合わせるコンデンサの推奨値はデータシートに記載されている。

 特定チャンネルのパルスを取り出すには、まずギャップ検出をしたあとシリアルパルスの先頭パルスを取り出す。次にデジタルスイッチの設定を読み込み、取り出すチャンネルに応じて、設定されたチャンネルの立ち下がりパルスで出力を開始し、次の立ち下がりパルスで出力を停止する。


ディジタルスイッチ各種

 図では GP0 と GP1 に S1 と S2 のスイッチがつながっている。これはデジタルスイッチで、BCD(Binary Code Decimal) 出力を持つ。内部には 4 個のスイッチがあって、0 から 9 までに対応したスイッチ出力が得られるが、ここでは 2 ポートを使って、'01'、'10'、'11'、'00' をチャンネル 1 からチャンネル 4 までに割り当てている。デジタルスイッチの中には桁数を自由に組み合わせられるタイプが多い。

 デジタルスイッチの設定を読み込むプログラム例を次に示す。
	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チャンネルの処理へ

チャンネル 2 のパルス出力例

 たとえば、チャンネル 2 のパルスを取り出す場合、入力パルスの先頭から 2 番目の立ち下がりパルスで出力を High にして、3 番目の立ち下がりパルスで出力を Low にすればよい。プログラム例を次に示す。
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にする
ch-selector.asm(テキスト形式による全プログラム)

ch-selector.asm
ch-selector.HEX
(マウス右クリックで「対象をファイルに保存」)


チャンネルセレクタのサーボテスト

 テストボードには三端子レギュレータや、レベル変換トランジスタなどが載っているが、それらを使って送信機のトレーナ出力からのパルスを入力したり、ダイレクトに赤外受光素子からの出力を PIC に入力したりしてテストしてみた。PIC12F629 では 8MHz 動作の場合、3V から動作が保証されている。そこでリチウムイオン電池 1 セルを電源に使い、低電圧で動作する赤外線受光素子の NJL21V380A を使って、すでにリチウム電池 1 セルでの動作を確認してある HS-50 サーボをつないで、赤外線送信機からの信号を赤外線受光素子で受けて、チャンネルセレクタでチャンネルを切り替えながらサーボの動作を確認してみた。これだけでも大いに利用価値がありそうだ。
[Previous] [Next] [Index]
2005/01/22