前ページまでの内容で、単体(1つ)のアナログ・データの取り扱いについては理解できたと思いますが、デモ・ボードにはいくつものアナログ入力装置が搭載されています。
では、複数のアナログ・データを同時に扱うにはどのようにすればよいのでしょうか? ADCのブロック図を見てみると変換器自体は1つのようです(図7)。
アナログ入力のピン設定は、APCTLレジスタでピンごとに有効/無効を設定できます。使用するアナログ・ピンはすべて有効にしておきます。そして、実際の変換対象はADCSC1レジスタのADCHビットでチャネルを指定することになります。変換の度にこのチャネルを切り替えればOKです。
それでは、複数のアナログ・データを扱うプログラムを考えてみましょう。
表示に使うLEDが8ビット分しかありませんので、プッシュスイッチで表示するアナログ装置を選択するようにします。スイッチが4つあるので、「(1)ポテンショメータ」、加速度センサ「(2)X」「(3)Y」「(4)Z」を切り替えるようにします。アナログのデータは、先ほどと同様に繰り返しすべて読み込みます。
では、プログラム例を見ていきましょう。今回は少し複雑になり、マジックナンバーが出てきましたので、#defineによる定数定義をしてあります。「CH_」ではじまるものがADCSC1レジスタのADCHで用いるチャネル番号(10進数表記)、「SEL_」ではじまるものがスイッチで選択された表示対象を表します。また、割り込み処理とデータを共有するための外部変数も定義しています(リスト5)。
アナログ/デジタル変換の部分とスイッチ処理の部分は、割り込み処理にします。mainでは、永久ループの中で、変数stateの値で押されたスイッチを判断し、そのアナログ/デジタル変換値をLEDに表示します(リスト6)。
スイッチの処理は、連載第4回で紹介した「KBI割り込み」を使います。mcu_initには、その初期設定を追加してください。スイッチは4つとも使います(表2)。
ピン番号 | 選択する装置 | スイッチ名 | KBIピン名 |
---|---|---|---|
48 | ポテンショメータ | PTA2 | KBI1P2 |
47 | 加速度センサ(X) | PTA3 | KBI1P3 |
46 | 加速度センサ(Y) | PTD2 | KBI2P2 |
45 | 加速度センサ(Z) | PTD3 | KBI2P3 |
表2 ポート・ピンとKBIピンの対応(一部) |
ADCは、アナログ入力を4つとも使います。表1を参考にAPCTL1/APCTL2を設定します。ADCSC1のADCHは初期値「0(ポテンショメータ)」にしておきます(リスト7)。
ADCで複数のアナログ入力を扱うには、変換したら次のピンを参照するようにADCSC1のADCHのチャネルの値を変更しなければなりません。ADSCHに書き込みを行う(つまりチャネルを変更する)とアナログ/デジタル変換が中断されます。書き込みのタイミングには注意してください。ここでは、安全のため処理の最後にチャネルを変更するようにしています。変換結果は変数p_val、x_val、y_val、z_valに格納されます(リスト8)。
最後にKBI割り込みの処理です。基本は連載第4回と同じ使い方ですので問題はないでしょう。押されたスイッチによって変数stateに値を格納します(リスト9)。
では、プログラムをビルドして動作確認をしてみてください。
うまく動きましたか? うまく動かない人は、プログラムの打ち間違えがないか確認してみてください。デバッグの練習です……。
なんて、ヤボなことはいいません。本連載はタイピングの練習講座ではありませんので、ソースファイル(main.c)を以下のリンクに置いておきます。うまくいかない人は、自分のmain.cとこのファイルを入れ替えて動作を確認してみてください。
いかがでしたでしょうか? いよいよセンサが登場しましたね。今回はセンサの値を表示しただけですが、実際はその値によってモータを回したり、表示を切り替えたりするなど、いろいろな処理を制御するわけです。
ご存じのとおり、今回のデモ・ボードの表示装置は8個のLEDしかありません。「そろそろ、その能力にも限界が見えてきた」と思っていやしませんか? でも、大丈夫。マイコンにはほかの装置につないでデータ通信を行う機能があるのです。つまり、システムとして機能アップできるということです(さらに夢が膨らみますよね)。この辺りのお話については次回詳しく説明することにします。お楽しみに!(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.