連載
» 2011年01月07日 00時00分 公開

Windows Embedded CEでマイコンとシリアル通信(1):レジスタへのアクセスが基本! SHマイコンで遊ぼう (2/3)

[佐藤 晶則,@IT MONOist]

4.LEDを点滅させるプログラムを書いてみよう!

 それでは早速、プログラムを書いてみましょう。まずは簡単に、ベースボードに付いているLED2個を交互に点滅させてみます。この2つのLEDは、それぞれポートEの第0ビットと第1ビットに接続されています。

 このプログラムに必要なレジスタ操作は、次の3つです。


(1)ポートEの第0ビットと第1ビットのマルチプレクス端子を入出力モードに設定

 マイコンの各端子の機能は1つだけでなく、数種類の機能があります。それを切り替えるのが「マルチプレクス」です。例えば、ポートEの第1ビットはシリアル通信に使われることがあります。今回は、デジタル入出力にしか使わないので、マルチプレクスは“入出力”に設定しておきます。

 マルチプレクスの設定は、ポートEの「コントロールレジスタ(PACRL)」に対して行います。データシートを見てみると、このレジスタのどこに、何の値をセットすればどの機能が設定されるかが書いてあります。これに従って、ソースコードを次のように記述します。各レジスタの構造は、プロジェクトファイル内のiodefine.hを見てください。各レジスタが共用体で定義されています。

PFC.PECRL4.WORD = 0x0000;
PFC.PECRL3.WORD = 0x0000;
PFC.PECRL2.WORD = 0x0000;
PFC.PECRL1.WORD = 0x0000; 

(2)ポートEの第0ビットと第1ビットを出力に設定

 先述のI/Oレジスタの設定です。対応するビットを「1」にセットすると“出力”になります。それ以外は“入力”に設定しておきましょう。この設定は、ポートEの「I/OレジスタL」に対して行います。

 従って、

PFC.PEIORL.WORD = 0x0003; 

となります。

(3)ポートEの第0ビットと第1ビットに必要に応じて「0 or 1」を書き込む

 先述のデータレジスタの操作です。対応するビットに「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.