タイマーで正確な時間稼ぎをする(タイマー0 オーバーフロー)

AVR2313

AVRのタイマー実験を タイマー0 標準モードで使う。


AVR ATTiny2313には タイマー0と1があります。 タイマー0で時間間隔を作る
いろんなタイマーのモードを使うとだいたい機能がわかります。AVRのタイマーは慣れるといろんな設定のでき機能のあるタイマーのようです。

タイマー0のオーバーフローで時間間隔をつくる

LED SW入出力テストと同じ (内部発振8MHz動作)

出力 入力(使用せず)
PD4--LED     PD2--SW(ON=GND
PD5--LED     PD3--SW(ON=GND

 

 

 

 

プログラム

 

もともとの初期設定=工場出荷時で実行しました。プログラムは以前つくったものなので周波数、設定などのコメントが違うことあり

 

ファイル名


 

#include 

void T0wait(unsigned char ms){          //ms回オーバーフローを繰り返すウエイト

        unsigned char i;

        for( i=0; i< ms; i++ ){                          //オーバーフロー回数
                while( bit_is_clear(TIFR,TOV0) );               //オーバーフローになるまで待つ
                        TIFR  = _BV(TOV0);                              // 検知フラグを戻して再開
        }
}

int main(){

        DDRD = 0xFF;            // ポートDを全部出力設定
        TCCR0B = 0x05;          // プリスケーラは ck/1024
    TCNT0 = 0;    // タイマ0の初期値


        while (1) {

                PORTD=0x10;             //PORTD出力 LED#4点灯 #5消灯 0001 0000
                T0wait(5);              // (1/8M)×1024×256 ×4   s

                PORTD=0x20;             //PORTD出力 LED#4消灯 #5点灯 0010 0000
                T0wait(5);
        }
}
       

 

●動作

PD4-LED4 、PD5-LED5 が遅い間隔(オーバーフロー時間稼ぎ)で交互に点灯

 

タイマー0 標準モード

原理は 3664Fで始めるH8

タイマーで正確な時間稼ぎをする(タイマーA) と同様

 

タイマー0は満タンで255の8ビットのタイマー。(タイマー1は16ビット)
オーバーフローすると 1となる タイマー0レジスタのビットTOV0 を監視して 満タン(255)になったことを得る
T0wait(5); で 4回までの満タンの時間稼ぎをする。

 

タイマーレジスタ設定は
TCCR0Bにクロック分周の設定 1/1024 とカウンタ初期化してあるだけです。
これで動きます。

 

オーバーフロー間隔は
内部発振8MHz動作の 1/1024 なので  これを255回カウントで 約0.13s
これを4回カウントする時間稼ぎ間隔

 

タイマー0 標準モード

続いて、オーバーフローを割り込みで検知して時間間隔を得る オーバーフロー割り込み  これも 原理は 3664Fで始めるH8
タイマーで正確な時間稼ぎをする(タイマーA) と同様

 

タイマー0は満タンで255の8ビットのタイマー。(タイマー1は16ビット)
オーバーフローすると 1となる タイマー0レジスタのビットTOV0 を監視して 満タン(255)になったことを得る
T0wait(5); で 4回までの満タンの時間稼ぎをする。

 

タイマーレジスタ設定は
TCCR0Bにクロック分周の設定 1/1024 とカウンタ初期化してあるだけです。これで動きます。

 

オーバーフロー間隔は
内部発振8MHz動作の 1/1024 なので  これを255回カウントで 約0.13s
これを4回カウントする時間稼ぎ間隔

 

タイマーで正確な時間稼ぎをする

続いて、オーバーフローを割り込みで検知して時間間隔を得る オーバーフロー割り込み

 

(タイマー0 標準モード オーバーフロー割り込み)


これも原理は

 3664Fで始めるH8
タイマーで正確な時間稼ぎをする(タイマーA割り込み) と同様

 

ファイル名




#include	
#include	

enum {	LED4=0,
		LED5=1 };		// シンボル定義
unsigned char f;		//フラグ

ISR(TIMER0_OVF_vect) {		//Tmr0割り込み関数

	if( f==LED4 ){
		PORTD=0x10;		//PORTD出力 LED#4点灯 #5消灯 0001 0000
		f=LED5;
	}else{
		PORTD=0x20;		//PORTD出力 LED#4'消灯' #5'点灯' 0010 0000
		f=LED4;
	}
}

int main(){

	DDRD = 0xFF;		// ポートDを全部出力設定
	TCCR0B = 0x05; 		// プリスケーラは 1/1024
    TCNT0 = 0;    		// タイマ0の初期値
	TIMSK = _BV(TOIE0);	// タイマ0オーバーフローだけ割り込み許可

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

	while (1) ;
}
  

 

レジスタ設定

レジスタ設定は タイマーのレジスタを参照

 

スポンサーリンク
  • facebook
  • twtter
  • google+
  • hatena