リスト4は、ロータリエンコーダの値を取得するためのサンプルプログラムです。
EncInit()関数ではロータリエンコーダ入力で使用する各ポートのデータディレクションレジスタ(DDR)を操作して入出力を設定しています。今回H8マイコンから出力するのはENCODER CAPTUREと名付けた、エンコーダの値を読み込むきっかけを出力する信号(ポート80)のみで、残りはエンコーダからの入力信号となります。ただし、P1、P3、P8はトグルスイッチのプログラムで紹介したようなポートの構造体がすでに定義されているものとします。
エンコーダの値を実際に読み込むのがEncoderRead()関数です。この関数を呼び出すと、まずENCODER CAPTUREビット(ポート80)信号をLow → Highにします(1)。この動作をきっかけにして、この信号がつながっているPLDがロータリエンコーダ0、1の値をグレイコードから2進数に変換します。
//---------------------------------------------------------------------- // EncInit //---------------------------------------------------------------------- // [説明] // ロータリエンコーダ入力用のポート設定を行います //---------------------------------------------------------------------- void EncInit(void) { // P1(入力) // エンコーダ0入力 P1.DDR = 0x00; // P3(入力) // エンコーダ1入力 P3.DDR = 0x00; // P8(0:出力、1〜4:入力) // P80 : ENCODER CAPTURE P8.DR.BYTE = 0x00; P8.DDR = 0x01; return 0; } //---------------------------------------------------------------------- // EncoderRead //---------------------------------------------------------------------- // [説明] // ロータリエンコーダよりデータを入力します // 入力されたデータはバイナリコードです // [入力] // ch :入力するロータリエンコーダを0、1で指定します // [出力] // なし // [戻り値] // ロータリエンコーダより読み出された値(バイナリ)を返します //---------------------------------------------------------------------- unsigned char EncoderRead(int ch) { // 変換開始 P8.DR.BIT.B0 = 0; // CAP=0 ……(1) P8.DR.BIT.B0 = 1; // CAP=1 // 変換待ち Wait(2); ……(2) if(ch == 0){ return P1.DR.BYTE; } else{ return P3.DR.BYTE; } }
リスト中の(2)ではPLDがグレイコードを2進数データに変換するのを待つためにWait()関数を設けています。この処理はマイコンの実際の動作速度とPLDの実際の動作速度を考えればほとんど必要ないかもしれませんが、PLDが変換を行っているのだ、ということを意識するために入れています。
そして最後にポート1ないしポート3の値を戻り値として呼び出し、元の関数に返しています。このときの返り値はPLDで2進数に変換されたロータリエンコーダの値となります。
グレイコードから2進数への変換はプログラムへの負担を減らすためにPLDで行ってしまっているためプログラムとしてはだいぶ簡略化されていますので、もしPLDで変換を行わないとしたらプログラム側でどうしなければいけないか、を考えてみるのもいいかもしれません。
以上で、本連載で使用する入力系についての説明は終了です。そして、これで「H8で学ぶマイコン開発入門」としてターゲットボードで制御できる機器についての紹介は一通り終了しました。いままで「マイコンとは何か?」といったことから「開発の言語」「組み込み特有の文法」「実際の機器の制御」などを扱ってきました。次回は最終回として、各回を振り返りながら組み込み開発を始めるうえで気を付けること、大事だと思われることについて総まとめをしたいと思います。(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.