「天文屋のためのマイコン入門」スイッチ検出プログラム
前回までに1/32秒間隔で発生するタイマー割り込みのプログラムを作りました。もう一度、掲載します。
これをもとに、プログラムを追加していき、最終的に完成させます。まずは、スイッチが押されたことを検出するプログラムを追加します。そのプログラムを以下に掲載します。順に説明していきます。
まずは、定義部です。
最初の赤枠部分で、便利な置き換えにいくつか追加してます。
SKIP_IF_ZERO
これは、演算の結果が0なら次の命令をスキップする命令の便利な置き換えです。
SKIP_IF_SW_ON
これは、スイッチがON状態なら次の命令をスキップする命令の置き換えです。
SKIP_IF_SW_OFF
これは、スイッチがOFF状態なら次の命令をスキップする命令の置き換えです。
2番目の赤枠の中はプログラム中で使うデータの汎用レジスタへの割り付けです。単なる名前の定義ですが、
TIME_COUNT
このデータは1/32秒間隔の割込みごとにインクリメントさせます。つまりTIME_COUNTが32になったら1秒です。
SECOND
秒数をカウントをするデータです。
MINUTE
分数をカウントするデータです。ほんとは、分数など使わずすべて秒数で管理した方が良いのですが、レジスタは8ビットなので255秒までしか格納できません。これでは実用的でないので、秒数、分数で時間を管理することにします。
SW_STATE
前回説明したとおり、スイッチが押されたことを検出するには1/32秒間隔で3回スイッチの状態を読み込みOFF-ON-ONを検出すれば良いのでした。そこで、SW_STATEはスイッチがOFFの時は0、OFF->ONになったら1、さらにOFF->ON->ONとなったら2とすることにします。
MODE
このプログラムはLEDを点けたり、消したりするプログラムですが、LEDが消えた状態をモード0、LEDが点灯した状態をモード1とします。なんでわざわざ「モード」なる概念を導入したかというと、今後の発展のためです。
プログラムを上から説明していくと次は割込み処理ですが、プログラムの流れ的には、次は初期化部を説明する方が分かりやすいです。
定義部で名前をつけたデータをここで初期化しています。すべて0にしています。
次に、本筋の割込み処理を説明します。
割込み処理はおおまかに3つの部分からなります。赤枠の部分でスイッチがOFF-ON-ONに変化するのを検出しています。で、検出したら、青枠の部分で、モードを変えています。そして、緑の部分で、モードに応じてLEDを点灯または消灯させています。
最初に赤枠の部分を説明します。
最初はスイッチはOFFです。つまりSW_STATE=0です。この状態でスイッチが押されたとします。上のグラフの1の部分です。このとき、SW_STATEは0なので、ビット0、ビット1も0なので矢印の部分にプログラムが移動します。
ここでSW_STATEが1になります。
さらにSWがONなら、つまり上のグラフの2の部分ですね。このときはプログラムは2の矢印の部分に移動し、次の青枠の部分のモードチェンジに移動します。
ここでは、モードを0なら1、1なら0にするのですが、つまり反転。しかし実際にはインクリメントしています。インクリメントでも最下位ビットだけ見れば0->1->0->1を繰り返すので、反転と同じことです。
緑の枠の中ではLEDを変化させています。モードが0なら、消灯させ、モード1なら点灯させています。
今日はここまで。
| 固定リンク
コメント