当ブログをご覧いただき、ありがとうございます。
ご注意事項:
記載内容には、十分注意しておりますが、勘違い、記憶違い、理解不足、思い込み等が無いとは限りませんので、申し訳ありませんが、 記載内容の正確性は保障致しません(出来ません)。
従いまして、このブログの内容を参考にする事に起因して生じる、または 生じた、いかなる事態にも、当方は何の責任も取れませんので、 参考にされる場合は、自己責任にてお願い致します。
このブログのC言語に関する説明には、PICで電子工作するのに必要な事柄以外(私のレベルで)は出てきません、出てこないことの方が多いと思いますので、ご了承願います。

LEDを点滅させるプログラムを考える。

LEDを点滅させるには、プログラムをどう書けばよいか。

f:id:higonohimajin:20210303155900p:plain

簡単には、上のように、PORTB = 0x00、PORTA =0x00 と PORTB = 0x20、PORTA =0x02 の命令を交互に書けばできそうですが、同じことの繰り返しです。

こんな時に、一塊の命令群を繰り返してくれる命令があります、それが、while 文です、書き方は、

while( 条件式 )

   繰り返し実行したい命令文;

   繰り返し実行したい命令文;//実行したい命令文は何行あってもよい。

 }

です。

カッコ内の条件式は、繰り返しを終了させるための条件を書きます、カッコ内の条件式を計算した結果が0になると、下のカッコ }の下の命令文に実行が移っていきますが、0以外の場合は、カッコの中の命令文を上から下に実行し、最後の命令を実行すると、条件式を判定し結果が0以外ならば、カッコの中の命令を、上から下に実行し、最後の命令を実行すると、条件式を判定し結果が0以外ならば、カッコの中の命令を・・・・と条件式が0になるまで繰り返し実行します。

ここで、( )内の条件式を、1 としたらどうなるか、1は、0以外で、数値ですから、永久に1のままです、したがって、永久に0になりませんので、永久にカッコ内を繰り返し実行します。

 

f:id:higonohimajin:20210303164803p:plain

上のようにプログラムを書くと、{ から }までを、永久に繰り返すプログラムになります。

これをビルドしてPICに焼けばよい・・・・・かというと、そう簡単にはいきません。

LEDは、PORTB = 0x00、PORTA =0x00 を実行すると消灯し、 PORTB = 0x20、PORTA =0x02 を実行すると点灯します、PICもコンピュータの1種ですから、1行実行するに要する時間は、ごく短いはずです、では、どのくらいでしょうか。

プログラムを書き始める時のブログで、コンフィギュレーションの設定をしました、その時、発振器の設定は INTOSCIO に設定しました。

その INTOSCIO の時の動作周波数の設定が PCON レジスタにあります。

f:id:higonohimajin:20210303171553p:plain

上のREGISTER 4-6 PCON レジスタの説明によると、bit3 がその項になり、1なら、4MHz動作、0なら、37kHz動作です。

f:id:higonohimajin:20210303172109p:plain

上のレジスタの表の初期設定の項をみると、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待つ事にします(下記プログラム)。 

f:id:higonohimajin:20210303204551p:plain

delay関数は、MP LAB XC コンパイラに備わっている関数で、一定の書式に従って呼び出して使います、delay関数はクロックを基準に遅延時間を作りますのでPICのクロック周波数をコンパイラに教える必要があり、今度の場合は、上のプログラムの赤矢印の部分で、4000000 の部分がクロック周波数です、その前の文は決まった書式です、実際の遅延時間を作る命令が、__delay_ms(500) の部分です。

__delay_ms(500) の解説。

delay の前のアンダーバーは2本必要、delay の後ろは1本です、( )の中に遅延する時間をms(ミリ秒)で書きます、500 の場合は、0.5(秒)です。

なお、遅延時間を作る方法は、他にもあります。

プログラムはできましたので、ビルドして、動作を確認しましょう、結果は次回です。