プログラミングと工作と

PythonとかPascalとかAVRマイコンとか、コンパイラつくったり電子工作なんかを楽しんでいるおっさんの記録

AVRマイコン アセンブリ言語入門 ― 8bitタイマその2

前回、タイマ動作はクロックのパルスの数を数えて「一定の時間」を生み出すと説明しました。
今回、ここの部分を具体的に説明します。

タイマ動作の「一定の時間」は、次の項目により決定します。

  1. クロック
  2. プリスケーラ
  3. 比較レジスタ(OCRnA)

1のクロックは、言うまでもなくマイコンの動作周波数ですね。
ATmega168Pは、何も設定しない場合、内部発振の1MHzで動作します。
外部にX'tal発振子を付けたりして利用する場合は、その周波数が基準になります。
今回は、デフォルトの1MHzで動作させます。

 

2のプリスケーラとはなんでしょうか?
日本語で言うと分周器ってことでいいのかな?クロックの周波数を半分に、そのまた半分に・・・と、遅くしていくことが出来ます。
フリップフロップというデジタル回路をググれば仕組みもわかると思います。
なんで遅くするかというと、長い時間を作り出すためです。


具体的に考えてみます。
今回の1MHzのパルスひとつの時間は、1/1MHz = 1μs です。
これを100個数えたら100μs = 0.1ms = 0.0001秒です。
で、プリスケーラを使って分周すると、
1/2ならクロックのパルスが2μs、
1/1024なら1024μs = 1.024msになったのと等しくなります。
これらを100個数えたら、1/2の場合200μs、1/1024の場合102.4ms = 0.1024秒になります。
同じ100個のパルスを数えても、0.1msから102.4msまで増えました。


ちなみに、ATmega168Pは2つの8bitタイマを持っていて、それぞれタイマ0とタイマ2と名前がついています。
タイマ1はどこにいったと思われるかもですが、16bitタイマとして君臨しています。
使い方は8bitタイマとほぼ同じなので、8bitがわかれば怖くありません。


で、このタイマ0とタイマ2でプリスケーラの設定値が違います。
タイマ0は1・8・64・256・1024分の一が
タイマ2は1・8・32・64・128・256・1024分の一が選べます

 

3の比較レジスタは、プリスケーラからのパルスを何個数えるのかという値を入れるレジスタです。
8bitタイマと言う名称は、このレジスタが8bitになっているから付けられた名前なのです。
8bitということは、十進数でいうと256まで数えることができます。
ちなみにタイマ1の16bitタイマとは、このレジスタが16bitになっただけです。

 

 

さて、プリスケーラと比較レジスタを使った最大カウント数を考えてみます。
クロックを1MHzとすると、1μs × 1024 × 256 = 256ms となります。
クロックを最大の20MHzとするとクロックひとつは1/20MHz = 0.05μs なので
0.05μs × 1024 × 256 = 約13.1ms になります。

このように、プリスケーラと比較レジスタの値を組み合わせて「一定の時間」を作り出します。

 

うすうす感づいている方もいると思いますが、例えばクロック1MHzでピッタリ100msの間隔がほしいと思ってもできません。
プリスケーラを1024、比較レジスタを97にして99.328ms、98で100.352msです。
こういう場合、近い値で妥協するか、「ぴったりじゃなきゃダメなんだよ!」と言うのであればクロック動作周波数を変更する必要があります。

 

次回は、8bitタイマを使う時に使用する各種レジスタについて説明したいと思います。