初心者です。
delay関数について教えてください。
下記のようなコードがあったとします。
オシロスコープでみるとdelay時間にずれがあります。
例えば20usecを計測すると実際には23usecくらいあったりします。
これだとループ回数が増えるほど遅延してくると思うのですが
正確に20usec出すにはどんな方法があるのでしょうか?実現方法を教えてください。
delay関数について
Re: delay関数について
環境がわかりませんが、
例えばクロック周波数とそれぞれの命令を実行するのにかかるクロック数が決まっているマイコンであれば、
そこから計算して20usecに該当するクロック数 - ポート操作にかかるクロック数のディレイをアセンブリ言語で入れる、
という方法があります。 (例えばクロック周波数が16MHzなら、320クロックで20usec)
また、タイマー割り込みが使える環境であれば、20usec間隔で割り込みがかかるようにして、
50000回(1000ms)割り込みがあったらPORTAbits.RA0 = 0x01;を実行し、
さらに次の割り込みでPORTAbits.RA0 = 0x00;を実行するようにすれば、
割り込みハンドラの処理の関係で(クロック周波数が正確だと仮定しても)
ちょうど20usecにはならないかもしれないですが、
精度が上がることが予想されます。
他の方法として、もしハードウェアのPWM機能が利用可能であれば、利用するのもいいかもしれません。
例えばクロック周波数とそれぞれの命令を実行するのにかかるクロック数が決まっているマイコンであれば、
そこから計算して20usecに該当するクロック数 - ポート操作にかかるクロック数のディレイをアセンブリ言語で入れる、
という方法があります。 (例えばクロック周波数が16MHzなら、320クロックで20usec)
また、タイマー割り込みが使える環境であれば、20usec間隔で割り込みがかかるようにして、
50000回(1000ms)割り込みがあったらPORTAbits.RA0 = 0x01;を実行し、
さらに次の割り込みでPORTAbits.RA0 = 0x00;を実行するようにすれば、
割り込みハンドラの処理の関係で(クロック周波数が正確だと仮定しても)
ちょうど20usecにはならないかもしれないですが、
精度が上がることが予想されます。
他の方法として、もしハードウェアのPWM機能が利用可能であれば、利用するのもいいかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)