目次PIC回路集遠隔大型表示装置


遠隔大型表示 表示装置 ソフト処理説明




動作環境設定



ラベル定義
;****************  Label Definition  ********************
        cblock  h'20'
データエリアにはCBLOCK疑似命令を使用して20hから自動割付を行っています。割付の終了にはENDCを使います。
以下に今回使用しているデータエリアの意味(使用目的)を示します。

ラベル
用  途

data_h:100位のデータを格納するエリアです。

data_t:10位のデータを格納するエリアです。

data_u:1位のデータを格納するエリアです。

cdisp_p :種別表示の表示スキャン位置を格納するエリアです。

ddisp_p:7セグメントLEDの表示スキャン位置を格納するエリアです。

rcv_p:受信データ数をカウントするエリアです。

r_category:受信した種別データの変換時に使用するワークエリアです。




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



初期化処理
;****************  Initial Process  *********************
電源投入後の初期化処理として以下の処理を行います。

ポートA、BおよびCのモード初期化

Aポートは種別指定および7セグメントLEDの表示桁指定用です。
全てデジタルモード(ADCON1)とし、出力モード(TRISA)にします。
Bポートは7セグメントLEDのセグメント制御用で、全て出力モードにします。(TRSIB)
CポートのRC0-RC3は種別表示のスキャン位置指定で出力モードに設定します。
RC7はデータの受信用なので入力モードにします。(TRSIC)


LED点灯制御スキャン用タイマーの初期化


LEDの点灯スキャンにはタイマー0を使用し、2_秒の周期を指定しています。プリスケーラを1:8にしているので、タイマー値を6にすると2_秒になります。タイマーは加算方式で256カウント目(255→0)でタイムアウト割り込みが発生します。
(256-6)×8=2000マイクロ秒。


ポートの初期化


Aポートのみを初期化しています。各ポートは初期化を行わない場合、"1"が出力されています。Bポート、Cポートはこの時点で初期化しなくても動作上には問題はありませんが、Aポートは種別表示の内容指定を行っています。種別を表示する際にはRA3,RA4,RA5のいずれかを"1"にする必要があります。Aポートを初期化しないとRA3,4,5全てが"1"の状態で、Aポートを初期化しないと種別表示に意味の無い表示がされてしまいます。


ワークエリアの初期化


LED表示データの初期化(消灯状態)、LEDスキャン位置情報、データ受信制御の初期化を行います。


USARTの初期化


USARTの設定に関するレジスタの多くはバンク1にあるので、バンク指定に気を付ける必要があります。
通信速度9600bps、非同期シリアル通信を指定しています。受信完了割り込みも可能にします。この受信完了割り込みは受信バッファにデータが受信された時点で発生します。
このUSART初期化処理の時点から受信機能は動作し始めます。


割り込み初期化


GIE、PEIE、T0IEを設定しています。受信完了割り込みを使うにはPEIEを設定する必要があります。

以上で初期化処理が終了しました。後は割り込みを待つだけなので、メイン処理としては同じアドレスを繰り返し実行させているだけです。オペランドの'$'は自分のアドレスを意味しています。'$+1'は自分のアドレスの次のアドレスを意味します。



割り込み処理
;***************  Interruption Process  *****************
今回のソフトでは2種類の割り込みを使用しています。TMR0のタイムアウトによる割り込みとデータ受信完了割り込みです。
TMR0の割り込みはINTCONレジスタのT0IFビット、データ受信割り込みはPIR1レジスタのRCIFビットで識別します。



異常割り込み処理
;********  Illegal interruption (For debugging)  ********
上記の2種類の割り込みに当てはまらない割り込みが発生した場合、LEDの1位に "E" の文字を表示して異常発生が分かるようにしました。この処理は通常は動作することはありません。用途としてはソフトウェアの動作確認に使えます。
ほとんどのソフトウェアの動作確認はMPLABのデバッグ機能を使用して確認することができますが、通信機能、データ入力などの確認はできません。ですから、確認は実際のPICにソフトウェアを書き込んで確認しますが、そのままでは正常に動作しているかどうか分からないので、チェックしたいロジックに goto illegal を入れておきます。例えば、データ受信処理の先頭の159行目に goto illegal を入れると、データ受信時に割り込みが発生しているかを確認することができます。ただし、処理は"E"を表示して停止するので、動作確認のあとに元の処理に戻しておく必要があります。



割り込み終了処理
;************  END of Interruption Process **************
割り込み終了割り命令(RETFIE)を実行し、次の割り込みを可能な状態にします。
割り込み時にレジスタ類の待避もしていないので他に何もすることはありません。



LED表示制御処理
;**************** LED control Process *****************
割り込みフラッグのクリア

TRM0により2_秒毎に割り込みが発生します。最初にINTCONCレジスタのT0IF割り込みフラッグをクリアします。これをしないと次の割り込みが所定の時間を待たずに発生してしまいます。また、TMR0のタイマー値の再設定も行います。


種別表示LEDスキャン制御


種別表示LEDの制御は2_秒の割り込み毎に1列ずつ行います。11列あるので、22_秒で種別文字の表示が行われます。列の指定はRCポートで行います。0で1列目、1で2列目の指定になります。ですから、処理位置を指定する値は一回毎に加算する方法を採用しています。繰り返しの処理で繰り返す回数を判断する場合、最初に繰り返し回数を指定し、一回毎に減算し、値が0になったときに終了と判断する方法のほうがあります。この方が終了判断の実行ステップ数が少ないのですが、今回は処理回数の値をそのままLEDの列指定情報に使うために加算方式とし、処理が終わる都度、規定回数に達したがを判断するようにしています。

7セグメントLEDスキャン制御


