LEDを点滅させるプログラムを考える。
LEDを点滅させるには、プログラムをどう書けばよいか。
簡単には、上のように、PORTB = 0x00、PORTA =0x00 と PORTB = 0x20、PORTA =0x02 の命令を交互に書けばできそうですが、同じことの繰り返しです。
こんな時に、一塊の命令群を繰り返してくれる命令があります、それが、while 文です、書き方は、
while( 条件式 )
{
繰り返し実行したい命令文;
繰り返し実行したい命令文;//実行したい命令文は何行あってもよい。
}
です。
カッコ内の条件式は、繰り返しを終了させるための条件を書きます、カッコ内の条件式を計算した結果が0になると、下のカッコ }の下の命令文に実行が移っていきますが、0以外の場合は、カッコの中の命令文を上から下に実行し、最後の命令を実行すると、条件式を判定し結果が0以外ならば、カッコの中の命令を、上から下に実行し、最後の命令を実行すると、条件式を判定し結果が0以外ならば、カッコの中の命令を・・・・と条件式が0になるまで繰り返し実行します。
ここで、( )内の条件式を、1 としたらどうなるか、1は、0以外で、数値ですから、永久に1のままです、したがって、永久に0になりませんので、永久にカッコ内を繰り返し実行します。
上のようにプログラムを書くと、{ から }までを、永久に繰り返すプログラムになります。
これをビルドしてPICに焼けばよい・・・・・かというと、そう簡単にはいきません。
LEDは、PORTB = 0x00、PORTA =0x00 を実行すると消灯し、 PORTB = 0x20、PORTA =0x02 を実行すると点灯します、PICもコンピュータの1種ですから、1行実行するに要する時間は、ごく短いはずです、では、どのくらいでしょうか。
プログラムを書き始める時のブログで、コンフィギュレーションの設定をしました、その時、発振器の設定は INTOSCIO に設定しました。
その INTOSCIO の時の動作周波数の設定が PCON レジスタにあります。
上のREGISTER 4-6 PCON レジスタの説明によると、bit3 がその項になり、1なら、4MHz動作、0なら、37kHz動作です。
上のレジスタの表の初期設定の項をみると、PCONの bit3 の初期値は、1です。
ですから、PCONレジスタは触っていないので、動作周波数は4MHzです。
この動作周波数の事をクロックと言い、PICの動作の基準です。
PICは、機械語1命令を実行するのに4クロック必要(一部8クロックのもある)で、C言語プログラム1命令が、ビルドにより幾つの機械語命令に変換されるかは、そのC言語プログラム1命令によりますが、単純に同数と考えると、4MHzは1秒間に400万クロックで、4クロック必要ですから、1秒間に100万命令実行できます、すると、1命令にかかる時間は、100万分の1秒、すなわち、0.000001秒、すなわち,0.001ms(1μs)です、私たちがLEDの点滅を確実に目視できるのは0.1s位でしょうか、今回のLED点滅は、余裕をもって目視できるよう、0.5s点灯し0.5s消灯を繰り返すことにします。
LEDを点滅させるには、PORTB = 0x00、PORTA =0x00 を実行して消灯し、0.5秒待って、 PORTB = 0x20、PORTA =0x02 を実行して点灯し、0.5秒待つを繰り返せばよいことになります。
今回は、delay関数を使って、0.5s待つ事にします(下記プログラム)。
delay関数は、MP LAB XC コンパイラに備わっている関数で、一定の書式に従って呼び出して使います、delay関数はクロックを基準に遅延時間を作りますのでPICのクロック周波数をコンパイラに教える必要があり、今度の場合は、上のプログラムの赤矢印の部分で、4000000 の部分がクロック周波数です、その前の文は決まった書式です、実際の遅延時間を作る命令が、__delay_ms(500) の部分です。
__delay_ms(500) の解説。
delay の前のアンダーバーは2本必要、delay の後ろは1本です、( )の中に遅延する時間をms(ミリ秒)で書きます、500 の場合は、0.5(秒)です。
なお、遅延時間を作る方法は、他にもあります。
プログラムはできましたので、ビルドして、動作を確認しましょう、結果は次回です。