マイコンを使ってプログラミングを行っていると、色々な場面で処理を一時的に待たせる事が必要になる。例えば、
この様な処理に対応するために、処理を待たせるにはどうしたら良いか考えてみる。
待ち時間を生成する方法として、一般的には以下の2つの方法がある。
いずれの方法も利点・欠点がある。簡単なのは1のforループなどを用いる方法。具体的には、以下のようにする。
#include < machine.h > #include "monitor.h" #define PB_DDR (*(volatile unsigned char *)0xFFFD4) #define PB_DR (*(volatile unsigned char *)0xFFFD6) int main() { long int w; // long int型を用いることで、ループの終了条件を大きく設定できるようにする。 PB_DDR = 0xFF; // ポートBのすべてのビットを出力に設定 while (1) { PB_DR = 0; // LEDを点灯 for(w=0; w<999999;w++); // ループ処理を行うことで、待ち時間を作る PB_DR = 0xFF; // LEDを消灯 for(w=0; w<999999;w++); // ループ処理を行うことで、待ち時間を作る } return 0; // このreturnは実行されないので意味は無いが、ワーニング対策として挿入 } |
forループをdefineで定義して見易くすると、以下の様になる。
#include < machine.h > |
CPUの動作は非常に高速であるため、 for文でのループの回数は、ある程度大きくないとLEDの点滅が目視で確認できない。 99999でおおよそ0.5秒程度の待ち時間となる。(10万回のループを0.5秒で実行するということは、1回のループをどのくらいの時間で実行しているか考えてみよう。 0.5/100,000 = 0.5x10-5 = 5 x 10-6 = 5μS )
【注意】
for文のループ変数wはlong
int型として定義している。H8/3052Fではint型は2byteであるため、表現できる数値は-32768~32767となる。99999は2byteで表現できる範囲を超えているので、この様な条件は意味を為さない。99999をループの終了条件としたい場合はループ変数をlong
int型として定義する必要がある。long int型は4byteであるため-2147483648~2147483647の範囲で数値を扱う事が出来る。