7セグメントLEDにより3桁の数字を表示しています。このLEDも2_秒毎に1桁ずつ表示するようにしています。表示対象桁の管理は種別表示と同様に加算方式を使いました。減算方式でも問題はありません。
7セグメントの桁指定はRA0,RA1,RA2で行います。でも、その上位のビット(RA3,RA4,RA5)は種別表示の指定で使用しているのでこの値を保持しながら、RA0-2を書き換える必要があります。そのため、まず、AND(論理積)を使用して種別指定データ以外を0にしています。ANDは対象データ(今回の場合はRAポートの内容と命令で指定される固定値)の各ビットが両方とも"1"の場合、結果が"1"になります。ですから、命令での固定値が"1"になっているビットは内容がそのまま変わらず、固定値が"0"のビットは必ず"0"になります。
次に7セグメントLEDの桁指定データをRA0-2に設定します。今度はOR(論理和)の演算を行います。ORは対象データのいずれかが"1"であったら、結果が"1"になります。言い換えると、命令での固定値が"0"のビットの内容はそのまま変わらず、固定値が"1"のビットは必ず"1"になります。ですから、RA0-2のうち制御したい桁に相当するビットだけを"1"にして他を"0"にすればよいわけです。
以上で桁指定が終了し、次に表示するセグメントデータをRBポートに書き込みます。これは、それぞれの桁の受信データ格納エリアの内容を読み出し、RBポートに書き込むだけです。RBポートへの書き込み処理は共通化をして処理ステップを減らしています。




データ受信処理
;***************  Data receive Process  *****************
制御装置からのデータ受信はこの処理により行われます。この処理はPIR1レジスタのRCIFビットによるデータ受信割り込みで起動されます。RCIFビットは他の割り込み表示ビットと違ってソフトウェアでクリアする必要はありません。RCRGEに受信されたデータを読み込むことでハードウェアでクリアされます。

オーバーランチェック

受信処理が間に合わず、受信バッファが満杯になるとオーバーラン状態になります。受信バッファは2段構成になっているので、今回の処理ではオーバーランが発生することは考えられません。安全のために設けられています。オーバーランが発生した場合には受信機能を一度止め、再度起動する必要があります。以上のことはオーバーランが発生した場合に必ず行う必要があります。
今回の処理ではオーバーランが発生したことが分かるようにその後に全ての表示を消しています。


フレームエラーチェック


フレームとは受信データのスタートビットからストップビットまでのことを言います。スタートビットは検出したけれどストップビットが検出されない場合にはフレームエラーが出ます。その後、正常なフレームが受信されれば、エラーは無くなります。今回の場合、フレームエラーが発生したときには表示を消すだけにしています。


先頭データ受信


制御装置から送られるデータは種別データを先頭に100位、10位、1位の数字データが順番に送られます。各々のデータにはデータの種類を表す情報は含んでいません。あくまで、受信する順番でデータの内容を決めています。ですから、制御装置は先頭を表すデータを最初に送り、それに続けて種別、100位、10位、1位の順でデータを送信します。受信処理では最初に先頭データを待ちます。受信位置が先頭データを示しているのに先頭データ以外が来た場合にはデータを破棄し、受信位置の更新は行いません。先頭データが正常に受信されると受信位置情報を更新します。

種別データ受信


先頭データに続いて種別データを受信します。制御装置から送られる種別データは制御装置側で使用する形式で送られてきます。ですから、そのままでは表示装置には使用できません。何が違うかと言うとビット構成も違うし、ビットの内容も違います。受信データではビット4-6が種別を表すデータです。そしてビット6が「聖」、ビット5が「典」、ビット4が「プ」を表しています。さらに、"0"が点灯、"1"が消灯を表しています。一方、表示装置ではビット3-5が種別を表し、ビット3が「聖」、ビット4が「典」、ビット5が「プ」に対応しています。また、"0"が消灯、"1"が点灯を表しています。この違いは各装置のハードウェアの違いによるものです。そのため、以上の違いを各ビット毎に判断して表示装置用のデータを作っています。

数字データ受信


種別データに続いて100位、10位、1位のデータを順番に受信します。これらのデータも操作装置の形式と表示装置の形式が違います。ただ、ビット位置は同じで、"0"と"1"に意味が逆です。操作装置では"0"が点灯、"1"が消灯ですが、表示装置では"0"が消灯、"1"が点灯を意味します。この"0"と"1"を反転するために排他論理和(Exclusive OR)という演算を行っています。排他論理和とは2つのデータを比べ値が同じであれば"0"を出力し、値が違う場合"1"を出力するという演算です。ですから、"1"と排他論理和をすると結果が反転します。例えば、受信データが'01001111'の場合、この値と'11111111'の排他論理和を行うと、一致している場合は"0"、一致していない場合は"1"ですから、結果は'1011000'になります。これは受信データの"0"と"1"を反転した値になります。変換した値をそれぞれの桁に対応する格納エリアに書かきます。

    実はこの処理は完全ではありません。データ受信が途中で止まり、それも正常にフレームが受信できた状態で止まると受信処理では次のデータを待ち続け、データを誤って受信する可能性があります。例えば、100位まで正常に受信できて通信が止まり、そのうちに再び先頭データから受信した場合、受信処理では先頭データを10位のデータ、種別データを1位のデータとして受信します。受信処理で1位の受信が終了すると先頭データ待ちになるので、その後の100位、10位、1位のデータは破棄されます。その後は正常に受信が行われます。
    今回の処理ではこれに関する処置は行っていません。発生する頻度も少なく、発生したとしても、再送信すれば正常に戻るため、あまり意味は無いと判断しました。



コーディングの終了
;********************************************************
;          END of signboard control processing
;********************************************************

        end
コーディングの最後は end命令 で終了します。endが無いとアッセンブラはコーディングの最後を検出できず。エラーになります。