ミニヘリのロストブザーを作るため、AVR ATtiny10 のタイマ割り込み設定について調べ、まとめてみた。 tiny10 は米粒ほどの大きさで、ミニヘリに搭載するのに適している。更に tiny13 や tiny2313 のタイマカウンタが 8bit であるのに対して tiny10 は 16bit であり、割り込み発生時間を大きく出来るので使いやすい。
今回使うタイマは、比較一致タイマである。タイマ割り込みに関わるレジスタは TCCR0A・TCCR0B・TIMSK0・OCR0A で、設定は以下のとおり。
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と組み合わせて使用する。
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 をリセット(ゼロに)する。
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のとおり。
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 である。
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 秒毎)
{
// 処理
・
・
}