【概要】
PICを使ってシリアル通信を行う時、USARTモジュールが内蔵されていない場合には、
プログラムでシリアル通信を実現する必要があります。
ここでは、標準ライブラリとして使用可能なアセンブラ言語によるシリアル通信プログ
ラムを目標にして作成しました。
マイクロチップ社のアプリケーションノートを参考に余分な所を削除し、安定な通信を
するための工夫を追加しました。
通信速度は300bpsから9600bpsまで対応可能で、パラメータを指定してアセンブル
し直せば速度変更が可能なようになっています。
【概略仕様】
通信仕様としては、下記の様に現在最も良く使われている内容に限定しています。
そのため、パラメータの数も最少になっており、速度指定のパラメータだけです。
(1)通信インターフェース仕様
・通信方式 調歩同期(一般の非同期方式です。)
スタートビット :1ビット固定
データビット :8ビット固定
ストップビット :1ビット(パラメータ修正で任意のビット数可能)
パリティ :なし
・ハードウェアインターフェース RS232C(一般のパソコンと同じ)
使用信号 :TX(送信データ)
RX(受信データ)
CTS(送信制御)(ハードウェア折り返しのみ)
RTS(受信制御)(ハードウェア折り返しのみ)
・通信速度 300、1200、2400、4800、9600の5種類
(ただし、マイコンのクロックが10MHzの時)
【想定回路構成】
ソフトウェアで実現するシリアル通信用の回路は至って簡単です。基本的にはPICに
RS232Cインターフェース用ICを組み合わせるだけです。
ここでは例題としてPIC16F84を使いました。
【RS232C通信プログラム】
ここで作成したシリアル通信のプログラムはタイマー割込みを使っています。従って
他の処理と並行処理が可能で、1個のデータの送受信が完了するまで他の処理を待た
せる必要が無く同時に並行して処理することができます。
まず通信処理ライブラリプログラムは大きく分けて4つの部分から構成されています。
(1)変数、定数定義、初期化部分
(2)送信処理部分(PUTCHAR)
(3)受信処理部分(GETCHAR)
(4)割込み処理部分(INT232)
プログラムは下記でダウンロードできます。MPLABでアセンブルして下さい。
★ シリアル通信ライブラリ(その1)プログラムリスト
(1)プログラムの流れ
(a)送信
PUTCHARがCALLされるとまずスタートビットを出力したあと、タイマー0を
セットし割込み待ちとします。
あとは一定時間後(1ビット分の時間)に割込みが入るのでデータを1ビット
づつ出力しては、タイマー0を再スタートさせます。最後のデータの終了割込
みの次にはストップビットを出力して送信が完了します。
(b)受信
GETCHARがCALLされると、まずスタートビットを検出して割込みが入る様に
タイマー0をウォッチドッグタイマーモードでカウンタをFFにセットします。
これで外部から1回でも立ち下がりのパルスが入るとカウンタがオーバーフロー
して割込みが発生します。つまりスタートビットが検出できることになります。
この割込みが入ったら10μsecのディレイ後にもう一度入力を読み込んで確かに
スタートパルスであることを確認します。もしスタートビットでなかったら
ノイズだったということで、何もせず再度スタートビットを待ちます。
スタートビットの確認が出来たら、今度は1ビット分よりやや長い時間をタイ
マにセットして割込みを待ちます。この割り込みが入ってきたらデータを入力
して第1ビット目のデータとして格納します。続いて1ビット分のタイマを
セットして次のビットの時間を待ちます。こうして割込みの都度順次データを
読込み最後のストップビットの確認が出来たら1個分のデータが受信完了とい
うことになります。これを図で示すと下図になります。
(2)使い方
この通信プログラムの使い方は簡単で下記の様にします。
(a)通信速度パラメータの指定とアセンブル
通信速度の指定には、BAUDRATEとBITTMRの2個のパラメータの指定をします。
このパラメータのデータは下表のようにします。
通信速度
(bps)BAUDRATE
BITTMR
(16進数)300
5
7E
1200
3
7E
2400
2
80
4800
1
84
9600
0
86
例えば9600bpsの時には下記のような記述としてアセンブルします。
BAUDRATE SET 0 ;preset to 9600bps
BITTMR SET 086H ;TMR0 DATA -122
(b)送信する時
送信の時には、まず送信するデータをTXREGにセットしてからCALL PUTCHARで
送信処理をCALLします。 例えば下記の様にします。
MOVLW "1" ;SEND 1
MOVWF TXREG
CALL PUTCHAR ;send data
そしてこの後は他の処理に移って構いません。送信完了を確認するには、TXBUSY
をチェックすることで行います。
WAITLP
BTFSC TXBUSY ;check end of send
GOTO WAITLP
(c)受信する時
受信も割込みで実行されていますから、任意の時点で受信することができます。
この受信をするためには、まずGETCHARをCALLします。これはどこで実行しても
構いません。 そして実際の受信データを受け取ったかどうかは、RECVをチェック
することで行います。データ受信があった場合には、このデータが正常に受信した
ものかどうかをERRORをチェックすることで確認します。正常な時にはRXREGに
データが格納されていますのでこれをとりださします。例えば下記の様にします。
まずプログラムの最初の方でGETCHARをCALL
CALL GETCHAR ;start receive
(この後は他の処理を実行して構わない)
受信データ有無をチェックする。
RCVWAIT BTFSS RECV ;wait received
GOTO RCVWAIT
BTFSC ERROR ;error check
GOTO ERR
MOVF RXREG,W ;get data
実際にこの形の処理では常時RECVをチェックしなければならないので、並行処理
ではなくなってしまいます。プログラムの完全な割込みによる並行処理をする場合
には、受信処理部分の最後である「stop bit process」で受信処理のプログラム
をcallするように追加します。