2024/10/30

小型マイコンATtiny85のタイマー割込みを使ってみた


はじめに

本記事では、ATtiny85のタイマー割込みを使用する方法をまとめています。
プログラムはArduinoを使用しています。

タイマー割込みを使用することで、一定間隔で処理を実行することができるようになります。

ATtiny85は秋月電子で手に入ります。

送料気になる方はamazonでも売っています。

ATtiny85のタイマー

データシートはこちら

ATtiny85には、タイマーが2つあります。
Timer/Counter0とTimer/Counter1です。
両方とも8bitになります。

ATtiny85の端子情報

ただし、Timer/Counter0は、Arduinoの関数「millis」や「Delay」に使用されているため、設定を変えるとこれらの関数が使用できなくなってしまいます。
ですので、Arduinoの場合はTimer/Counter1の方を使用する方が良いです。

ATTiny85+Arduinoでのタイマー割込み処理

タイマーを使った割込み処理は、以下のように使用します。

ISR(xxxx)
{
    doSomething();
}

xxxxには以下のどれかを入れます。

これで、Timer1の該当イベントが発生したタイミングで、何か処理を実行することができます。

オーバーフロー

単純にカウンタがインクリメントされていき、オーバーフローしたら処理を実施する機能です。
Timer1のオーバーフローの時間は、以下のように計算できます。

よって、オーバーフローイベントで処理を実施すると。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();
}

以上です。




コメント(githubのアカウントが必要です)