AVRのタイマー
AVRのタイマー機能は少しだけPICとかと違うところがあります。
タイマー、カウンタ、PWM の設定
|
AVRのタイマー
ATtiny2313しか使ってないのですが、AVRのタイマーはほぼ同等の8ビットのタイマ0 と16ビットのタイマ1があり
(タイマー1にはインプットキャプチャがあり)
カウンタTCNTはタイマ0,1共にに リード、ライト可能、PWM波形生成などがあり、幅広い設定のできるタイマー機能を持っています。その分、設定が複雑なので分類してみました。
タイマー分類
AVRのタイマーはデータシートでは主に4つのモードがあります。 標準、CTC、位相基準PWM、高速PWM
4つでは少しわかりにくいので、機能から大きく3つに分類しました (標準、 CTC)、位相基準PWM、高速PWM
(以下データシート用語で カウンタ満タン=Top値)
* 設定については 下 タイマーレジスタ表 を参照
【タイマー0モード設定】 TCCR0A TCCR0B で設定する
WGM02 |
WGM0 |
WGM00 |
- |
- |
0 |
0 |
0 |
標準モード |
【オーバーフローでタイマを使う】
カウンタ値Top =FF となり
これを超えるとまた一回りして0から。
この0になるとき
オーバーフローフラグ:TOV0=は1に。
|
0 |
1 |
0 |
CTC |
【満タン値(Top値)を設定して使う】
カウンタTCNT0 と OC0A が一致(コンペアマッチ)で
カウンタTCNT0は0クリアされる
OCF0Aフラグで割り込み設定する
|
0 |
0 |
1 |
位相基準PWM |
【PWMでタイマを使う】
WGM02 = 0 で
カウンタTop (最大値)= FF(満タン)
WGM02 = 1 で
カウンタTop(最大値) = OC0A
|
1 |
0 |
1 |
位相基準PWM |
0 |
1 |
1 |
高速PWM |
1 |
1 |
1 |
高速PWM |
・標準的タイマー
主に普通のカウンタとしてで動作させるようなモード
・CTC
Top値=OCR0A 設定 (Top値=満タン値 をOCR0Aで設定して使う)
この2つのモードの違いは Top値=オーバーフロー(FF) か Top値=OCR0A の違いといえそう。
(CTCモードではオーバーフロー割り込みはできないようで、満タン(OCR0A) として使用するモード)
標準モードだと、カウンタ満タン時(オーバーフロー)で
使用するには カウンタが 仮に満タン=10秒だとすると
仮に 周期 2秒間隔で使うには
スタート=8にして動かすような使い方
周期で割り込み の場合はオーバーフロー割り込み
|
CTCモードは 満タン時が設定できるので
仮に 周期 2秒間隔で使うには
カウンタが スタート=0
満タン=2秒 (OCR0A=2秒に設定)
周期で割り込み の場合は Top値=OCR0A なので
満タン(=OCR0A)で マッチA割り込み
|
CTCモードで、そういうちょと使いやすい設定が可能な感じです
CTCモード チャート (データシートより)

また、OCn×でピン出力方式をトグル設定すると、波形出力も可能です。
割り込みは TIFRレジスタの
オーバーフロー TOV0
マッチA OCF0A などが要因発生でビットが1になり
割り込み関数実行後には 自動的に 0クリアされる
・高速PWM
一般的なPWMモード
高速PWMはのこぎり波
高速PWM と 位相基準PWM の違いは
高速PWMはのこぎり波を扱うのに対し、位相基準PWMは三角波を扱うといえる。
また WGM02 (TCCR0Bレジスタ) にて
Top値=FF(カウンタ満タン) か Top値=OCR0A(満タン:OCR0A) で使用かを設定
高速PWMモード チャート (データシートより)

