ここまでの内容で、デジタル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;
}
}
}
ビルドして、MOTファイルをSHに書き込んで実行してみましょう。スイッチをスライドさせた方向の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)。
いかがでしたか? マイコンはレジスタの機能や構成が分かれば、簡単に使えるということが理解できたかと思います。もちろん、マイコンには難しい概念もありますが、データシートと“にらめっこ”して、レジスタの扱い方さえ理解できれば何とかなります。今回紹介した機能はほんの一部ですが、マイコンには便利な機能がたくさんあります。ぜひご自身でもトライしてみてください!
次回はマイコンとPCでシリアル通信をするプログラム作ってみたいと思います。お楽しみに! (次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.