PICマイコンを使って測定ツールを作ってみよう(6) ―― PIC12F1822を搭載したRS-485ネットワーク対応のセンサ基板を作成
●待望のUART機能がPICマイコンに
UARTほど,8ピンのPICマイコンに待望されていた機能はないでしょう.もちろん9600bpsぐらいの速度であれば,普通のI/Oピンを使い,プログラムでUART機能をエミュレートできます.秋月電子通商の最初のシリアル表示基板キットも,PIC16F84でUART信号を作っていました.しかし,ソフトウェア処理の負荷が重く,他の割り込み処理とも衝突する場合には,できるだけハードウェアでUART機能を実現したいものです.
PIC12F1822には,周辺回路としてUART機能が実装されています(図15,図16).レジスタ構成も18ピンのPICマイコンなどと同じで,PIC18F2550向けに作ったプログラムをほとんど修正なしに使えました.PIC12F1822のUARTのレジスタはEUSARTと呼ばれています.通常のUARTと少し違っていて,非同期通信だけでなく,同期通信も行えます.
図15 送信ブロック
図16 受信ブロック
また,FIFO(First-in First-out)メモリが2本あり,RXピンから入力されたシリアル・データは,シリアル-パラレル変換レジスタでパラレル値に変換され,いったんFIFOメモリに蓄えられます.このときRCIFの割り込みフラグが1になり,割り込みが起きます.
読み出すときはFIFOメモリからRCREGに送られます.何らかの理由でRCREGの読み出しが行われないときは,2本のFIFOメモリがいっぱいになり,3個目のデータが来たときにオーバラン・エラー割り込みが起こります.つまり,データ2個までは,読み出ししなくても,ほかの仕事ができるわけです.FIFOメモリへの転送時にはRCIDLフラグがONになるので,この回数を数えておけばエラーが起こる前に読み出すことができます.今回はそれほど忙しくないので,RCIFの受信割り込みが起こるたびにRCREGを読み出しており,FIFOメモリにたまることはありません.
UARTの送受信制御レジスタは「CON」とつくものがなくて,TXSTAとRCSTAしかありません(図17,図18).STAは「STATUS&CONTROL」の略だと思いますが,呼び名に不統一さを感じます.それに,STATUSレジスタの中に制御ビットがあるのも不自然です.STATUSレジスタは状態表示レジスタなので,状態表示フラグだけを集めておけばいいのに,と思ってしまいます.
図17 TXSTAレジスタ
図18 RCSTAレジスタ
UART独特のレジスタは,ボーレート設定レジスタ(BAUDCON)です(図19).UARTにはいろいろな速度があり,このボーレート設定レジスタでその速度を決めます.もともとはシステム・クロックであり,これを分周して作ります.そのため,どうしても周波数として半端な値になり,受信エラーの原因となります.
図19 BAUDCONレジスタ
PICマイコンのデータシートには,各通信速度のエラーレートが表にまとめられています(図20).
図20 ボーレート設定表
非同期通信の場合,1バイトごとに少しの待ち時間を入れて送れば,受信エラーはなくせます.しかし,実効通信速度は落ちます.ここらへんは速度とエラーレートのトレードオフとなります(図21).
図21 非同期受信のダイアグラム(オーバラン・エラーの発生)
今回は速度が9600bpsで,1秒で送るデータも1個だけなので,待ち時間を送信時間と同じくらいとっています.つまり,実効通信速度は4800bpsです.