カウントダウン・タイマー ソフト処理説明 |
タイトル ;******************************************************** ; ; The Count-down timer processing ; ; Author : Seiichi Inoue ;******************************************************** コメント(;)を使用してプログラムのタイトルを書きました。 LIST および INCLUDE疑似命令 list p=pic16f84a include p16f84a.inc
PIC16F84Aの標準ラベル定義をINCLUDEコマンドで組み込みます。 includeファイルの変更については「サインボード ソフト処理説明」を参照して下さい。 または、ERRORLEVELコマンドで警告メッセージを表示しないようにすることができます。 コンフィギュレーションワード
__config _hs_osc & _wdt_off & _pwrte_on & _cp_off
オペランドの内容については「サインボード ソフト処理説明」を参照して下さい。
ラベル定義 ;**************** Label Definition ******************** 処理で使用するラベル常数の定義を行います。PIC16F84Aの標準ラベルはINCLUDEで組み込まれます。 7セグメントLEDのパターン定義もEQUで行っています。 パターンは次のようになっています。
デバッグモード指定 ;************** Debugging mode setting **************** ;For debugging mode, ";" of next line should be removed. ;#define _debug
今回の場合には、カウンター値の初期値、タイマーの設定値、ストップスイッチの状態などを擬似的に設定する方法で行っています。その都度、ソースプログラムの内容を変更しても良いのですが、今回は'_debug'のラベルが定義されているかいないかでアッセンブルする内容が変わるようにしました。 詳細は「ソフトデバック説明」のページを参照して下さい。 プログラム開始 ;**************** Program Start *********************** 電源投入/リセット時はプログラムメモリアドレスは h'0000' からスタートします。また、割り込み処理のスタート番地は h'0004' です。 goto命令で各処理にジャンプするようにしています。 h'0000' は初期化処理、h'0004' はタイマー割込処理にジャンプします。 初期化処理 ;**************** Initial Process *********************
タイマー待機処理 ;************* Timer stand-by Process ***************** タイマーのカウントダウンがスタートしていない状態では以下の処理を繰り返し実行しています。 BCDスイッチの状態を取り込み、カウンター値に設定 カウンターの内容をLEDに出力 ポートBの6番ポートを入力モードに設定 スタートスイッチの状態を取り込む タイマースタート処理 ;************** Timer start Process *******************
リレーをONにする 割り込みタイマーの初期化を実行 出来るだけ正確に1秒毎の割り込みを行わせる必要があります。 タイマーの割り込み時間を決めるには以下の要素があります。
以降の処理はタイムアウトするまで繰り返し実行されます。 カウンターの内容をLEDに出力 タイムアウトしたかどうかをチェック タイムアウト時には初期化処理に戻る
LED点灯制御サブルーチン ;************** LED Control Subroutine **************** 分の10位、分の1位、秒の10位、秒の1位の順にカウンターの内容をLEDに出力します。 BCDコードから7セグメントデータへの変換 ;******* Change BCD to 7segment data Subroutine ******* BCDコードのデータから7セグメントのデータへの変換を行い、ポートBに出力します。 1ミリ秒タイマーサブルーチン ;************* 1msec Timer Subroutine *****************
BCDスイッチ、スタートスイッチなどのように入力モードで使用する場合にはデバイスを指定した後、デバイスの状態を読み込む前に1ミリ秒の待ちをします。7セグメントLEDのように出力モードで使用する場合にはLEDの点灯情報を出した後、1ミリ秒待った後次のデバイスの処理をします。 待ち時間が必要なことはMLPABでのシミュレーションでは分かりません。私は実際の回路で動作させてみて分かりました。ハードウェアの動作時間も考慮する必要があります。 このサブルーチンは「LEDフラッシャー」で作成した処理を流用しています。 割り込み処理 ;************ Begin Interruption Process ************** WレジスタのセーブとSTATUSレジスタのセーブを行い、タイマー割り込みの確認を行います。 ここで注意すべき点は割り込み時のバンク状態です。割り込まれた処理でバンクを1に切り替えた直後に割り込みが発生すると割り込み処理で違うSFRを設定してしまうことがあります。ですから、STATUSレジスタのセーブが終了した後、バンクを0に切り替える処理を実行しています。 割り込み終了処理 ;************ END of Interruption Process **************
Wレジスタを戻すのにはSTATUSレジスタの内容が変わらないようにSWAPF命令を使用しています。 タイムアウト割り込み処理 ;*********** Time-out interruption Process ************
1秒毎にカウントダウン処理をさせるためには、ハードウェアタイマーだけでは短いです。(10MHzクロックで最大26_秒) ですから、ハードタイマーの割り込みをソフトウェアでカウントし、1秒毎にカウントダウン処理を実行させるようにしています。 カウントダウンの誤差を最小にするようにハードタイマーの設定値とソフトでのカウント値設定を決めています。 カウントダウン処理 ;************* Timer count-down Process ***************
最初に秒の1位カウンターを減算して0になるかどうかをチェックしています。0になった場合にはタイムアウト状況の可能性があるので、全てのカウンターが0かどうかのチェックをしています。 カウンターが0であるかどうかはmovf命令でカウンター内容を読み出し、STATUSレジスタのZビットをチェックして判断します。Zビットが'1'の場合にはカウンターの内容が0であることを示しています。 いずれかのカウンターが0でない場合にはタイムアウト状態ではないので、カウントダウン処理に移ります。 カウントダウン処理では各カウンタの内容をチェックし、0の場合には最大値の設定を行います。秒の10位の最大値は5で他の桁は9が最大値です。カウンターの内容が0でない場合にはその桁だけ1つ減算します。 割り込み処理ではタイムアウトチェックとカウントダウン処理のみを行います。タイムアウトした場合の処理(タイマー停止、リレーOFF)およびカウンターをLEDに表示する処理はタイマースタート処理で行っています。 コーディングの終了 ;******************************************************** ; END of signboard control processing ;******************************************************** end
|