AVR用タイマー割込ライブラリを作成してみた。

Arduinoのmillis()/micros()が利用しているTIMER0を流用するライブラリを作成してみた。他のタイマーを使わないのがメリットだが中途半端な時間であるのがデメリット。正確なミリ秒でなくても良い用途なら使えるか...

【参考情報】Arduinoのタイマー処理

このライブラリはArduinoのタイマー割り込み周期で動作し同時に2チャンネル利用できる。

Arduinoの割り込み周期は次の通り。

16.5MHz … 993us
16MHz … 1024us
8MHz … 2048us
4MHz … 4096us
2MHz … 8192us
1MHz … 16384us

【修正履歴】
[2020-03-28]
TIMER0のPWMピンがanalogWrite()/tone()で指定されたとき、このライブラリ機能に影響があることが判明。一時的に割り込み周期が狂ってしまう。回避策はないので排他的にしか利用できない。

[2020-02-27]
まだstart()のタイミング・バグがとり切れてなかったので再修正。

[2020-02-24]
start()処理が微妙な感じだったので改良してみた。これでタイミング・バグはなくなったと思う。たぶん。
タイマーはCTCではなくPWMで使っているのでしょうがないんだけどPWMの2重緩衝機能のお陰で処理タイミング的には少々厳しいものがある...が、不定期に発生する誤動作というやっかいな不具合を防ぐためにもタイミングは見切る必要があるし重要な問題だ。

【サンプル・スケッチ】

【TimerZero.h】

【TimerZero.cpp】

コメントを残す

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

CAPTCHA


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