「天文屋のためのマイコン入門」タイマーのプログラム
それでは実際にプログラムを作って見ましょう。
このプログラムをビルドして、書き込むと、LEDが一秒間隔で点滅します。
●初期化部
OPTION_REGのうち、クロック源の選択で、命令のクロックをクロック源とするため、ビット5をクリアします。また、プリスケーラーをウオッチドッグタイマーではなくタイマー0で使用するため、ビット3を0にクリアします。
よって次の2命令を初期化部分に加えます。
BCF 81h,5
BCF 81h,3
●メイン部
LEDを点灯する命令と消灯する命令を交互に実行しますが、間に1秒待つサブルーチンを呼び出しています。
●サブルーチン部
1秒待つサブルーチンです。タイマーレジスタTMR0に入力されるクロックは次のようになります。
プリスケーラーの分周比ですが、特に設定していないので、デフォルトの1/256になります。したがって、TMR0に入力されるクロック周波数は30Hzになります。
つまりTMR0が30カウントしたら1秒ということです。これを利用して1秒を作り出します。つまり、TMR0に-30を代入して、
MOVLW -30
MOVWF 1h
次にTMR0の値をワーキングレジスタに読み込んで
MOVF 1h,W
0かどうか判定でします。0ならSTATUS(3番地)レジスタのビット2がセットされています。
BTFSS 3h,2
0なら、GOTOをスキップしてサブルーチンからリターンします。0でないなら、まだ一秒たっていないので、ループの先頭に戻って同じことを繰り返します。
GOTO Wait1s_LOOP
RETURN
いかだでしょうか、タイマーの機能をわかっていたただけたでしょうか?次回このプログラムを少し改良するのと、問題点を検討してみます。
| 固定リンク
コメント