・位相基準PWM
位相基準PWMは、カウンタがいっぱいになると、減算して下り始める 三角波になる
単純に周期を高速PWMの2倍にすることが出来る
この2つ 高速PWM と 位相基準PWM の違いは
高速PWMはのこぎり波を扱うのに対し、位相基準PWMは三角波を扱うといえる。
また WGM02 (TCCR0Bレジスタ) にて
Top値=FF(カウンタ満タン) か Top値=OCR0A(満タン:OCR0A) で使用かを設定
位相基準PWMモード チャート (データシートより)

タイマー関連レジスタ
タイマー0の設定は TCCR0A TCCR0Bに混在している。
●TCCR0A タイマ0設定レジスタ
波形出力
コンペアマッチA |
波形出力
コンペアマッチB |
- |
- |
タイマモード設定 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
COM0A1 |
COM0A0 |
COM0B1 |
COM0B0 |
- |
- |
WGM01 |
WGM00 |
コンペアマッチで
波形出力選択 |
コンペアマッチで
波形出力選択 |
|
|
標準 CTC
位相基準PWM
高速PWM
|
●TCCR0B タイマ0設定レジスタ
OC0A,B強制変更 |
- |
- |
Top設定 |
クロック設定 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
FOC0A |
FOC0B |
- |
- |
WGM02 |
CS02 |
CS01 |
CS00 |
強制コンペアマッチ
非PWMモード時のみ有効 |
Top値 = 満タンか
= OC0Aの選択 |
クロック分周選択 |
●TIMSK 割り込み設定レジスタ タイマ0,1混在
タイマー1の設定 |
タイマー0の設定 |
オーバー
プロー |
コンペア
マッチA |
コンペア
マッチB |
|
インプット
キャプチャ |
コンペア
マッチB |
オーバー
プロー |
コンペア
マッチA |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
TOIE1 |
OCIE1A |
OCIE1B |
- |
ICIE1 |
OCIE0B |
TOIE0 |
OCIE0A |
●TIFR 割り込み要求レジスタ タイマ0,1混在
タイマー1の設定 |
タイマー0の設定 |
オーバー
プロー |
コンペア
マッチA |
コンペア
マッチB |
|
インプット
キャプチャ |
コンペア
マッチB |
オーバー
プロー |
コンペア
マッチA |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
TOV1 |
OCF1A |
OCF1B |
- |
ICF1 |
OCF0B |
TOV0 |
OCF0A |
設定方法 タイマー関連レジスタ
【タイマー0設定】
●TCCR0A タイマ0設定レジスタ表
PWM 波形出力
コンペアマッチA
(出力ピン OC0A) |
PWM 波形出力
コンペアマッチB
(出力ピン OC0B) |
- |
- |
タイマモード設定 |
タイマモード |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
COM0A1 |
COM0A0 |
COM0B1 |
COM0B0 |
- |
- |
WGM01 |
WGM00 |
|
マッチA,B共、ビット設定方法は同じ |
- |
- |
0 |
0 |
標準 |
0 |
1 |
コンペアマッチでトグル出力
|
- |
- |
1 |
0 |
CTC |
1 |
0 |
コンペアマッチでLow
|--___|
|
- |
- |
0 |
1 |
位相基準PWM |
1 |
1 |
コンペアマッチでHigh
|___--| |
- |
- |
1 |
1 |
高速PWM |
0 |
0 |
波形出力なし |
|
|
|
|
|
COM0A1 |
COM0A0 |
COM0B1 |
COM0B0 |
ここに1が一つでも設定されると、その通常のIOポートの機能は無効にされ、タイマ動作用IOになる
出力ピン OC0A、 OC0B
* タイマからピン出力するには DDRレジスタでピンを出力設定にする必要あり
●TCCR0A タイマ0設定レジスタ
波形出力
コンペアマッチA |
波形出力
コンペアマッチB |
- |
- |
タイマモード設定 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
COM0A1 |
COM0A0 |
COM0B1 |
COM0B0 |
- |
- |
WGM01 |
WGM00 |
コンペアマッチで
波形出力選択 |
コンペアマッチで
波形出力選択 |
|
|
標準, CTC
位相基準PWM
高速PWM |
|
●TCCR0B タイマ0設定レジスタ
OC0A,B強制変更 |
- |
- |
Top設定 |
クロック設定 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
FOC0A |
FOC0B |
- |
- |
WGM02 |
CS02 |
CS01 |
CS00 |
強制コンペアマッチ
非PWMモード時のみ有効 |
Top値=満タンか
=OC0Aの選択 |
クロック分周選択 |
|
●TCCR0B タイマ0設定レジスタ表
OC0A,B強制変更
強制コンペアマッチ
非PWMモード時のみ有効 |
- |
- |
Top設定 |
クロック設定 |
|
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
FOC0A |
FOC0B |
- |
- |
WGM02 |
CS02 |
CS01 |
CS00 |
|
|
- |
- |
標準
CTCモードでは必ず 0 |
0 |
0 |
0 |
タイマ停止 |
|
- |
- |
0 |
0 |
1 |
プリスケーラなし |
|
- |
- |
位相基準PWM
高速PWM モードで
WGM02 = 0 で
カウンタTop (最大値)= FF(満タン)
WGM02 = 1 で
カウンタTop(最大値) = OC0A
|
0 |
1 |
0 |
1/8 |
|
- |
- |
0 |
1 |
1 |
1/64 |
|
- |
- |
1 |
0 |
0 |
1/256 |
|
- |
- |
1 |
0 |
1 |
1/1024 |
|
- |
- |
1 |
1 |
1 |
T0ピンからの外部クロック
(立ち下がり |
|
- |
- |
1 |
1 |
1 |
T0ピンからの外部クロック
(立ち上がり |
タイマー停止、開始は 設定ビットの
TCCR×B= の分周設定ビットを すべて000 →停止
分周設定 →開始 とするようです。
割り込み
オーバーフロー、マッチA、マッチBで それぞれ独立した割り込みベクタ
●割り込み設定レジスタ
割り込み処理をしたいとき対応ビットを設定する
●TIMSK 割り込み設定レジスタ タイマ0,1混在
タイマー1の設定 |
タイマー0の設定 |
オーバー
プロー |
コンペア
マッチA |
コンペア
マッチB |
- |
インプット
キャプチャ |
コンペア
マッチB |
オーバー
プロー |
コンペア
マッチA |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
TOIE1 |
OCIE1A |
OCIE1B |
- |
ICIE1 |
OCIE0B |
TOIE0 |
OCIE0A |
ICF1 : インプットキャプチャ割り込み許可 (インプットキャプチャは タイマー0にはない)
WGM13-10でTOP値に設定の場合 カウンタ値=TOPで このフラグが 1
●割り込みフラグのレジスタ
通常は手動で設定はしないレジスタ。
割り込み要因で1がセットされ、対応する割り込み処理ベクタを実行すると自動で0クリアされる
●TIFR 割り込み要求レジスタ タイマ0,1混在
タイマー1の設定 |
タイマー0の設定 |
オーバー
プロー |
コンペア
マッチA |
コンペア
マッチB |
- |
インプット
キャプチャ |
コンペア
マッチB |
オーバー
プロー |
コンペア
マッチA |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
TOV1 |
OCF1A |
OCF1B |
- |
ICF1 |
OCF0B |
TOV0 |
OCF0A |
インプットキャプチャ関連レジスタ
●TCCR1B タイマ0設定レジスタ
|
- |
- |
|
クロック設定 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
1CNC1 |
1CES1 |
- |
WGM13 |
WGM12 |
CS12 |
CS11 |
CS10 |
1CNC1 : インプットキャプチャノイズ消去許可
ここが1設定で、ノイズ消去器を有効に。
ノイズ消去は連続4回同じ入力の場合にその入力を得る。このため4回で1入力となり遅れがでる。
1CES1 : インプットキャプチャ エッジ選択
0:立ち下がり
1:立ち上がり
ここの設定に従ってインプットキャプチャがトリガされると、タイマカウンタ値が インプットキャプチャレジスタ(ICR1)へコピーされる
|