見出し画像

ATMEGAで学習しよう(レッスン3)

「8 ビットタイマ(ノーマルモード)」


<目的>
・8 ビットタイマ(ノーマルモード)の時間生成方法について学ぶ。

<動作概要>
・SW1 が押されたらLED1 を約0.2 秒毎に点滅させる。(外部割り込み0)
・SW2 が押されたらタイマを停止する。停止タイミングにより点灯か消灯になる。(外部割り込み1)

<ポイント>
・タイマの停止と起動はプリスケーラ設定で行う。
・希望時間を得るため、タイマ割込みがかかるたびにカウント値をセットする必要がある。
・1 クロック x CKDIV 値(ヒューズビット) x プリスケーラ毎にカウントアップする。
・カウンタの最大値は0xFF であり、その次のカウントアップで0x00 にクリアされカウントアップが継続する。
・よってカウンタを0x00 にセットしたときに最も長い時間を得る。

<レジスタ説明>

このマイコンにはタイマ0、タイマ1、タイマ2 の3 つのタイマが用意されており、8 ビットタイマにはタイマ0 とタイマ2 がありますが、今回はタイマ0 を使用します。
タイマ2 はレッスン15「PWM 制御」で出てくるので、興味のある方はそちらを参照下さい。
外部割込み関連 レジスタ設定はレッスン2 を参照下さい。
タイマ0 関連のレジスタ設定をします。

本基板の動作クロックは1MHz なので、1 クロックの時間は1/1MHz=1/1000000=0.000001 秒です。
本プログラムでは0.2 秒毎に割り込みをかけたいので、クロックを200,000 倍する必要があります。
注意することが2 つあります。
(注意1)
TCNT0 は8 ビットレジスタなので、設定できる値は最大でも2 の8 乗-1 の255 です。
200,000 倍には全然足りません。
そこで、プリスケーラレジスタTCCR0B の登場です。
CS02,CS01,CS01 ビットの組み合わせでクロックを何倍してタイマ0 用のクロックにするかを選びます。
ここでは、1024 倍にするので、CS02,CS01,CS01 ビットを1,0,1 にします。
つまり、TCCR0B は16 進数表記で0x05 となります。(2 進数表記の0b00000101 でも構いません)
これで、タイマ0 用のクロックは、0.001024 秒になりました。
また、CS02,CS01,CS01 ビットが0,0,0 だと、タイマが停止します。
(注意2)
タイマ0 プリスケーラ値 x TCNT0 = 200,000 になるように、TCNT0 を設定します。
しかし、TCNT0 = 200,000/タイマ0 プリスケーラ値 = 200,000/1024 = 195 ・・・としてはいけません。
TCNT0 = 256-(200,000/1024) = 61 とする必要があります。
というのも、TCNT0 はタイマ0 用クロックの度に+1 され、8 ビットの最大値255 になった次のタイマ用0 用クロックでオーバーフローが発生して割込み条件が満たされるからです。
195 と設定してしまうと、(256–195) x 0.00124 = 61 x 0.00124 = 0.07564 秒の割り込み時間となってしまいます。
TCNT0 を61 に設定すれば、(256-61) x 0.00124 = 0.19968 秒とほぼ0.2 秒の割り込み時間となります。


<プログラム>

ここから先は

2,565字 / 1ファイル
この記事のみ ¥ 100
期間限定 PayPay支払いすると抽選でお得に!

この記事が気に入ったらサポートをしてみませんか?