Hatena::ブログ(Diary)

hijouguchiの日記

2010-06-20

タイマ0カウンタモード

| 10:36 |

 I/Oポートの次はタイマです。ATTiny2313にはtimer0とtimer1(それぞれ8bitと16bit)のタイマがありますが、ここではtimer0のオーバーフロー割り込みに絞って書いておきます。


対象マイコン

 タイマ自体はほとんどが対応してますが、種類によっては使えないタイマがあるので注意が必要です。今回もATTiny2313を前提として書きます。


割り込み

 タイマの前に割り込みが必要になってくるので先に。割り込みにはタイマによる割り込み・外部割り込みなどがあります。これらは割り込みベクタに登録されてて、ATTiny2313には21個あるようです。割り込みを使うにはinterrupt.hをインクルードします。

 割り込みが使えるようになるには

をやっていくことになります。因みにsei()に対して、全割り込みを禁止するにはcli()があります。

no title


timer0概要

 基本的には、タイマを動かしてカウンタ内容を読み込む、オーバーフローや比較一致で割り込みをさせるという事をさせることが多いです。

レジスタ名前
TCCR0タイマ/カウンタ コントロールレジスタ
TCNT0タイマ/カウンタ レジスタ
OCOR0アウトプット コンペア レジスタ
TIMSKタイマ/カウンタ 割り込みマスクレジスタ
TIFRタイマ/カウンタ 割り込みフラグ レジスタ

 とりあえずTIFRに付いては省略します。

 TNCT0にカウンタの値が記録されていて、書き込んで値を変えることも可能です。OCOR0の値とTCNT0の値が一致したとき、あるいはTNCT0がオーバーフローしたときに(割り込みが許可されていれば)割り込みが起こります。


TCCR0 (ATTiny2313)

 今のところATTiny2313でしか調べてません。

 TCCR0は二つあります。


TCCR0

レジスタ76543210
TCCR0ACOM0A1COM0A0COM0B1COM0B0--WGM01WGM00
TCCR0BFOC0AFOC0B--WGM02CS02CS01CS00


TCCR0BレジスタのCS02, CS01, CS00でタイマのクロックを選択出来ます。


クロック選択

CS02CS01CS00クロック
000停止(カウンタが止まってる状態)
001分周無し
0108分周
01164分周
100256分周
1011024分周
110T0ピンの立ち下がり
111T0ピンの立ち上がり

timer0割り込み関係

 TIMSKから設定します。


TIMSK (ATTiny2313)

レジスタ76543210
TIMSKTOIE1OCIE1AOCIE1B-ICIE1OCIE0BTIOE0OCIE0A

timer0で使うbitはOCIE0A, OCIE0B, TIOE0。それぞれ対応する割り込み名は


レジスタSIG_NAMEdescription
OCIE0AIMER0_COMPA_vectOCOR0A一致割り込み
OCIE0BIMER0_COMPB_vectOCOR0B一致割り込み
TIOE0TIMER0_OVF_vectタイマ/カウンタ オーバーフロー割り込み

となっています。


サンプルコード

f:id:hijouguchi:20100625180531p:image

/*
 * タイマを使ってPD6を反転させる
 * 8MHzで1024分周ならおよそ110ms周期で点滅
 */
#include <avr/io.h>                                                                                                                                                                 
#include <avr/interrupt.h>

/* 割り込みハンドラ設定(タイマ0オーバーフロー) */
ISR(TIMER0_OVF_vect)
{
  PORTD ^= (1<<PD6); // PD6反転
}

int main(void)
{
  /* PD6を出力L設定 */
  DDRD  =  (1<<PD6);
  PORTD = ~(1<<PD6);

  TIMSK  = (1<<TOIE0); // タイマ0のオーバーフロー割り込み許可
  TCCR0B = 0x05;       // 1024分周でカウントスタート

  sei();               // 全体の割り込み許可

  while(1);
  return 0;
}

詳しくは

no title

ATTiny2313データシート http://www.atmel.com/dyn/resources/prod_documents/doc8246.pdf

Connection: close