目次>5章 第2ステップ(色々な実験)>(6)LEDの明るさを序所に変える(TMR0割込み使用)

LEDの明るさを序所に変える(TMR0割込み使用)

更新日2005.10.15

(3)LEDの明るさを序所に変える」では、一定時間待つのに命令を繰り返していました。
ここでは、TMR0割込みを使って一定時間の待ちを作り出します。

仕様
プログラムの仕様は次の通りで、「LEDを徐々に明るくする」と「徐々に暗くする」を繰り返します。
待ち時間を加えると電子ホタルができそうです。
(1) 徐々に明るくする
緑色LED(RB0)を消灯状態から点灯状態まで、徐々に明るくします。
同時に、赤色LED(RB1)を点灯します。
(2) 徐々に暗くする
緑色LED(RB0)を点灯状態から消灯状態まで、徐々に暗くします。
同時に、赤色LED(RB1)を消灯します。

この様子を表すと次のようになります。

緑色LEDの明るさ

赤色LEDの明るさ

実験回路
実験回路は今まで使っていたものをそのまま使用します。
「(4)スイッチでLEDの点滅パターンを変更」でスイッチを追加していてもそのまま使用できます。

LEDの明るさを序所に変えるには
LEDの明るさを序所に変える考え方は、「(3)LEDの明るさを序所に変える」を参照して下さい。
プログラムは変えていますので、以下を見て下さい。


では、プログラムを作成しましょう。
ONとOFFの割合を序所に変える訳ですが、以下の図を元に説明します。

まず、TMR0割込みを、0.2048mS毎に発生させます。
そして、TMR0割込み99回を1サイクルとします。 従って、1サイクルは約20mSです。

1サイクルの開始時に、RB0をONにし、「点灯する時間」経過時にOFFにします。
「点灯する時間」(t_width)は、1サイクルになる毎に1づつ加算し、100になったら逆に1づつ減算し、0になったら再び1づつ加算ます。
これにより、徐々に明るくと、徐々に暗くが繰り返されます。

この制御のために以下の3つのカウンタを使用します。

カウンタカウンタの用途
t_cycle1サイクルをカウントする(0〜99)。
TMR0割込み毎に+1し、100になったら0に戻す。
0に戻す時にRB0をONにし、t_widthにt_addを加算する。
t_widthRB0をONにしている時間(0〜99)。
値が大きい程明るくなる。
t_cycleが0に戻る時、t_addを加算する。
t_cycleがt_widthと同じになったらRB0をOFFにする。
t_add1または−1をセットし、t_widthに加える。
初期値は1で、t_widthに加算する事で、t_widthを増加させる。(徐々に明るくなる)
t_widthが100になったら−1(0FFh)をセットする。t_widthに加算する事で、t_widthを減少させる。(徐々に暗くなる)
t_widthが0になったら1をセットし繰り返す。


こちらは、メイン処理のフローです。

こちらは、割込み処理のフローです。

プログラム全体
上記の処理を組み込んだプログラムはこちらです。
メモ帳などのテキストエディタに取り込んで、LED7.ASMという名で保存し、MPLABでアセンブル&PICライタでPICに書き込んで動かしてみて下さい。