目次PIC回路集飾りランプ


飾りランプ制御回路 処理説明

割り込み動作


今回のソフトウェアでは3種類の割り込み動作を使用して処理を実行しています。以下の説明は50Hzの場合です。
RB0割り込み:交流電圧の極性反転(0V)を検出します。
TMR0割り込み:1ミリ秒ごとに割り込みを発生させ、TRIACをONにするタイミングを制御します。
TMR1割り込み:50ミリ秒ごとに割り込みを発生させ、パターンスイッチの読み取りとTRIACをONにするタイミングを変化させます。

TMR0およびTMR1割り込み処理ではTRIAC1から5までを連続的に制御します。

RB0割り込み
;*************** RB0 interruption process ***************
    交流電圧の極性反転は交流電圧用のフォトカプラ(TLP626)により検出され、同期パルスがRB0に入力されます。PICでRB0の電圧変化を検出すると INTCON レジスタの INTF ビットが 1 になり、割り込みが発生します。この割り込みでは以下のようなTRIAC制御の初期化が行われます。
    ・TMR0の初期化
    ・TMR0の割り込みごとに制御位置を管理するインデックス(tmr0_index)の初期化(0)
    ・TRIACのON/OFF状態を保持するデータ(porta_work)の初期化(OFF)
    ・TRIACのON/OFFを制御するPORTAの初期化(OFF)
TMR0割り込み
;************** TMR0 interruption process ***************
    TMR0は500μ秒ごとにカウントアウトし、割り込みが発生します。
    この割り込みによりTRIACをONにするタイミングが制御されます。TRIACをONにするタイミングはTRIAC制御メモリ(TRIACx)により指示されます。TMR0の割り込みが発生するごとにTMR0のインデックス(tmr0_index)が加算され、TRIAC制御メモリの値と一致した時点でTRIACをON状態にします。ですから、TRIAC制御メモリの値が小さいとONにするタイミングは早くなり、ランプは明るく光ります。値が大きいとタイミングは遅くなり、ランプは暗くなります。
    TRIACx =< tmr0_index という判定処理により、一度ONにしたTRIACはRB0割り込みが発生するまでTRIAC制御メモリの状態をONに保持しています。保持しなくてもTRIACはONになっています。
TMR1割り込み
;***** Timer1 interruption process (50ms interval) ******
    TMR1は50ミリ秒ごとにカウントアウトし、割り込みが発生します。
    TMR1の割り込み処理ではパターンスイッチの読み込みとTRIACの制御タイミングを変化させる処理が行われます。
    パターンスイッチ読み込み処理ではPORTBの上位3ビット(RB7-5)でスイッチを指定してPORTBの読み込みを行います。スイッチ指定をしてからPORTBを読み出すまで750μ秒のタイミングを取っています。スイッチの状態はRB4-1なので右に1ビットシフトし、下位4ビットに設定します。読み込まれたデータは0と1が反転しているので xorwf を使用して反転しています。下位4ビットだけをピックアップして portb_work に格納します。スイッチの状態は最終的には swx_mode に格納されますが、 portb_work と swx_mode の内容が同じであれば変化していないので、再格納処理は行いません。 portb_work と swx_mode の内容が異なっている場合にはスイッチの設定が変えられたので、読み込んだデータを swx_mode に格納します。このときTRIACの制御タイミングで使用するプロセス番号(tx_proc)をクリアします。これにより、パターンデータが初期化されます。設計当初は1回の処理で全てのスイッチ読み込みを行っていましたが、デコーダの動作が追いつかないため、1回の処理で1つのスイッチの状態を読み込むことにしました。ですから、スイッチの位置を変更してから最大250ミリ秒後に読み込みが行われますが、問題にはなりません。
    TRIACの制御タイミング処理はTMR1の割り込み2回ごとに起動されます。ですから、100ミリ秒ごとに起動されます。この処理ではTRIAC制御メモリ(TRIACx)にランプの明るさを制御するデータを設定します。設定されたデータを基にTMR0割り込み処理でTRIACが制御されます。この処理の詳細は以下のパターン処理をご覧ください。


パターン処理
;*********** Pattern process (100ms interval) ***********
    パターン処理はTMR1の割り込み処理を使い、100ミリ秒ごとに起動されます。
    この処理では5つのプロセスでTRIACの制御タイミングを管理しています。

プロセス0(初期化)このプロセスではパターンデータを実行管理メモリにコピーする処理が行われます。
プロセス1(初期遅延)今回の装置では点灯パターンを多彩にするため、点滅の開始時期をずらせるようにしています。
プロセス2(立ち上がり)消灯状態から点灯状態にします。
プロセス3(点灯)点灯状態を継続します。
プロセス4(立ち下がり)点灯状態から消灯状態にします。
プロセス5(消灯)消灯状態を継続します。

実行管理メモリの構造
    TRIACの制御タイミング処理のために10バイトのメモリを使用します。このメモリはTRIACごとにあります。
    メモリの上位5バイト(黄緑色)はプロセス1から5で使用するデータが格納されます。
    下位5バイト(黄色)は処理実行中の管理エリアになります。プロセス番号には進行中のプロセス番号が格納されます。各プロセスの終了時に次のプロセスの番号が設定されます。また、次の処理で必要なデータを処理回数カウンタ以降のエリアに設定します。このエリアは各プロセスでのワークエリアとして使用されます。

