05. タイマー割り込み
事前知識
タイマー割り込みとは
タイマー割り込みとは、マイコン内蔵のタイマーが発火したときメインループを中断して任意の処理を行うことができる機能である。
タイマーについて
ATmega328P は 8 ビットの Timer0、16 ビットの Timer1、8 ビットの Timer2 を持つ。
タイマーはそれぞれクロックが入るたびに 1 だけカウントしていき、オーバーフローしたら割り込みが入る。(後述する CTC を使う場合は CTC の設定値を超えたときに割り込みが入る。)
クロック周波数 16Mhz で 8 ビットのタイマーを使ったとき、カウンターの最大値は \(2^8\) なので 16us 間隔の発火になる。
タイマー割り込みの間隔をもっと短くしたい場合は CTC を使えば良い。
タイマー割り込みの間隔をもっと長くしたい場合は 16 ビットのタイマーを使うなり、後述するプリスケーラを使えば良い。
CTC
通常タイマーはカウンターがオーバーフローしたら発火するが、CTC(Counter Timer Circuit)という方式を使うとカウンターが一定の値になったときに割り込みを発火させることができる。これを使って割り込み間隔を細かくできる。
プリスケーラ
プリスケーラを使うとタイマーのカウンターを遅らせることができる。ATmega328P では 8 分割、64 分割、256 分割、1024 分割に対応している。8 分割だと8 数えるたびにタイマーをカウントするみたいな感じになる。
実装例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | |
なおcli()を呼ぶと割り込みを無効にできる。
出力波形
16us で割り込みが入っていることが分かる。
割り込み間隔を短くしてみる
OCR0Aを小さくすることで割り込み間隔を短くできる。
OCR0A=0x7F(127)
8us。OK。
OCR0A=0x3F(63)
4us。OK。
OCR0A=0x1F(31)
2us になるはずだが、やや遅れてしまっている。
OCR0A=0x0F(15)
1us になるはずだが、もはや追従していない。
まとめ
タイマー割り込みを使うとより制御の幅が広がる。
ただしタイマー割り込みの処理にも限界がある。単純なパルス生成は 4us が限界である。
割り込みにパルス生成以外もやらせようとしたらさらに限界が下がることを理解しておく必要がある。




