ループによるwait

マイコンを使ってプログラミングを行っていると、色々な場面で処理を一時的に待たせる事が必要になる。例えば、

  • LEDの点滅プログラムで、点滅の切り替えスピードを変えたい場合
  • スイッチのチャタリング処理
  • 動作の遅いハードウエアの処理待ち
  • その他いろいろ

この様な処理に対応するために、処理を待たせるにはどうしたら良いか考えてみる。

待ち時間を生成する方法として、一般的には以下の2つの方法がある。

  1.  forループなどを用いて、CPUに対してダミーの処理を行わせることで待ち時間を生成する。
  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 >
#include "monitor.h"

#define WAIT(a) {for(w=0; w<a; w++);}   //ループ処理を行うことで、待ち時間を作る
#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を点灯
        WAIT(99999);   // 待ち
        PB_DR = 0xFF;   // LEDを消灯
        WAIT(99999);   // 待ち
    }
    return 0; // このreturnは実行されないので意味は無いが、ワーニング対策として挿入
}

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であるため-21474836482147483647の範囲で数値を扱う事が出来る。

 

 

 

最終更新:2014年02月27日 09:24