目次PIC回路集ライト・コントローラー


ライト・コントローラー ソフト処理説明




タイトル

;********************************************************
;
;              The light control processing
;
;                                 Divice : PIC16F873
;                                 Author : Seiichi Inoue
;********************************************************

    コメント(;)を使用してプログラムのタイトルを書きました。



LIST および INCLUDE疑似命令

        list            p=pic16f873
        include         p16f873.inc
    PICの種類を指定するためにLISTコマンド(疑似命令)を使用します。
    PIC16F873の標準ラベル定義をINCLUDEコマンドで組み込みます。
    標準ラベル定義ではバンク0以外の定義はエラーが表示されます。実害は無いのですが、気持ち悪いので修正しました。
    includeファイルの変更については「サインボード ソフト処理説明」を参照して下さい。
    または、ERRORLEVELコマンドで警告メッセージを表示しないようにすることができます。



コンフィギュレーションワード

    CONFIG疑似命令を使用してコンフィギュレーションワードの指定を行っています。

        __config _hs_osc & _wdt_off & _pwrte_on & _cp_off
    コンフィギュレーション・ワードはライターでプログラムを書き込む際にも指定できますが、CONFIG疑似命令を使用すると自動的に設定することができます。

    項目設定内容フィールド名称ビット
    コードプロテクションOFFCP11
    パワーアップタイマーONPWRTE(inv)0
    ウォッチドッグタイマーOFFWDTE0
    クロック発振器指定HSFOSC1およびFOSC010

    PIC16F873では上記以外の項目も含まれています。通常は上記の疑似命令でOKです。



プログラム開始

;****************  Program Start  ***********************

    電源投入/リセット時はプログラムメモリアドレスは h'0000' からスタートします。また、割り込み処理のスタート番地は h'0004' です。
    goto命令で各処理にジャンプするようにしています。 h'0000' は初期化処理、h'0004' はタイマー割込処理にジャンプします。





初期化処理

;****************  Initial Process  *********************
    電源投入後の初期化処理として以下の処理を行います。
    ポートAおよびCのモードの初期化
    ポートAの0番をアナログ入力に使用しています。他のAポートは全て出力モードにしました。
    関係無いかもしれませんが、入力の影響を避けるためです。
    CポートはCCPの出力をするため、全て出力モードにしました。
    A/Dコンバータの初期化

    PICのクロックに10MHzを使ったので、A/D変換クロックをFosc/32にします。
    入力チャネルはAN0です。 A/DコンバータをONにして使用できるようにします。
    変換結果は上位の8ビットを使用するために右寄せにします。
    アナログ入力ポート構成指定は0ポートのみアナログのパターンを選択しています。
    PWMの初期化

    CCP1をPWMモードで使用します。
    念のためにタイマー2のカウンタおよびデューティ設定をクリアしています。
    出力パルスの周期は1638.4μ秒(約610Hz)にしています。プリスケーラは1:16です。 タイマー2が使えるようにONにします。
    コンペアモードの初期化

    CCP2をコンペアモードで使用し、周期的に割り込み起動がかかるようにします。
    割り込み周期は1ミリ秒にしています。タイマー1を内部クロックでカウントさせます。
    タイマー1のプリスケーラを1:1にし、タイマー1が使えるようにON状態にします。
    CCP2でタイマー1が規定値(1ミリ秒)になったときに割り込みを発生させると同時にA/Dコンバータをスタートするようにします。
    割り込みの初期化

    CCP2の割り込み可能ビットを設定します。 グローバル割り込み可能ビット、周辺機器割り込み可能ビットも設定します。

    以上で初期化処理が終了しました。後は割り込みを待つだけなので、メイン処理としては同じアドレスを繰り返し実行させているだけです。オペランドの'$'は自分のアドレスを意味しています。'$+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が無いとアッセンブラはコーディングの最後を検出できず。エラーになります。