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

» 2011年01月07日 00時00分 公開
[佐藤 晶則,@IT MONOist]
前のページへ 1|2|3       

5.スイッチの状態に合わせてLEDを光らせてみよう!

 ここまでの内容で、デジタルI/Oの出力は、自由に使えるようになったと思います。次は“入力”ですが、ここまで来ればもう手順の予想はつくでしょう。出力のときと同様に、マルチプレクスを“入出力”に設定し、I/Oレジスタを“入力”に設定し、データレジスタを読むだけです。先ほどのプログラムと違う点は、I/Oレジスタの設定を“入力”に設定している点だけです。


 ベースボードに付いている「スイッチ」を読み取れるように設定しましょう。このスイッチは、ポートEの第2ビットに接続されています。よって、PEIORLの設定は先ほどのものと同じで、

PFC.PEIORL.WORD = 0x0003; 

となります。

 後は、スイッチの状態をデータレジスタから読み出して、条件分岐でLEDを光らせるだけです。ソースコードは次のようになります(ソースコード2)。

#include "iodefine.h"
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)
        {
                if (PE.DRL.BIT.B2 == 1)
                {
                        PE.DRL.BIT.B0 = 0;
                        PE.DRL.BIT.B1 = 1;
                }
                else
                {
                        PE.DRL.BIT.B0 = 1;
                        PE.DRL.BIT.B1 = 0;
                }
        }
}
ソースコード2 スイッチの状態に合わせてLEDを光らせるプログラム

 ビルドして、MOTファイルをSHに書き込んで実行してみましょう。スイッチをスライドさせた方向のLEDが点灯するようになったでしょうか。

6.LEDの明るさを変えてみよう!

 LEDの明るさを変えるためには、LEDに掛ける電圧を変える方法が真っ先に浮かびます。しかし、これには「D/Aコンバータ」というアナログ電圧出力の機能が必要になります。今回使用するSH7125にはこの機能が付いていませんし、付いているマイコンもD/Aコンバータが使える端子が限られています。

 そこで、「PWM(Pulse Width Modulation)」を使います。日本語では「パルス幅変調」といいます。PWMを用いれば、短い時間の間でLEDの点灯/消灯の割合を変えることで、明るさが変わっているように見せることができます。すなわち、「パルスの幅を変える=パルス幅変調」ということになります。もちろん、この周期を長くすると点滅して見えます。先ほどのLEDの点滅は、点灯/消灯のパルス幅を同じにして、周期を長くした「PWM制御」といえるでしょう。

 今回は、レジスタの設定はそのままで構いません。ウエイトの時間を調節するだけですので、無限ループの中身だけを変えてみましょう。例えば、次のようなプログラムになります(ソースコード3)。

#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 = 0;
                msecwait(8);
                PE.DRL.BIT.B0 = 1;
                msecwait(2);
        }
}
ソースコード3 LEDを点滅させるプログラム(その2)

 LEDを消灯して8msec待ち、点灯させて2msec待つというプログラムです。少々分かりにくいですが、電源LEDと比べてみると明るさの違いが分かると思います(図6)。

LEDをPWMで暗くする様子 図6 LEDをPWMで暗くする様子(電源LEDと比較するとよく分かる)


 いかがでしたか? マイコンはレジスタの機能や構成が分かれば、簡単に使えるということが理解できたかと思います。もちろん、マイコンには難しい概念もありますが、データシートと“にらめっこ”して、レジスタの扱い方さえ理解できれば何とかなります。今回紹介した機能はほんの一部ですが、マイコンには便利な機能がたくさんあります。ぜひご自身でもトライしてみてください!

 次回はマイコンとPCでシリアル通信をするプログラム作ってみたいと思います。お楽しみに! (次回に続く)


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.