「天文屋のためのマイコン入門」1/32秒間隔の割込みを作る
1秒間隔のタイマー割込み発生プログラムは既に作成済みです。これをもとに1/32秒間隔の割り込みを発生させるため、どこをどのように修正するか説明します。
まず、命令を実行させるためにクロックですが、これを仮にシステムクロックと呼びます。システムクロックは現在31.25KHzに設定されています。何も設定しなければ最低のこの値になります。この値を現在まで使ってきました。
クロックを最大の8MHzまで上げて見ましょう。クロックを上げると命令が早く実行されます。オーバーヘッドが減り、処理にも余裕が出てきます。クロックを上げるには、OSCCONというレジスタを操作します。
ビット6,5,4の3ビットでクロックの値を決定します。すべて1にすると8MHzになります。初期値はすべて0なので次のような3命令で111にします。
BSF OSCCON , 6
BSF OSCCON , 5
BSF OSCCON , 4 ;クロック8MHz
BSFやBCFなどのビットをセット、クリアする命令は便利です。すすんで利用すべきです。なぜならこれらの命令は他のビットに影響を与えないからです。転送命令だとすべてのビットに影響しますから、レジスタのすべてのビットを理解しなければなりません。
さて、システムクロックは1/4に分周され、さらにプリスケーラーで分周されタイマーレジスタTMR0のカウントクロックになります。
プリスケーラーで何分周すれば良いか計算して見ましょう。TMR0の最小カウント値は1で最大カウントは256ですから、この範囲に入るようにします。1/32秒間隔ということは32Hzに注目すると、
最小値1の場合の分周比 -> 32Hz = 2MHz*X
X = 32/2000000=1/62500
最大値256の場合の分周比 -> 32Hz*256 = 2MHz*X
X = 32*256/2000000=1/244
さて、カウント値が高い方が誤差が少ないですから、1/244に一番近い分周比を選ぶと1/256分周になります。
したがって、プリスケーラーの分周比は1/256になります。このときのTMR0のカウント値はいくつになるかというと
32Hz*X = 2MHz/256
X = 2000000 / 128 / 32 = 244
となります。1秒間隔のプログラムとまったく同じです。
さて、プリスケーラーの分周比はOPTION_REGで変更可能です。
下位3ビットで分周比を決定します。1/256分周は111ですが、これは初期値のままなので、特別な命令を記述する必要はありません。
1/32秒間隔で発生するタイマー割り込みのプログラムは以下の通りです。
| 固定リンク
コメント