Arduinoのタイマー処理

以前からArduinoのタイマー割り込み処理ってなぜこんな複雑なんだろうと思っていた。
調べてみるとタイマーは高速PWMモードで16MHzの場合で1024usという中途半端な時間で割り込みが発生するようになっている。
millis()の戻り値はミリ秒であるため補正するために約42ms毎に1ms補正しているようだ。ということは補正時にmillis()の戻り値が1飛ぶことになる...millis()の戻り値が1msずつ変化すること期待しているアプリにとっては想定外のことが起こる可能がありそうだ。ちなみに8MHzでは2msずつ変化し補正時のみ4ms変化することになるようだ。CTCモードなら補正いらないのにな...こんなんでいいのか?
micros()は補正なしのオーバーフローカウンター値から計算して求めているので問題ないが当然ながら補正しているmillis()と補正していないmicros()では時間の進み方が異なってしまう。

[2020-02-26]
再度確認してみたところmicros()が補正してないというのは私の勘違いでした。すいません...

【millis()の戻り値が飛んでしまうことを確認するプログラム】

【millis()の戻り値が飛んでしまうことを確認するプログラムの出力】

【参考: wiring.cのタイマー割り込み処理】

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください