delay関数について

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: delay関数について

Re: delay関数について

#2

by みけCAT » 5年前

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

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

他の方法として、もしハードウェアのPWM機能が利用可能であれば、利用するのもいいかもしれません。

delay関数について

#1

by もぶ » 5年前

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

コード:

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

ページトップ