2024/10/30
小型マイコンATtiny85のタイマー割込みを使ってみた
はじめに
本記事では、ATtiny85のタイマー割込みを使用する方法をまとめています。
プログラムはArduinoを使用しています。
タイマー割込みを使用することで、一定間隔で処理を実行することができるようになります。
ATtiny85は秋月電子で手に入ります。
AVRマイコン ATTINY85-20PU: 半導体 秋月電子通商-電子部品・ネット通販
AVRマイコン ATTINY85-20PU
送料気になる方はamazonでも売っています。
リンク
ATtiny85のタイマー
ATtiny85には、タイマーが2つあります。
Timer/Counter0とTimer/Counter1です。
両方とも8bitになります。
ただし、Timer/Counter0は、Arduinoの関数「millis」や「Delay」に使用されているため、設定を変えるとこれらの関数が使用できなくなってしまいます。
ですので、Arduinoの場合はTimer/Counter1の方を使用する方が良いです。
ATTiny85+Arduinoでのタイマー割込み処理
タイマーを使った割込み処理は、以下のように使用します。
ISR(xxxx)
{
doSomething();
}
xxxxには以下のどれかを入れます。
- TIMER1_OVF_vect:タイマーのオーバーフローを使用
- TIMER1_COMPA_vect:コンペアマッチAを使用
これで、Timer1の該当イベントが発生したタイミングで、何か処理を実行することができます。
オーバーフロー
単純にカウンタがインクリメントされていき、オーバーフローしたら処理を実施する機能です。
Timer1のオーバーフローの時間は、以下のように計算できます。
- タイマーのビット幅:8bit
- タイマークロック:1MHz(デフォルト値、Fuseやレジスタ設定で変更可能)
- オーバーフローする時間:2^8 × 1[us] = 256[us]
よって、オーバーフローイベントで処理を実施すると。256usごとに処理を実施できることになります。
TCCR1 = 0b00000001; // クロック分周なし
ISR(TIMER1_OVF_vect)
{
doSomething();
}
コンペアマッチ
タイマーカウンタが指定した値に達したときに、イベント処理を実施する機能です。
比較値はレジスタで設定します。
比較値の設定は「OCR1A」と「OCR1C」に値を入れます。
TIMSK = 0b01100000; // コンペアマッチを有効
TCCR1 = 0b10000001; // CTCモード、クロック分周なし
OCR1A = 100; // カウンタが100になったらコンペアマッチイベントが発生
OCR1C = 100; // カウンタが100になったらカウンタを0クリアする(要CTCモード設定)
// カウンタが100になったら実施
ISR(TIMER1_COMPA_vect)
{
doSomething();
}
以上です。