delay関数について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
もぶ

delay関数について

#1

投稿記事 by もぶ » 6年前

初心者です。
delay関数について教えてください。
下記のようなコードがあったとします。
オシロスコープでみるとdelay時間にずれがあります。
例えば20usecを計測すると実際には23usecくらいあったりします。
これだとループ回数が増えるほど遅延してくると思うのですが
正確に20usec出すにはどんな方法があるのでしょうか?実現方法を教えてください。

コード:

for(i = 0; i < 10; i++){
	__delay_ms(1000);
	PORTAbits.RA0 = 0x01;
	__delay_us(20);
	PORTAbits.RA0 = 0x00;
}

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: delay関数について

#2

投稿記事 by みけCAT » 6年前

環境がわかりませんが、
例えばクロック周波数とそれぞれの命令を実行するのにかかるクロック数が決まっているマイコンであれば、
そこから計算して20usecに該当するクロック数 - ポート操作にかかるクロック数のディレイをアセンブリ言語で入れる、
という方法があります。 (例えばクロック周波数が16MHzなら、320クロックで20usec)

また、タイマー割り込みが使える環境であれば、20usec間隔で割り込みがかかるようにして、
50000回(1000ms)割り込みがあったらPORTAbits.RA0 = 0x01;を実行し、
さらに次の割り込みでPORTAbits.RA0 = 0x00;を実行するようにすれば、
割り込みハンドラの処理の関係で(クロック周波数が正確だと仮定しても)
ちょうど20usecにはならないかもしれないですが、
精度が上がることが予想されます。

他の方法として、もしハードウェアのPWM機能が利用可能であれば、利用するのもいいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“C言語何でも質問掲示板” へ戻る