それでは早速、プログラムを書いてみましょう。まずは簡単に、ベースボードに付いているLED2個を交互に点滅させてみます。この2つのLEDは、それぞれポートEの第0ビットと第1ビットに接続されています。
このプログラムに必要なレジスタ操作は、次の3つです。
マイコンの各端子の機能は1つだけでなく、数種類の機能があります。それを切り替えるのが「マルチプレクス」です。例えば、ポートEの第1ビットはシリアル通信に使われることがあります。今回は、デジタル入出力にしか使わないので、マルチプレクスは“入出力”に設定しておきます。
マルチプレクスの設定は、ポートEの「コントロールレジスタ(PACRL)」に対して行います。データシートを見てみると、このレジスタのどこに、何の値をセットすればどの機能が設定されるかが書いてあります。これに従って、ソースコードを次のように記述します。各レジスタの構造は、プロジェクトファイル内のiodefine.hを見てください。各レジスタが共用体で定義されています。
PFC.PECRL4.WORD = 0x0000; PFC.PECRL3.WORD = 0x0000; PFC.PECRL2.WORD = 0x0000; PFC.PECRL1.WORD = 0x0000;
先述のI/Oレジスタの設定です。対応するビットを「1」にセットすると“出力”になります。それ以外は“入力”に設定しておきましょう。この設定は、ポートEの「I/OレジスタL」に対して行います。
従って、
PFC.PEIORL.WORD = 0x0003;
となります。
先述のデータレジスタの操作です。対応するビットに「1」をセットすると5Vが出力されます。
PE.DRL.BIT.B0 = 1; // PE0に5Vを出力 PE.DRL.BIT.B1 = 0; // PE1に0Vを出力
これでLEDを光らせることができるようになりました。後は“ウエイト”を入れて、交互にLEDをON/OFFするだけです。ソースコードは次のようになります(ソースコード1)。
#include "iodefine.h" void msecwait(int msec) { int i, j; for (i = 0; i < msec; i++) for (j = 0; j < 6000; j++); } void main(void) { // ポートE・コントロールレジスタの設定(すべて入出力に設定) PFC.PECRL4.WORD = 0x0000; PFC.PECRL3.WORD = 0x0000; PFC.PECRL2.WORD = 0x0000; PFC.PECRL1.WORD = 0x0000; // ポートE・IOレジスタの設定(PE0とPE1を出力、ほかは入力に設定) PFC.PEIORL.WORD = 0x0003; while (1) { PE.DRL.BIT.B0 = 1; PE.DRL.BIT.B1 = 0; msecwait(1000); PE.DRL.BIT.B0 = 0; PE.DRL.BIT.B1 = 1; msecwait(1000); } }
ソースコード1 LEDを点滅させるプログラム(その1) |
ビルドして、「MOTファイル」をSHマイコンに書き込んで実行してみましょう。この手順もベースボードキットのマニュアルを参考にしてください。2つのLEDが約1秒周期で交互に点灯しているのが確認できるはずです。
ちなみに、自作の関数「msecwait」は、引数「msec」の間ループするだけの関数です。しかし、この関数に引数「1000」を与えて、時計を見ながらループの内側の変数(6000)を調整して作ったので正確ではありません。今回はサンプルプログラムですので、この方法でも特に問題はないですが、正確な時間での制御が必要な場合は、マイコンの機能の1つである「タイマ」を使いましょう。
Copyright © ITmedia, Inc. All Rights Reserved.