« 「天文屋のためのマイコン入門」1/32秒間隔の割込みを作る | トップページ | 「天文屋のためのマイコン入門」3モードへの拡張 »

2014年7月22日 (火)

「天文屋のためのマイコン入門」スイッチ検出プログラム

  前回までに1/32秒間隔で発生するタイマー割り込みのプログラムを作りました。もう一度、掲載します。

1407201_2

これをもとに、プログラムを追加していき、最終的に完成させます。まずは、スイッチが押されたことを検出するプログラムを追加します。そのプログラムを以下に掲載します。順に説明していきます。

まずは、定義部です。

1407202

最初の赤枠部分で、便利な置き換えにいくつか追加してます。

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とします。なんでわざわざ「モード」なる概念を導入したかというと、今後の発展のためです。

プログラムを上から説明していくと次は割込み処理ですが、プログラムの流れ的には、次は初期化部を説明する方が分かりやすいです。

1407203_2 

定義部で名前をつけたデータをここで初期化しています。すべて0にしています。

次に、本筋の割込み処理を説明します。

1407204

割込み処理はおおまかに3つの部分からなります。赤枠の部分でスイッチがOFF-ON-ONに変化するのを検出しています。で、検出したら、青枠の部分で、モードを変えています。そして、緑の部分で、モードに応じてLEDを点灯または消灯させています。

最初に赤枠の部分を説明します。

1407205

最初はスイッチはOFFです。つまりSW_STATE=0です。この状態でスイッチが押されたとします。上のグラフの1の部分です。このとき、SW_STATEは0なので、ビット0、ビット1も0なので矢印の部分にプログラムが移動します。

ここでSW_STATEが1になります。

1407206

さらにSWがONなら、つまり上のグラフの2の部分ですね。このときはプログラムは2の矢印の部分に移動し、次の青枠の部分のモードチェンジに移動します。

1407207

ここでは、モードを0なら1、1なら0にするのですが、つまり反転。しかし実際にはインクリメントしています。インクリメントでも最下位ビットだけ見れば0->1->0->1を繰り返すので、反転と同じことです。

1407208

緑の枠の中ではLEDを変化させています。モードが0なら、消灯させ、モード1なら点灯させています。

今日はここまで。

|

« 「天文屋のためのマイコン入門」1/32秒間隔の割込みを作る | トップページ | 「天文屋のためのマイコン入門」3モードへの拡張 »

コメント

コメントを書く



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




« 「天文屋のためのマイコン入門」1/32秒間隔の割込みを作る | トップページ | 「天文屋のためのマイコン入門」3モードへの拡張 »