« 「天文屋のためのマイコン入門」始めの一歩 | トップページ | 「天文屋のためのマイコン入門」スイッチ検出プログラム »

2014年7月20日 (日)

「天文屋のためのマイコン入門」1/32秒間隔の割込みを作る

1秒間隔のタイマー割込み発生プログラムは既に作成済みです。これをもとに1/32秒間隔の割り込みを発生させるため、どこをどのように修正するか説明します。

まず、命令を実行させるためにクロックですが、これを仮にシステムクロックと呼びます。システムクロックは現在31.25KHzに設定されています。何も設定しなければ最低のこの値になります。この値を現在まで使ってきました。

クロックを最大の8MHzまで上げて見ましょう。クロックを上げると命令が早く実行されます。オーバーヘッドが減り、処理にも余裕が出てきます。クロックを上げるには、OSCCONというレジスタを操作します。

1407193

ビット6,5,4の3ビットでクロックの値を決定します。すべて1にすると8MHzになります。初期値はすべて0なので次のような3命令で111にします。

BSF     OSCCON , 6
BSF     OSCCON , 5
BSF     OSCCON , 4  ;クロック8MHz

BSFやBCFなどのビットをセット、クリアする命令は便利です。すすんで利用すべきです。なぜならこれらの命令は他のビットに影響を与えないからです。転送命令だとすべてのビットに影響しますから、レジスタのすべてのビットを理解しなければなりません。

さて、システムクロックは1/4に分周され、さらにプリスケーラーで分周されタイマーレジスタTMR0のカウントクロックになります。

1407195_2 

プリスケーラーで何分周すれば良いか計算して見ましょう。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で変更可能です。

1407196

下位3ビットで分周比を決定します。1/256分周は111ですが、これは初期値のままなので、特別な命令を記述する必要はありません。

1/32秒間隔で発生するタイマー割り込みのプログラムは以下の通りです。

1407201

|

« 「天文屋のためのマイコン入門」始めの一歩 | トップページ | 「天文屋のためのマイコン入門」スイッチ検出プログラム »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 「天文屋のためのマイコン入門」始めの一歩 | トップページ | 「天文屋のためのマイコン入門」スイッチ検出プログラム »