タイマー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
タイマー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) ;
}
レジスタ設定
レジスタ設定は タイマーのレジスタを参照
- twtter
- google+
- hatena