LECTURE 6 タイマ/カウンタについて

○ はじめに

時間を計る機会というのは身近にたくさんあると思いますが、プログラムで簡単に時間を計測することができると非常に便利です。

ATmega8535 は、3 つのタイマ/カウンタ部を備えています。最大 0xff まで数えることができる 8 ビットタイマ/カウンタx2 と最大 0xffff まで数えることができる 16 ビットタイマ/カウンタx1 です。

これらのタイマ/カウンタ部には、最大値を超えたことを知らせる割り込み(オーバーフロー割り込み)や、指定した値に到達したことを知らせる割り込み(比較一致割り込み)等の機能があります。また、PWM(Pulse Width Modulation)機能もあるため、主にラジコンで使用されるサーボモータを比較的簡単に制御することができます。

ここでは、それら 3 つのタイマ/カウンタ部について概要を説明し、次回以降にて実際にタイマ/カウンタ0 とタイマ/カウンタ1 を使ったサンプルプログラムを作っていきます。タイマ/カウンタ2 は、今のところ使ってみる予定はありません。

○ タイマ/カウンタ0

ATmega8535 のタイマ/カウンタ0の主な仕様は以下の様になります。

  • 8ビットのカウンタレジスタを使用
  • 比較一致によるタイマ/カウンタのクリア
  • 波形生成器による OC0 ピンへの波形出力(可変周波数出力、PWM)
  • オーバフロー割り込みをサポート
  • 比較一致割り込みをサポート

タイマ/カウンタ0 は、8 ビットの TCNT0 レジスタをカウンタとして動作します。後述の動作種別に応じてオーバーフローフラグが設定されると、オーバーフロー割り込みが許可されていればオーバーフロー割り込みが発生します。また、OCR0 レジスタに設定された値と TCNT0 の値が一致した場合、比較一致フラグが設定されます。この時、比較一致割り込みが許可されていれば比較一致割り込みが発生します。

比較一致が発生すると、TCCR0 レジスタ(タイマ/カウンタ0制御レジスタ)の COM01 - COM00 ビットおよび WGM01 - WGM00 の設定に応じて、OC0 ピン(PDIP パッケージの場合は 4 ピン)に波形が出力されます。

タイマ/カウンタ0 の使用に関係するレジスタは、以下となります。

レジスタ名 内容
TCCR0 タイマ/カウンタ0 制御レジスタ
TCNT0 タイマ/カウンタ0
OCR0 タイマ/カウンタ0 比較レジスタ
TIMSK タイマ/カウンタ割り込みマスクレジスタ(タイマ/カウンタ間共通)
TIFR タイマ/カウンタ割り込み要求フラグレジスタ(タイマ/カウンタ間共通)

以下は、TCCR0 の設定に応じたタイマ/カウンタ0 の動作種別です。

  • 標準動作
    • TCNT0 は常に上昇方向にカウントアップ
    • TCNT0 が 8 ビット最大値(0xff) に到達すると次は 0x00 からカウントアップを再開
    • TCNT0 が 0x00 に到達した時にオーバーフローフラグを設定
    • OC0 ピン波形出力を有効にした場合、OC0 ピン出力は比較一致のタイミングで L/H/反転 のいずれか

  • 比較一致タイマ/カウンタクリア(CTC)
    • TCNT0 は常に上昇方向にカウントアップ
    • TCNT0 と OCR0 が一致すると次は 0x00 からカウントアップを再開
    • TCNT0 が 0x00 に到達した時にオーバーフローフラグを設定
    • OC0 ピン波形出力を有効にした場合、OC0 ピン出力は比較一致のタイミングで L/H/反転 のいずれか

  • 高速PWM
    • TCNT0 は常に上昇方向にカウントアップ
    • TCNT0 が 8 ビット最大値(0xff) に到達すると次は 0x00 からカウントアップを再開
    • TCNT0 が 0xff に到達した時にオーバーフローフラグを設定
    • OC0 ピン波形出力を有効にした場合、OC0 ピン出力は比較一致および TCNT0 の 0x00 への到達タイミングで反転

  • 位相基準PWM
    • TCNT0 は 8 ビット最大値(0xff) に到達するまでは上昇方向にカウントアップ
    • TCNT0 は 0xff に到達後 0x00 に到達するまでは下降方向にカウントダウン
    • TCNT0 が 0x00 に到達した時にオーバーフローフラグを設定
    • OC0 ピン波形出力を有効にした場合、OC0 ピン出力は上昇および下降中の比較一致のタイミングで反転

○ タイマ/カウンタ1

