ライト・コントローラー ソフト処理説明 |
タイトル ;******************************************************** ; ; The light control processing ; ; Divice : PIC16F873 ; Author : Seiichi Inoue ;******************************************************** コメント(;)を使用してプログラムのタイトルを書きました。 LIST および INCLUDE疑似命令 list p=pic16f873 include p16f873.inc
PIC16F873の標準ラベル定義をINCLUDEコマンドで組み込みます。 標準ラベル定義ではバンク0以外の定義はエラーが表示されます。実害は無いのですが、気持ち悪いので修正しました。 includeファイルの変更については「サインボード ソフト処理説明」を参照して下さい。 または、ERRORLEVELコマンドで警告メッセージを表示しないようにすることができます。 コンフィギュレーションワード
__config _hs_osc & _wdt_off & _pwrte_on & _cp_off
PIC16F873では上記以外の項目も含まれています。通常は上記の疑似命令でOKです。 プログラム開始 ;**************** Program Start *********************** 電源投入/リセット時はプログラムメモリアドレスは h'0000' からスタートします。また、割り込み処理のスタート番地は h'0004' です。 goto命令で各処理にジャンプするようにしています。 h'0000' は初期化処理、h'0004' はタイマー割込処理にジャンプします。 初期化処理 ;**************** Initial Process *********************
以上で初期化処理が終了しました。後は割り込みを待つだけなので、メイン処理としては同じアドレスを繰り返し実行させているだけです。オペランドの'$'は自分のアドレスを意味しています。'$+1'は自分のアドレスの次のアドレスを意味します。 割り込み処理 ;*************** Interruption Process ***************** CCP2により1ミリ秒毎に割り込みが発生します。 最初にCCP2の割り込みフラッグをクリアします。これをしないと次の割り込みが所定の時間を待たずに発生してしまいます。CCP2の割り込みと同時にA/Dコンバータの変換がスタートしています。ですから、変換完了(ADCON0のGOビットが0になる)まで待ちます。今回の場合、アナログチャネルは0チャネルだけなので、変換電圧取り込み時間(約20μ秒)は必要ありません。複数のチャネルを切り替えながらA/D変換する場合にはチャネル切り替え後、A/D変換開始まで待ち時間を設ける必要があります。 変換が終了したら、変換結果の上位8ビットをCCP1(PWMモード)のデューティカウンターに設定します。 変換結果は10ビット出ますが、今回の回路では1024分割も必要ないので、上位の8ビットだけを使用し、256分割にしています。 入力電圧が0Vの場合、変換結果は00hになり、デューティが0、すなわち、出力パルスはHレベルになりません。 入力電圧が上昇すると、変換結果もそれにつれて大きな値になり、デューティが大きくなり、出力パルス幅が増えます。 入力電圧が最大値になると、変換結果はFFhになり、デューティが100%近くなります。今回の場合10ビットのうちの下位2ビットは使わず、0に固定しているので、厳密には100%になりません。実用上は問題はありません。 割り込みが発生したとき、メイン処理では自分のアドレスを繰り返し実行しているだけでレジスタ類は使用していないので、レジスタ類の待避処理は行っていません。メイン処理でレジスタ類を使用した処理を行っている場合には必要なレジスタ類を待避しておく必要があります。 割り込み終了処理 ;************ END of Interruption Process ************** 割り込み終了割り命令(RETFIE)を実行し、次の割り込みを可能な状態にします。 割り込み時にレジスタ類の待避もしていないので他に何もすることはありません。 コーディングの終了 ;******************************************************** ; END of signboard control processing ;******************************************************** end コーディングの最後は end命令 で終了します。endが無いとアッセンブラはコーディングの最後を検出できず。エラーになります。 |