« 遠征行って来ます | トップページ | α7s速報画像 »

2014年7月31日 (木)

「天文屋のためのマイコン入門」7セグメントLEDとロータリースイッチの追加

前回までのプログラムで、骨格はほぼ完成しています。完成まであと少し、今日は、7セグメントLEDによる残り露出時間の表示とロータリースイッチによる露出設定を追加します。

追加点を順をおって説明します。まずは定義部分です。

1407271

SKIP_IF_ZEROはもうすでにあるので、SKIP_IF_NOT_ZEROを追加しておきます。演算結果が0でない場合に次の命令をスキップする命令です。

続いて、割り込み処理部分の追加です。ここで、ロータリースイッチから入力した数値(0~9)を7セグメントLEDに表示するプログラムを追加します。

1407272

BTFSS MODE , 1 命令によりモード2露出中の場合は、ロータリースイッチの値の表示はキャンセルされます。露出中は7セグメントLEDの表示は、残り露出時間を表示するのであって、ロータリースイッチの設定を表示するわけでないからです。スイッチの設定を表示するのは、モード0停止中またはモード1インターバル中のみです。

なお、この部分は1/32秒間隔で呼ばれるので、ロータリースイッチを回せば、ほぼリアルタイムで7セグメントLEDの表示が変わります。これは重要なことです。

サブルーチンInputSW_and_Dispはロータリースイッチの値を入力し、7セグメントLEDに表示するサブルーチンです。詳細は後で説明します。

次に割り込み処理の終盤、各モード別の動作のところ追加します。最初にモード0停止中のときプッシュスイッチが押され、モード2露出中に移行する部分の変更です。

1407273

ここでは、サブルーチンInputSWを呼んで、スイッチの値を取得し、レジスタMINUTEに格納しています。前回までここは無条件に1を代入していた部分です。

なお、

SKIP_IF_NOT_ZERO
ADDLW 10

この2行によりロータリースイッチの値が0のときは10分に変更しています。これにより、1分から10分まで設定できるようになっています。サブルーチンInputSWは以前紹介したサブルーチンとまったく同じです。

次に、時間をカウントする部分の追加です。

1407274

ここでは、モード2露出中のとき、MINUTEがデクリメントされるタイミングで、その値を7セグメントLEDに表示します。サブルーチンDisp7Segはだいぶ前に紹介したサブルーチンですがそのまま利用します。このサブルーチンは表示させたい数値を汎用レジスタの20h番地に格納しておくのでした。忘れた人は前の記事に戻って思い出してください。

次に初期化部の追加です。

1407275

最初にLEDを光らせるポートを0にクリアするのを今まで忘れていました。遅くなってしまいましたが、ここで追加しておきます。実はこの初期化ですが、この場所はあまりよくありません。また後日修正します。とりあえず、このままで。

最後にサブルーチンの追加です。

1407276

3つのサブルーチンを追加しますが、InputSWと、Disp7Segの2つは、だいぶ前に紹介したサブルーチンのままです。以前の記事を参照してください。

最初のInputSW_and_Disp7segは、のこりの2つを組み合わせたものです。スイッチの値を入力し、そのまま表示するサブルーチンです。

今日はここまで、あと、カメラのシャッターを開閉するためのアナログスイッチといわれるICを追加するだけです。完成までもう少し。

 

|

« 遠征行って来ます | トップページ | α7s速報画像 »

コメント

コメントを書く



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




« 遠征行って来ます | トップページ | α7s速報画像 »