割り込み動作 今回のソフトウェアでは3種類の割り込み動作を使用して処理を実行しています。以下の説明は50Hzの場合です。
TMR0およびTMR1割り込み処理ではTRIAC1から5までを連続的に制御します。 RB0割り込み ;*************** RB0 interruption process ***************
・TMR0の初期化 ・TMR0の割り込みごとに制御位置を管理するインデックス(tmr0_index)の初期化(0) ・TRIACのON/OFF状態を保持するデータ(porta_work)の初期化(OFF) ・TRIACのON/OFFを制御するPORTAの初期化(OFF) ;************** TMR0 interruption process ***************
この割り込みにより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になっています。 ;***** Timer1 interruption process (50ms interval) ******
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) ***********
この処理では5つのプロセスでTRIACの制御タイミングを管理しています。
実行管理メモリの構造
また、最後にプロセス1のための初期遅延時間データを処理回数カウンタに設定します。
プロセス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以下のならないようにしています。
後処理ではプロセス3のための点灯時間データを処理回数カウンタに設定します。
後処理ではプロセス1の後処理で行ったのと同じように処理フラッグ、インデックス、サブインデックスを設定します。ただし、設定する内容は点灯状態から消灯状態にするため、処理内容は立ち上がり処理とは異なります。0から加算する処理になります。
後処理ではプロセス5のための消灯時間データを処理回数カウンタに設定します。
後処理ではプロセス1の後処理と同様の処理を行います。プロセス1の後処理と兼用することも考えられますが、処理の煩雑さを避けるために、プロセス1とは別にしています。 次のプロセスは2に設定します。ですから、これ以降はプロセス2→プロセス3→プロセス4→プロセス5→プロセス2→・・・と繰り返します。 ユーザ・データ
;*** Frequency of AC power. 50Hz or 60Hz
50Hzの場合、半サイクルの周期が10ミリ秒なので、TMR0の時間を1ミリ秒にして半サイクルに10回の割り込みを発生させています。 60Hzの場合、半サイクルの周期が8.33ミリ秒なので、TMR0の時間を0.833ミリ秒にして半サイクルに10回の割り込みを発生させています。 制御パターン設定データ ;*** Control Pattern. Available 0 to 255 (unit=100ms)
内容は実行管理メモリの構造で示した黄緑色の内容と同じです。 データの単位は100ミリ秒です。 最大255まで設定できます。 注意点としては20以下の値の場合、0、1、2、4、5、10としてください。また、20以上の場合には20の倍数としてください。 これは、TRIACの制御段数が20段階であるため、上記以外の値を設定しても効果がありません。別にエラーになるわけではありません。ランプの制御ですから、厳密な制御をしても効果はありません。 パターン0の例を以下に示します。
|