AVRでタイマ割り込みを使う

AVR(ATtiny2313)のタイマ割り込みを使ってLチカした。

PB0~PB3のLEDが約250ms毎に点滅する。

プログラム

.include "tn2313def.inc"

.cseg
.org 0
    rjmp setup
.org 6
    rjmp of0

setup:
    ldi  r16,RAMEND
    out  SPL,r16
    ldi  r16,0b0000_1111
    out  DDRB,r16
    ldi  r16,0
    out  TCCR0A,r16
    ldi  r16,(1<<CS02)|(1<<CS00)
    out  TCCR0B,r16
    ldi  r16,1<<TOIE0
    out  TIMSK,r16
    ldi  r16,0
    sei
loop:
    out  PORTB,r16
    rjmp loop

of0:
    com  r16
    reti

レジスタ

  • TIMSK...タイマ/カウンタ割り込み許可レジスタ

  • OCIEnx...タイマ/カウンタn比較x割り込み許可ビット

  • TOIEn...タイマ/カウンタnオーバーフロー割り込み許可ビット

  • ICIE1...タイマ/カウンタ1キャプチャ割り込み許可ビット

name\bit 7 6 5 4 3 2 1 0
TIMSK TOIE1 OCIE1A OCIE1B - ICIE1 OCIE0B TOIE0 OCIE0A

ニモニック

  • sei...全体割り込み許可フラグを設定

  • reti...割り込みから復帰し、sregのIビットを設定(1にする)

メモ

.org 6でタイマ/カウンタ0オーバーフロー割り込みベクタに登録。

clk=1MHzが1024周分され、TCNT0のオーバーフロー割り込みによって256秒毎にON、OFFとなるので、更に512分周される。

(1M/1024)/512=約2HzでLEDが点滅する。