各プロセスでの処理
    プロセス0:初期化処理
      スイッチで指定されるパターンに対応するデータを初期値として実行管理メモリの上位5バイトにコピーします。
      また、最後にプロセス1のための初期遅延時間データを処理回数カウンタに設定します。

    プロセス1:初期遅延処理
      処理回数カウンタで指定された回数だけ待ち処理を行います。処理の起動は100ミリ秒ごとなので、5と設定されていれば500ミリ秒の待ちになります。
      プロセス1の終了処理ではプロセス2のためのデータ準備処理を行います。
      プロセス2で行う立ち上がりの処理は少し面倒です。設定する値により処理内容が変わります。明るさを制御出来るのは20段階なので、設定値が20以上か、20未満かで変わります。
      設定が20以上の場合、同じTRIACの制御値を繰り返す必要があります。例えば設定値が40の場合、20段ある各段を2回繰り返して次の段に移ります。何回繰り返すかをインデックスカウンタに設定します。
      設定が20未満の場合、何段か飛ばして制御する必要があります。例えば設定値が5の場合、4段、8段、12段、16段、20段というようにいくつか飛ばしで制御します。飛ばす段数の値はサブインデックスカウンタに設定します。
      20以上か20未満かを識別するために処理フラッグエリアを使用します。20以上の場合はフラッグを1に、20未満の場合にはフラッグを0にします。
      今回の処理ではTRIAC制御メモリ(TRIACx)の値が20だと消灯、0だと点灯になります。ですから、消灯状態から点灯状態にするためにはTRIAC制御メモリ(TRIACx)の値を20から減算して最終的に0になるように制御します。TRIAC制御メモリ(TRIACx)の値が0以下になると実質的には20以上の値になり、消灯状態になってしまいます。ですから、減算処理では0以下のならないようにしています。

    プロセス2:立ち上がり処理
      プロセス1の後処理で設定した処理フラッグ、インデックスカウンタおよびサブインデックスカウンタの値に基づいて立ち上がり処理を行います。繰り返し回数(設定が20以上の場合)の実施状況はサブインデックスカウンタを使用して管理します。TRIAC制御メモリ(TRIACx)の値を20から0に減算する処理です。
      後処理ではプロセス3のための点灯時間データを処理回数カウンタに設定します。

    プロセス3:点灯処理
      処理回数カウンタで指定された回数だけ点灯処理を行います。TRIAC制御メモリ(TRIACx)はプロセス2で既に点灯データが格納されているので、この処理では処理回数カウンタで指定された回数だけ繰り返すだけです。
      後処理ではプロセス1の後処理で行ったのと同じように処理フラッグ、インデックス、サブインデックスを設定します。ただし、設定する内容は点灯状態から消灯状態にするため、処理内容は立ち上がり処理とは異なります。0から加算する処理になります。

    プロセス4:立ち下がり処理
      プロセス3の後処理で設定した処理フラッグ、インデックスカウンタおよびサブインデックスカウンタの値に基づいて立ち下がり処理を行います。TRIAC制御メモリ(TRIACx)の値を0から20に加算する処理です。
      後処理ではプロセス5のための消灯時間データを処理回数カウンタに設定します。

    プロセス5:消灯処理
      処理回数カウンタで指定された回数だけ点灯処理を行います。
      後処理ではプロセス1の後処理と同様の処理を行います。プロセス1の後処理と兼用することも考えられますが、処理の煩雑さを避けるために、プロセス1とは別にしています。
      次のプロセスは2に設定します。ですから、これ以降はプロセス2→プロセス3→プロセス4→プロセス5→プロセス2→・・・と繰り返します。


ユーザ・データ
    ソースコードを変えれば何でも変更できますが、一部はデータ形式にして変更を容易にしています。データは周波数設定データと制御パターン設定データです。
周波数設定データ
;*** Frequency of AC power. 50Hz or 60Hz
    交流電圧の周波数を変更するためのデータです。50Hzと60Hzの切り替えができます。50以外の値は60Hzと見なしています。
    50Hzの場合、半サイクルの周期が10ミリ秒なので、TMR0の時間を1ミリ秒にして半サイクルに10回の割り込みを発生させています。
    60Hzの場合、半サイクルの周期が8.33ミリ秒なので、TMR0の時間を0.833ミリ秒にして半サイクルに10回の割り込みを発生させています。

制御パターン設定データ
;*** Control Pattern.  Available 0 to 255 (unit=100ms)
    今回の装置ではスイッチにより予め設定されている10種類のパターンから選ぶことができます。この制御パターンはデータ形式としてあるので変更することが可能です。
    内容は実行管理メモリの構造で示した黄緑色の内容と同じです。
    データの単位は100ミリ秒です。
    最大255まで設定できます。
    注意点としては20以下の値の場合、0、1、2、4、5、10としてください。また、20以上の場合には20の倍数としてください。
    これは、TRIACの制御段数が20段階であるため、上記以外の値を設定しても効果がありません。別にエラーになるわけではありません。ランプの制御ですから、厳密な制御をしても効果はありません。
    パターン0の例を以下に示します。
    ; Pattern 0
    p0_1    equ    d'10'            ;Start delay      (1sec)
    p0_2    equ    d'5'             ;Rising up      (0.5sec)
    p0_3    equ    d'5'             ;Bright         (0.5sec)
    p0_4    equ    d'5'             ;Falling down   (0.5sec)
    p0_5    equ    d'5'             ;Dim            (0.5sec)