ATmega8535 のタイマ/カウンタ1の主な仕様は以下の様になります。

  • 16ビットのカウンタレジスタを使用
  • 2 つの比較出力
  • 捕獲入力
  • 比較一致によるタイマ/カウンタのクリア
  • 波形生成器による OC1A/OC1B ピンへの波形出力(可変周波数出力、PWM)
  • オーバフロー割り込みをサポート
  • 2 つの比較一致割り込みをサポート
  • 捕獲割り込みをサポート

タイマ/カウンタ1 は、16 ビットの TCNT1 レジスタをカウンタとして動作します。後述の動作種別に応じてオーバーフローフラグが設定されると、オーバーフロー割り込みが許可されていればオーバーフロー割り込みが発生します。また、OCR1A/OCR1B レジスタに設定された値と TCNT1 の値が一致した場合、比較一致フラグが設定されます。この時、比較一致割込みが許可されていれば比較一致割り込みが発生します。

比較一致が発生すると、TCCR1A レジスタ(タイマ/カウンタ1制御レジスタA)の COM1A1/COM1A0 - COM1B1/COM1B0 ビット、WGM11 - WGM10 ビットおよび TCCR1B レジスタ(タイマ/カウンタ1制御レジスタB)の WGM13 - WGM12 ビットの設定に応じて、OC1A/OC1B ピン(PDIP パッケージの場合は 19/18 ピン)に波形が出力されます。

ICP1 ピンもしくはアナログ比較器の出力に変化があると、TCNT1 の値が ICR1 レジスタにコピーされ、捕獲割り込み要求フラグが設定されます。捕獲割り込みが許可されていれば捕獲割り込みが発生します。

タイマ/カウンタ1 の使用に関係するレジスタは、以下となります(詳細は次回以降)。

レジスタ名 内容
TCCR1A タイマ/カウンタ1 制御レジスタA
TCCR1B タイマ/カウンタ1 制御レジスタB
TCNT1 タイマ/カウンタ1
OCR1A タイマ/カウンタ1 比較レジスタA
OCR1B タイマ/カウンタ1 比較レジスタB
ICR1 タイマ/カウンタ1 捕獲レジスタ
TIMSK タイマ/カウンタ割り込みマスクレジスタ(タイマ/カウンタ間共通)
TIFR タイマ/カウンタ割り込み要求フラグレジスタ(タイマ/カウンタ間共通)

以下は、TCCR1A/TCCR1B の設定に応じたタイマ/カウンタ1 の動作種別です。

  • 標準動作
    • TCNT1 は常に上昇方向にカウントアップ
    • TCNT1 が 16 ビット最大値(0xffff) に到達すると次は 0x0000 からカウントアップを再開
    • TCNT1 が 0x0000 に到達した時にオーバーフローフラグを設定
    • OC1A/OC1B ピン波形出力を有効にした場合、OC1A/OC1B ピン出力は比較一致のタイミングで L/H/反転 のいずれか

  • 比較一致タイマ/カウンタクリア(CTC)
    • TCNT1 は常に上昇方向にカウントアップ
    • TCNT1 と OCR1A/ICR1 のいずれか(設定依存)と一致すると次は 0x0000 からカウントアップを再開
    • ↑で ICR1 を使う場合、一致時に捕獲割り込み発生
    • TCNT1 が 0x0000 に到達した時にオーバーフローフラグを設定
    • OC1A/OC1B ピン波形出力を有効にした場合、OC1A/OC1B ピン出力は比較一致のタイミングで L/H/反転 のいずれか

  • 高速PWM
    • TCNT1 は常に上昇方向にカウントアップ
    • TCNT1 が設定に応じて 0xff/0x1ff/0x3ff/ICR1/OCR1A のいずれかに到達すると次は 0x0000 からカウントアップを再開
    • TCNT0 が設定に応じて 0xff/0x1ff/0x3ff/ICR1/OCR1A のいずれかに到達した時にオーバーフローフラグを設定
    • ↑で ICR1 を使う場合、一致時に捕獲割り込み発生
    • OC1A/OC1B ピン波形出力を有効にした場合、OC1A/OC1B ピン出力は比較一致および TCNT1 の 0x0000 への到達タイミングで反転、OC1A は他に比較一致のタイミングで反転も有

  • 位相基準PWM
    • TCNT1 は設定に応じて 0xff/0x1ff/0x3ff/ICR1/OCR1A のいずれかに到達するまでは上昇方向にカウントアップ
    • ↑で ICR1 を使う場合、一致時に捕獲割り込み発生
    • TCNT1 は 0x0000 に到達するまでは下降方向にカウントダウン
    • TCNT1 が 0x0000 に到達した時にオーバーフローフラグを設定
    • OC1A/OC1B ピン波形出力を有効にした場合、OC1A/OC1B ピン出力は上昇および下降中の比較一致のタイミングで反転
    • OCR1A/OCR1B(比較一致レジスタ)の更新は最高到達点にて発生

  • 位相/周波数基準PWM
    • TCNT1 は設定に応じて 0xff/0x1ff/0x3ff/ICR1/OCR1A のいずれかに到達するまでは上昇方向にカウントアップ
    • ↑で ICR1 を使う場合、一致時に捕獲割り込み発生
    • TCNT1 は 0x0000 に到達するまでは下降方向にカウントダウン
    • TCNT1 が 0x0000 に到達した時にオーバーフローフラグを設定
    • OC1A/OC1B ピン波形出力を有効にした場合、OC1A/OC1B ピン出力は上昇および下降中の比較一致のタイミングで反転
    • OCR1A/OCR1B(比較一致レジスタ)の更新は 0x0000 にて発生

