AVR ATtiny10 タイマ割り込みの設定方法

ミニヘリのロストブザーを作るため、AVR ATtiny10 のタイマ割り込み設定について調べ、まとめてみた。 tiny10 は米粒ほどの大きさで、ミニヘリに搭載するのに適している。更に tiny13 や tiny2313 のタイマカウンタが 8bit であるのに対して tiny10 は 16bit であり、割り込み発生時間を大きく出来るので使いやすい。
今回使うタイマは、比較一致タイマである。タイマ割り込みに関わるレジスタは TCCR0A・TCCR0B・TIMSK0・OCR0A で、設定は以下のとおり。

TCCR0A:タイマ/カウンタ0 制御レジスタA
(Timer/Counter 0 Control Register A)
 7 6 5 4 3 2 1 0
 COM0A1  COM0A0  COM0B1  COM0B0  -  -  WGM01 WGM00
0 0 0 0 0 0 0 0

TCCR0A のCOM0A1・COM0A0、COM0B1・COM0B0 ビットを立てると、カウンタ値溢れや比較一致などの事象でOC0A・OC0BピンがHiやLoを自動で出力する設定となる。この機能は tiny10 のOC0A(1番ピン)・OC0B(3番ピン)に矩形波を出力させる場合に使用する。ここでは入出力用の標準ポートとして使用するので、4~7ビットは「0」に設定する。WGM01・WGM00はカウンタの動作設定に用いられ、TCCR0BレジスタのWGM03・WGM02と組み合わせて使用する。

TCCR0B:タイマ/カウンタ0 制御レジスタB
(Timer/Counter 0 Control Register B)
 7 6 5 4 3 2 1 0
 ICNC0 ICES0 WGM03 WGM02 CS02 CS01 CS00
0 0 0 0 1 1 0 1

WGM03・WGM02・WGM01・WGM00 は矩形波の種別と動作を選択する。組み合わせは表1のとおり。
カウンタの動作は「比較一致タイマ/カウンタ解除(CTC)動作」を使用する。このカウンタ動作は、TCNT0(タイマ/カウンタ)をカウントアップし、OCR0A(比較レジスタ)に設定した値に一致すると TCNT0 をリセット(ゼロに)する。

表1.波形生成種別選択
WGM03~WGM00 タイマ/カウンタ動作種別 TOP値 OCR0x
更新時
TOV0
設定時
0 0 0 0 標準動作 $FFFF 即値   MAX
0 0 0 1  8ビット位相基準PWM動作 $00FF  TOP BOTTOM
0 0 1 0  9ビット位相基準PWM動作 $01FF  TOP  BOTTOM 
0 0 1 1  10ビット位相基準PWM動作 $03FF TOP BOTTOM
0 1 0 0 比較一致タイマ/カウンタ解除(CTC)動作 OCR0A 即値 MAX
0 1 0 1 8ビット高速PWM動作 $00FF TOP TOP
0 1 1 0 9ビット高速PWM動作 $01FF TOP TOP
0 1 1 1 10ビット高速PWM動作 $03FF TOP TOP
1 0 0 0  位相/周波数基準PWM動作  ICR0A  BOTTPM  BOTTOM 
1 0 0 1 位相/周波数基準PWM動作 OCR0A BOTTPM BOTTOM
1 0 1 0 位相基準PWM動作 ICR0 TOP BOTTOM
1 0 1 1 位相基準PWM動作 OCR0A TOP BOTTOM
1 1 0 0 比較一致タイマ/カウンタ解除(CTC)動作 ICR0 即値 MAX
1 1 0 1
1 1 1 0 高速PWM動作 ICR0 TOP TOP
1 1 1 1 高速PWM動作 OCR0A TOP TOP

CS02・CS01・CS00 はシステムクロックを分周してタイマ/カウンタのクロックをを設定する。設定は表2のとおり。

表2.タイマ/カウンタ0 入力クロック選択
CS02 CS01 CS00 意味
0 0 0  停止(タイマ/カウンタ0 動作停止)
0 0 1  分周なし
0 1 0  8分周
0 1 1  64分周
1 0 0  256分周
1 0 1  1024分周

割り込みは、カウンタ動作で発生する事象を捕らえて発生する。TIMSK0(タイマ/カウンタ0 割り込み許可レジスタ)の設定で事象を対応する割り込みが発生する。ビット5:ICIE0 は外部信号を捕獲するのに用いるので使用しない。ビット1:OCIE0A(タイマ/カウンタ0比較A割り込み許可)をセットすると、比較レジスタ OCR0A とタイマ/カウンタ TCNT0 の一致で割り込みが発生する。ビット2:OCIE0B は OCRB と TCNT0 の比較割り込みである。
ビット0:TOIE0 はタイマ/カウンタ TCNT0 の値が溢れると発生する割り込みである。
今回使用する割り込みは OCRA との比較一致なので、ビット1:OCIE0A を設定する。対応する割り込みベクタは TIM0_COMPA である。

TIMSK0:タイマ/カウンタ0 割り込み許可レジスタ
(Timer/Counter 0 Interrupt Register)
 7 6 5 4 3 2 1 0
 - ICIE0 OCIE0B OCIE0A TOIE0
0 0 0 0 0 0 1 0

以上を踏まえ、C言語のソースは次のようになる。

#include <avr/io.h>
#include <avr/interrupt.h>

int main(void){
    cli();               // 割り込み禁止
    // タイマー割り込み設定
    TCCR0A = 0b00000000; // 標準動作
    TCCR0B = 0b00001101; // 1024分周
    OCR0A = 488;         // 1,000,000÷1024×0.5 = 488 0.5 秒毎に割り込み
    TIMSK0 = 0b00000010; // タイマカウンタ0比較A割り込み許可
    sei();               // 割り込み許可
    ・
    ・
}

ISR(TIM0_COMPA_vect)
// タイマー割り込み(約0.5 秒毎)
{
    // 処理
    ・
    ・
}

シェアする

  • このエントリーをはてなブックマークに追加

フォローする