XC8 ディレイマクロ __delay_ms()

ディレイの覚書。あまり多用できませんが、初期化時など簡易的に遅延させるのに便利なマクロです。

●ソフトウェアディレイ

ダミー命令の繰り返しによるソフトウェアでの遅延は手軽で便利ですが、その反面、ディレイ中は割込み処理以外の処理が止まってしまうため、安易に使うとリアルタイム性がなくなってしまいます。他に処理が無い簡易的な処理の場合や初期化時などではよく使いますが、それ以外に使うのはよくありません。とくに割込み処理の中で使ってはいけません。

それから、ディレイ中に割込みなどが発生すると、その間、遅延時間が延びます。したがって割込みを禁止するなどしないと、正確な時間を遅延させることはできません。

●ディレイマクロ __delay_ms()

ms単位で遅延させるマクロ。引数に大きな値は指定できません。遅延動作中はプログラムが停止するため、初期化時などほかの処理に影響がないところ以外に多用は厳禁。

ダミー命令を繰り返し実行することで遅延させているため、システムクロックの周波数により遅延時間が変わります。そのため、_XTAL_FREQでクロック周波数をコンパイラに知らせる必要があります。以下、使用例です。

#define _XTAL_FREQ 16000000		// delay_ms(x) のための定義

void main(void) {
    __delay_ms(10);

    処理
}

コメントは受け付けていません。