目次PIC入門873ハード


PIC16F873の非同期通信(USART)
このページではPIC16F873が装備している2種類の汎用通信ポートのうちの
USART(Addressable Universal Synchronous Asynchronous Receiver Transmitter)について説明します。
USARTでは以下の通信モードで使うことができます。
非同期通信
同期通信[マスター]
同期通信[スレーブ]
(全二重通信)
(半二重通信)
(半二重通信)

USARTによる通信では通常は1つのデータブロックは8ビットで構成されますが、
マルチプロセッサ通信のアドレス指定をするために9ビットの構成にすることもできます。

このページでは非同期通信について説明します。



非同期通信とは
    データ通信を行う場合、送り側から出された"0"と"1"の状態を受信側で認識できる必要があります。
    非同期通信では転送されるデータ(8ビットまたは9ビット)の先頭にスタートビットを付け、データの最後にストップビットを付けてデータの区切りとして使います。スタートビットはLレベル、ストップビットはHレベルの信号です。
    データを転送していない状態では回線をHレベルにしておきます。この状態からLレベル(スタートビット)になると受信側はデータ転送が開始されたとみなします。その後、通信速度に従い、データの授受が行われます。最後にストップビット(Hレベル)を検出して1ブロックの転送が終了します。通信速度は送信側、受信側それぞれ独立したタイマーで制御します。ですから、このタイマーがずれていると正確な通信ができません。
    非同期のUSARTでは送信用にTXポート、受信用にRXポートを使用するので、同時に送受信を行うことができます。(全二重通信)




ポートの指定
非同期通信ではデータ送信にRC6/TX/CK(17ピン)を使い、データ受信にRC7/RX/DT(18ピン)が使われます。USARTを使用するためにはTXポート、RXポートの入出力モードをTRISCレジスタに設定します。Cポートのビット6を"0"にして出力モードとし、Cポートのビット7を"1"にして入力モードにします。

RC6およびRC7をUSARTポートとして使用するためにはRCSTAレジスタのSPENビットを"1"にする必要があります。




非同期通信の指定




通信速度の指定
    USART通信の通信速度はBRG(Baud Rate Generator)で制御されます。BRGは非同期通信でも同期通信でも使用されます。
    BRGを制御するレジスタとしてSPBRGレジスタがあります。8ビットのフリーランタイマーを制御するためのレジスタです。非同期通信の場合、TXSTAレジスタのBRGHビットの指定も通信速度の制御に使われます。
    SPBRGレジスタに値を書き込むとBRGタイマーはリセットされます。
通信速度とPICのクロック周波数は以下の式で計算できます。
通信モード低速指定 (BRGH=0)高速指定 (BRGH=1)
非同期(SYNC=0)Fosc/( 64( X + 1 ))Fosc/( 16( X + 1 ))
同期(SYNC=1)Fosc/( 4( X + 1 ))

FoscはPICのクロック周波数(Hz)です。
X はSPBRGレジスタの値で0から255の値です。

SPBRGレジスタの設定値の詳細は「SPBRGレジスタによる通信速度」を参照して下さい。





送信回路動作
USARTで非同期送信を行う場合にはRCSTAレジスタのSPENビットを"1"にしてRC6ポートをTXポートにします。
TXREGレジスタに送信データを設定するとハードウェアでTSR(Transmit Shift Register)に取り込まれ、TXポートから送信されます。データの送信はTXSTAレジスタのTXENビットを"1"にすることにより行われます。
送信は最下位ビット( LSb : Least Significant bit )から先に送信されます。
TXREGの内容がTRSに送られるとPIR1レジスタのTXIFビットが"1"になり、割り込みが発生します。ただし、PIE1レジスタのTXIEビットが"1"になっている必要があります。この割り込みはTXREGの内容がTSRに送られ、TXREGにデータが書き込み可能になったことを意味します。この割り込みを検出してTXREGに次のデータを設定すれば連続的にデータを送信することができます。(Back to Back) TXIFビットはソフトではクリアできません。TXREGにデータを書き込むとクリアされます。
TSRレジスタのデータが送信されるとTXSRAレジスタのTRMTビットが"1"に設定されます。このビットには割り込み機能は無いので、TSRレジスタの空きを確認するのにはTRMTビットを周期的に確認する必要があります。
TSRレジスタはデータメモリにはないので、このレジスタの内容を直接操作することはできません。通信速度はBRG(Baud Rate Generator)で制御されます。
データの誤りチェックのために使用するパリティビットはハードでは作られません。必要な場合にはソフトウェアで作る必要があります。パリティビットを9ビット目に付けることができます。その場合、TXSTAレジスタのTX9Dビットにパリティビットの内容を設定し、TX9ビットを"1"にすることにより、パリティビットを含んだ9ビット長のデータが送信されます。TX9Dビットの設定はTXREGにデータを設定する前に行う必要があります。TXREGにデータを書き込むと直ちに送信が開始され、そのときTX9Dにデータが設定されていないと正常に送信されません。
データを送信中にTXENビットをクリアすると送信回路はリセットされ、RC6/TX/CKピンはハイインピーダンス状態になります。