○ タイマ/カウンタ2

ATmega8535 のタイマ/カウンタ2の主な仕様は以下の様になります。

  • 8ビットのカウンタレジスタを使用
  • 比較一致によるタイマ/カウンタのクリア
  • 波形生成器による OC2 ピンへの波形出力(可変周波数出力、PWM)
  • オーバフロー割り込みをサポート
  • 比較一致割り込みをサポート
  • 時計用外部32KHz水晶によるクロック駆動可能

タイマ/カウンタ2 は、8 ビットの TCNT2 レジスタをカウンタとして動作します。後述の動作種別に応じてオーバーフローフラグが設定されると、オーバーフロー割り込みが許可されていればオーバーフロー割り込みが発生します。また、OCR2 レジスタに設定された値と TCNT2 の値が一致した場合、比較一致フラグが設定されます。この時、比較一致割り込みが許可されていれば比較一致割り込みが発生します。

比較一致が発生すると、TCCR2 レジスタ(タイマ/カウンタ0制御レジスタ)の COM21 - COM20 ビットおよび WGM21 - WGM20 ビットの設定に応じて、OC2 ピン(PDIP パッケージの場合は 21 ピン)に波形が出力されます。

タイマ/カウンタ2 の使用に関係するレジスタは、以下となります。

レジスタ名 内容
TCCR2 タイマ/カウンタ2 制御レジスタ
TCNT2 タイマ/カウンタ2
OCR2 タイマ/カウンタ2 比較レジスタ
TIMSK タイマ/カウンタ割り込みマスクレジスタ(タイマ/カウンタ間共通)
TIFR タイマ/カウンタ割り込み要求フラグレジスタ(タイマ/カウンタ間共通)
ASSR タイマ/カウンタ2 非同期状態レジスタ
SFIOR 特殊I/O機能レジスタ

以下は、TCCR2 の設定に応じたタイマ/カウンタ2 の動作種別です。

  • 標準動作
    • TCNT2 は常に上昇方向にカウントアップ
    • TCNT2 が 8 ビット最大値(0xff) に到達すると次は 0x00 からカウントアップを再開
    • TCNT2 が 0x00 に到達した時にオーバーフローフラグを設定
    • OC2 ピン波形出力を有効にした場合、OC2 ピン出力は比較一致のタイミングで L/H/反転 のいずれか

  • 比較一致タイマ/カウンタクリア(CTC)
    • TCNT2 は常に上昇方向にカウントアップ
    • TCNT2 と OCR2 が一致すると次は 0x00 からカウントアップを再開
    • TCNT2 が 0x00 に到達した時にオーバーフローフラグを設定
    • OC2 ピン波形出力を有効にした場合、OC2 ピン出力は比較一致のタイミングで L/H/反転 のいずれか

  • 高速PWM
    • TCNT2 は常に上昇方向にカウントアップ
    • TCNT2 が 8 ビット最大値(0xff) に到達すると次は 0x00 からカウントアップを再開
    • TCNT2 が 0xff に到達した時にオーバーフローフラグを設定
    • OC2 ピン波形出力を有効にした場合、OC2 ピン出力は比較一致および TCNT2 の 0x00 への到達タイミングで反転

  • 位相基準PWM
    • TCNT2 は 8 ビット最大値(0xff) に到達するまでは上昇方向にカウントアップ
    • TCNT2 は 0xff に到達後 0x00 に到達するまでは下降方向にカウントダウン
    • TCNT2 が 0x00 に到達した時にオーバーフローフラグを設定
    • OC2 ピン波形出力を有効にした場合、OC2 ピン出力は上昇および下降中の比較一致のタイミングで反転

次回以降で、実際にタイマ/カウンタ0 およびタイマ/カウンタ1 を使ってみたいと思います。タイマ/カウンタ2 は、今のところ使ってみる予定はありません。