« AVRでシリアルを送信する。 | トップページ | AVRアセンブラ関数の作り方 »

2012年12月 8日 (土)

AVR delay関数の使い方

AVRマイコンでソフトタイマーを使う。
(ここで使っているWinAVRのバージョン:WinAVR20100110)

10msなど決まった間隔の待ち時間を発生させるには、delay関数というものが用意されている。この関数に必要な秒数を渡すことで任意の待ち時間を発生させてくれる。

まずは、<util/delay.h>をインクルードする。

マイクロ秒単位なら、

_delay_us( double マイクロ秒数 );

ミリ秒単位なら、

_delay_ms( double ミリ秒数 );

この関数の仕様は、WinAVRをインストールしたときについてくる”avr-libc”というドキュメントを見ればいい。以下日本語訳。

MainPage⇒LibraryReferenceに、WinAVRで定義されているヘッダファイルの一覧が載っている。ちなみに、いつもインクルードしている<avr/io.h>等もこの一覧の中にある。

delay.hのページを見てみると、
<util/delay.h>: Convenience functions for busy-wait delay loops
とある。

Descriptionには、
Define文が書いてあり、delay関数を使う前にF_CPUというマクロでCPUのクロックがいくらであるかをコンパイラに教えなければならないようだ。

util/delay.hというのは、util/delay_basic.hからのラッパー。派生して作られたソースで、F_CPUで与えられたCPUクロックを元に、指定した秒数だけウェイトを作るらしい。
util/delay_basic.hの方は、CPUクロックのサイクル数を渡すということか。

Noteのところには、
これらの関数を働かすためには、コンパイラの最適化は有効にしなければならない。というような内容が書かれている。(まだ文章が続いているが、英語が正確に読めないので次回・・)

その下の、Function Documentationの項に行くと、
delay_msとdelay_usという、関数の詳細が説明されている。

delay_msで設定できる最大の秒数は、
delay時間[max] = 262.14ms÷CPUクロック(MHz)

とあり、この最大秒数を超えると分解能が1/10msに落ちるのだが、6.5535sまでのウェイトを作ることができる。CPUクロックが8MHzなら32.78msが最大秒数ということか。

一方、delay_usは、
delay時間[max] = 768us÷CPUクロック

となっている。最大秒数を超えると、自動的にdelay_msが呼ばれる仕組みらしい。


PICマイコンの時みたいに、自分で作ることもできます。
Delay関数を自分で作ってレベルアップ!!!

感想:
Google先生で調べればサンプルソースがたくさん出てくるので、ドキュメントを見る機会は全く無かった。しかし付属ドキュメントをじっくり読むと、サンプルをコピペして動かす以上に新しい発見がある。

« AVRでシリアルを送信する。 | トップページ | AVRアセンブラ関数の作り方 »

AVRマイコン」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: AVR delay関数の使い方:

« AVRでシリアルを送信する。 | トップページ | AVRアセンブラ関数の作り方 »