szty's diary

電子工作、プログラミングなど

AVRでタイマを使う

AVR(ATtiny2313)のタイマ/カウンタ0を使った。

タイマ/カウンタ0の動作モードには

  1. 標準
  2. CTC (Clear Timer on Compare Match)

がある。

これらの動作モードの時、タイマ/カウンタ0は

  1. 0xFF
  2. OCR0A (0x00~0xFF)

までの値をカウントすることができる。

各モードの様子をLEDを使って確認した。

標準モードではPB0~PB3のLED、CTCモードではPB0~PB2のLEDが点滅する。

プログラム

  • 標準モード
.include "tn2313def.inc"

.cseg
.org 0
    rjmp setup

setup:
    ldi  r16,0b0000_1111
    out  DDRB,r16
    ldi  r16,0
    out  TCCR0A,r16
    ldi  r16,(1<<CS02)|(1<<CS00)
    out  TCCR0B,r16
loop:
    in   r16,TCNT0
    lsr  r16
    lsr  r16
    lsr  r16
    lsr  r16
    out  PORTB,r16
    rjmp loop
  • CTCモード
.include "tn2313def.inc"

.cseg
.org 0
    rjmp setup

setup:
    ldi  r16,0b0000_1111
    out  DDRB,r16
    ldi  r16,1<<WGM01
    out  TCCR0A,r16
    ldi  r16,(1<<CS02)|(1<<CS00)
    out  TCCR0B,r16
    ldi  r16,0b0111_1111
    out  OCR0A,r16
loop:
    in   r16,TCNT0
    lsr  r16
    lsr  r16
    lsr  r16
    lsr  r16
    out  PORTB,r16
    rjmp loop

レジスタ

  • TCCR0x...タイマ/カウンタ0制御レジスタ

  • OCR0x...タイマ/カウンタ0比較レジスタ

  • TCNT0...タイマ/カウンタ0

  • FOC0x...非PWM動作の時だけ有効。1で比較一致が強制される

name\bit 7 6 5 4 3 2 1 0
TCCR0A COM0A1 COM0A0 COM0B1 COM0B0 - - WGM01 WGM00
TCCR0B FOC0A FOC0B - - WGM02 CS02 CS01 CS00
COM0A1 COM0A0 動作
0 0 標準ポート
COM0B1 COM0B0 動作
0 0 標準ポート
WGM02 WGM01 WGM00 動作
0 0 0 標準
0 1 0 CTC
CS02 CS01 CS00 動作
1 0 1 clk/1024

ニモニック

  • lsr...汎用レジスタの値を右へ1bitシフトする

メモ

カウンタの0~3bit目では速すぎて変化が見られないので、右へ4bitシフトした。

また、変化が見やすいようにTCCR0Bでclkを1024分周し、可能な限りclkを遅くした。