AVR Libc Home Page | ![]() |
AVR Libc Development Pages | ||
Main Page | FAQ | Library Reference | Additional Documentation | Example Projects |
#define F_CPU 1000000UL // 1MHz <util/delay.h>より前に定義してください //#define F_CPU 14.7456E6 //14.7456MHz #include <util/delay.h>
# Processor frequency. # This will define a symbol, F_CPU, in all source code files equal to the # processor frequency. You can then use this symbol in your source code to # calculate timings. Do NOT tack on a 'UL' at the end, this will be done # automatically to create a 32-bit value in your source code. F_CPU = 12800000
このヘッダファイルにある関数は、busy-waitに使えるシンプルなディレイループを提供します。プログラム実行中の短いディレイを簡単に実現するのに使われます。これらはよく知られた (CPUサイクル/ループ繰り返し)値を使ったカウントダウンループとして働きます。ループウェイトなので、同時に他の処理を動かすことは出来ません。ここに述べた関数は割り込みを禁止しない点にもご注意下さい。
一般的に言って、長いディレイについてはハードウェアタイマーを使った方が適切です。この方法はCPUを占有せず、他のイベントの並行処理を許すからです。しかしながらとても短いディレイについては、ディレイタイム中のオーバーヘッドよりハードウェアタイマーのセットアップなどのオーバーヘッドの方が大きいです。
2つのインライン関数がディレイアルゴリズムのために提供されています
2つの包み込み関数によりマイクロ秒単位で直接ディレイを指定することを可能にしています。これはアプリケーションが供給するマクロ
F_CPU
を、CPUクロック周波数(Hz単位)として使用します。これらの関数は倍精度実数型の引数を取りますが、最適化がオンならば、浮動小数点計算はコンパイル時にすまされ、コードにはループ回数を表す整数定数が渡されるだけのコードに縮められます。
Functions | |
void | _delay_loop_1 (uint8_t __count) |
void | _delay_loop_2 (uint16_t __count) |
void | _delay_us (double __us) |
void | _delay_ms (double __ms) |
|
8-bit counter CPUスピードが 1MHz なら、768μsecまでのディレイが実現できます。10MHzなら76.8μsec。 |
|
16-bit counter CPUスピードが 1MHz なら、262.144msecまでのディレイが実現できます。10MHzなら26.2144msec。 |
|
_delay_loop_2() を使って ( CPUクロック周波数 (Hz単位)を定義する定数として、(ユーザープログラム内で)マクロ
F_CPU が定義されることが前提。 最大のディレイは _delay_loop_2()の仕様に左右されます。かなり短い時間しかサポートできないので注意! |
|
_delay_loop_1() を使って ( CPUクロック周波数 (Hz単位)を定義する定数として、(ユーザープログラム内で)マクロ
F_CPU が定義されることが前提。 最大のディレイは _delay_loop_1() の仕様に左右されます。かなり短い時間しかサポートできないので注意! |
※訳注:
より長い時間をサポートしたければ、例えば以下のように行うことをお薦めします。
_delay_us()が使える場合はこちらを使った方が誤差が小さくなります。どっちにしても数μsec以下については誤差が大きいので注意。void delay_ms(uint16_t t) { while (t--) _delay_ms(1); } #define delay_us(t) _delay_ms(0.001*t); // t は定数であること