LED点滅は組込の世界の「 Hello World 」に相当する。当チュートリアルでは、REO ボードを使用しLEDの点滅方法を解説する。Eclipse等の組込開発環境やC/C++言語についての基本知識を習得済みであることを前提に説明を進める。
ポートの使用
LED点滅にはGPIO(汎用入出力)ポートが必要である。GPIOポートは入出力ピンのセットで通常はアーキテクチャーにより8、16、32個である。当チュートリアルで使用されるMSP430は、F5659で、様々な特徴がある9個のポートを有する。ポート1~4は割込み機能付である。GPIO割込みについては、別のチュートリアルで説明する。
GPIOポート使用の際には、その方向(入力か出力か)を設定する必要がある。方向は通常ビット毎に設定される。MSP430では、 方向レジスタ内のあるビットを1に設定すると、出力に設定される。例えば、ポート1の方向レジスタに0x01を設定すると、ポート1のビット0は出力モードに設定される。
使用例
(A) P1DIR = 0x01; | ポート1の0ビットを出力にその他の全ビットを入力に設定 |
(B) P1DIR |= 0x01; | ポート1の0ビットを出力にその他のビットを変更しない |
(C) P1DIR = 0x05; | ポート1の0と2ビットを出力にその他の全ビットを入力に設定 |
(D) P1DIR &= ~0x01; | ポート1の0ビットを入力にその他の全ビットをを変更しない |
(E) P1DIR ^= 0x01; | ポート1の0ビットを反転 |
この設定は他のポート(P2~P9)にも同様に使用可能。
ここで、同様にポート1の0ビットのバリューに以下のコマンドを与える;
P1OUT=0x01;
ポート1のピン0の電圧は1になる。上記A)~E)のコマンドも同様の作用がある。
LED点滅プログラム
このプログラムは、遅延機能が必要である。MSP430のデフォルト・クロック周波数は内部で1MHz前後となっている。 この場合、while ループの1イテレーションは約10クロック(for ループも同様)である。従って、1ミリセカンドは約100クロックかかる。常に MILLISECONDを100と定義すると、ミリセカンド単位での遅延が設定可能となる。
-------------------
// Includes
#include <msp430F5659.h>
// Constant definitions
#define MILLISECOND 100
// Program protocols
void delay(unsigned short ms);
// Main program
void main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
P2DIR = 0x01;
while(1) {
P2OUT ^= 0x01;
delay(1000);
}
}
// Delay functions
void delay(unsigned short ms) {
volatile unsigned short i, j;
for(i = 0 ; i < ms ; ++i) {
for(j = 0 ; j < MILLISECOND ; ++j);
}
}
-------------------
適切なテストをする簡易な方法は、右図のようにLED をはんだづけすることだ。ピンの1本を切って、抵抗をはんだづけする。ここで抵抗値はさほど重要ではない。 プロセッサの作動電圧は3.3Vである。MSP430からは最大20mAが得られる。LED自体は色により(青色より赤色が少なく)1.6〜3Vの範囲で変化するので、例えば10mA以下を給電したい場合には、抵抗値は以下のように計算できる。
R=(Vcc - VLED)/0.01
Vcc = 3.3, VLED = 1.6 -> R > 170 Ω
緑色LEDの場合、抵抗電圧は1.3Vとなるので、130オーム以上必要となる。
結果的に170 Ω 以上の抵抗を選択すると全てのLEDに対応する。
しかし、抵抗値が高過ぎると輝度が低くなるので、抵抗値を抑える必要がある。
例えば470オーム以下で選択すればいいだろう。220オームの抵抗を使用すると、1.2/220(=約6mA)の電流となる。
ここで、上記LEDをREOボードのコネクタに差し込む。ポート2のピン0の隣にグラウンド・ピンがある。LEDをグラウンドとポート2のピン0に差し込むとLEDでポート2ピン0の状態を表すことが可能となる。
コンパイルし、ロードし起動させると、LEDが下図のように点滅する。
結論及びコメント
これまで説明したように、観察可能な点滅には遅延が必要である。つまり、プロセッサを遅延を設けるためのみに100%使用している。これは、非効率である。
その上、当プログラムはタイミングが不正確であるという問題もある。
例えば、別の処理をしたい場合は以下の通り:
このように、ループ時間が処理時間に依存するという問題がある。従って、正確なタイミングを保証するのは困難である。
タイミングについては、次のチュートリアルでこの問題の処置方法を学習しよう。そこで、タイマーと割り込みを紹介する。プログラム中に一定間隔のイベントを設ける新たな方法である。