非同期通信の送信を行うときには以下のような手順で行います。
1. SPBRGレジスタに通信速度を設定します。
高速通信を行う場合にはTXSTAレジスタのBRGHビットを"1"にします。
2.TXSTAレジスタのSYNCビットを"0"にし、RCSTAレジスタのSPENビットを"1"にして非同期通信モードを設定します。
3.TXREGレジスタへの書き込み可能割り込みが必要な場合にはPIE1レジスタのTXIEビットを"1"にします。
4.9ビット送信が必要な場合にはTXSTAレジスタのTX9ビットを"1"にします。
5. TXSTAレジスタのTXENビットを"1"にして、送信可能状態にします。
この時点ではTXREGレジスタは書き込み可能状態なので、PIR1レジスタのTXIFビットも"1"になります。
6.9ビット送信の場合、TXSTAレジスタのTX9Dビットに9ビット目のデータを設定します。
7.TXREGレジスタにデータを書き込みます。これにより送信が開始されます。






1ワードの送信タイムチャート


連続送信(Back to Back)のタイムチャート









受信回路動作
USARTで非同期送信を行う場合にはRCSTAレジスタのSPENビットを"1"にしてRC7ポートをRXポートにします。
RXポートで受信されたデータはデータ補正回路を通りRSRレジスタで受信されます。RXポートのデータはHレベルまたはLレベルの判定を行うために3回サンプリングされます。受信データはSPBRGレジスタおよびTXSTAレジスタのBRGHビットで指定される通信速度に従ってRSRレジスタに格納されます。
ストップビットを検出するとRSRレジスタの内容はRCREGレジスタに転送されます。RCREGレジスタにデータが格納されるとPIR1レジスタのRCIFビットに"1"が設定され、割り込みが発生します。割り込みを発生させるためにはPIE1レジスタのRCIEビットを"1"にしておく必要があります。
RCREGレジスタは2段のFIFO(First In First Out)バッファで構成され、2ブロック分のデータを格納することができます。ソフトでの取り込み処理が多少遅れた場合の保護のためです。RCIFビットは読み取り専用のビットでRCREGレジスタが全て読み出された場合にハードウェアで"0"にされます。
RSRレジスタで受信が完了したときRCREGレジスタが2つとも一杯(読み出されていない)場合にはRCSTAレジスタのOERRビットが"1"になり、オーバーランエラーが発生したことが表示されます。このときRSRレジスタに格納されたデータは無くなります。また、これ以降の受信動作は行われなくなります。この状態を正常に戻すのは一度RCSTAレジスタのCRENビットをクリアし、再びセットします。これによりOERRビットもクリアされます。
RSRレジスタでフレームエラーが検出するとRCSTAレジスタのFERRビットがセットされます。RCSTAレジスタに格納されるRX9DビットとFERRビットは1ブロックのデータを受信する都度書き換えられます。ですから、RCREGレジスタの内容を読む前にRCSTAレジスタを読み込んでFERRビットをチェックする必要があります。エラーフレームの後に正常なフレームを受信した場合、FERRの情報は消えてしまい、正常なデータを受信できたのかどうかが分からなくなります。




非同期通信の送信は以下のようなステップで行われます。
1. SPBRGレジスタに通信速度を設定します。
もし、高速通信が必要ならTXSTAレジスタのBRGHビットを"1"に設定します。
2.TXSTAレジスタのSYNCビットを"0"にし、RCSTAレジスタのSPENビットを"1"にして非同期通信モードを設定します。
3.RCREGレジスタへのデータ格納割り込みが必要な場合にはPIE1レジスタのRCIEビットを"1"にします。
4.9ビット受信が必要な場合にはRCSTAレジスタのRX9ビットを"1"にします。
5.RCSTAレジスタのCRENビットを"1"にすると、受信可能状態になります。
6.受信が完了するとPIR1レジスタのRCIFビットが"1"に設定され、PIE1レジスタのRCIEビットに"1"が設定されていれば、割り込みが発生します。
7. RCSTAレジスタを読み、受信途中にエラーが発生していないかどうかを確認します。(OERR、FERR)
また、エラーが無く、9ビット受信の場合には9ビット目のデータを読み込みます。
8.RCREGレジスタから8ビットの受信データを読み込みます。
9.もし、エラーがあった場合には、RCSTAレジスタのCRENビットをクリアしてエラーを消します。



連続受信タイムチャート



このタイムチャートではオーバーランが発生する状況を表しています。
通常の動作ではRCIFの割り込みでRCREGの内容を読み出せば、オーバーランは発生しません。



    アドレス検出

      9ビット目をアドレスデータ検出用に使用することができます。このアドレスデータの使い方は私にはよく分かりません。
      動作は以下のようになります。この動作は9ビット転送で有効になります。
      RCSTAレジスタのRX9ビットおよびADDENビットを"1"にします。このようにすると9ビット目のデータが"1"の場合だけ、受信したデータがRCREGレジスタに格納されます。9ビット目が"0"のデータは格納されません。