使用するタイマ
使用するMCU ATmega324に搭載されている3つのハードウェアタイマの用途は以下。
タイマ名 | サイズ | 用途 |
---|---|---|
Timer 0 | 8ビット | インターバルタイマ ディスプレイ/キーパッドスキャン ディスプレイ輝度制御 |
Timer 1 | 16ビット | PWMサウンドの発生 |
Timer 2 | 8ビット | ユーザに解放 |
インターバルタイマ(正確な1/1000秒間隔をつくる)
WOBではインターバルタイマは正確に1/1000秒間隔としたい。本家Arduinoでは「1.024ms」間隔であって正確な1/1000秒=1msではないためである。
1/1000秒間隔すなわち目標割り込み頻度 fi = 1000Hzを作り出すために、システムクロック=I/Oクロック=20MHz、タイマプリスケーラを256分周にセットすると、タイマカウンタの入力クロック fc は
fc = 20e6 / 256 = 78125Hz
となり、これにより駆動されるカウンタの周期カウントCは
C = fc / fi = 78125 / 1000 = 78.125[カウント]
と半端な値になり、このままではジャスト fi にはできない。そこで一定期間内の平均値が fi に等しくなるようカウンタを動的に制御して周期を調整する。0.125 = 1 / 8 であることを利用し、次のようにする。
78カウント * 7回 + 79カウント * 1回 = 625 = 78.125 * 8回
カウンタが8回回れば平均して fi に等しくなる。タイマ割込みがかかるたび、次の割込みまでのカウントを78または79に設定しなおせばよい。78カウントをA、79カウントをBとすればそのシーケンスは
A A A A A A A B (Aが7回、Bが1回の出現頻度)
となる。78や79という値は8ビットのタイマにちょうどフィットするのもいい。8回回るまでの平均期間未満では78や79で作られる「ゆらぎ」を生じるが、それは
(79 - 78) / 78 ≒ 1.3%
程度である。