PIC16F84と液晶表示器を組み合わせた端末で
パソコンとはRS232Cのシリアル通信で接続
300bps〜9600bpsの通信速度で送受信が可能
1.概要
PIC16F84を使ってシリアル通信を行う時の標準ライブラリとして使用可能な
プログラムを目標にして作成しました。
マイクロチップ社のアプリケーションノートを参考に余分な所を削除し、
安定な通信をするための工夫を追加しました。
通信速度は300bpsから9600bpsまで対応可能で、パラメータを指定してアセン
ブルし直せば速度変更が可能なようになっています。
2.仕様
通信仕様としては、下記の様に現在最も良く使われている内容に限定しています。
そのため、パラメータの数も最少になっており、速度指定のパラメータだけです。
(1)通信インターフェース仕様
・通信方式 調歩同期(一般の非同期方式です。)
スタートビット :1ビット
データビット :8ビット
ストップビット :1ビット
パリティ :なし
・ハードウェアインターフェース RS232C(一般のパソコンと同じ)
使用信号 :TX(送信データ)
RX(受信データ)
CTS(送信制御)
RTS(受信制御)
・通信速度 300、1200、2400、4800、9600の5種類
(ただし、マイコンのクロックが10MHzの時)
(2)機能仕様
通信の確認が出来るレベルの機能に限定していますので、簡単な機能のみです。
・3個のスイッチを押すとそれぞれに対応して「1」「2」「3」のデータを
パソコン側へ送信出力する。
・そのまま今度はパソコンから1文字送られて来るのを待ち、受信したデータ
を液晶に表示する。
・スイッチが押されたままであれば上記を繰り返します。
3.回路構成
回路としては至って簡単です。PIC16F84と液晶表示器、それにRS232Cインター
フェースの3つを組み合わせただけです。
電源としては3端子レギュレータを使い、入力はDC6V〜12V位でOKです。
回路図は下図の様になっています。 CTSはそのままRTS信号として折り返
しています。CTSやTX,RXにある括弧内の番号はRS232C用の25ピンの
コネクタの接続先ピン番号です。
(2002/8/25)
(注) 下記回路図でMAX232の2ピンのコンデンサの接続は間違いです
正しくは向きを逆にしてGNDを電源の5Vに接続します。
また下記ファイルは回路図とパターン図の原図です。HiWIRE2でご覧下さい。
★RS232C端末回路図
★RS232C端末パターン図
4.プログラム
ここで作成したシリアル通信のプログラムはタイマー割込みを使っています。従って
他の処理と並行処理が可能で、1個のデータの送受信が完了するまで他の処理を待た
せる必要が無く同時に並行して処理することができます。
まず通信処理のプログラムは大きく分けて4つの部分から構成されています。
(1)変数、定数定義、初期化部分
(2)送信処理部分(PUTCHAR)
(3)受信処理部分(GETCHAR)
(4)割込み処理部分(INTERRUPT)
プログラムは下記でダウンロードできます。MPLABでアセンブルして下さい。
シリアル通信端末プログラムリスト
(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個のパラメータの指定をします。
このパラメータのデータは下表のようにします。
通信速度 |
BAUDRATE |
BITTMR |
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 BTFSC RECV ;wait received
GOTO RCVWAIT
BTFSC ERROR ;error check
GOTO ERR
MOVF RXREG,W ;get data
実際にこの形の処理では常時RECVをチェックしなければならないので、並行処理
ではなくなってしまいます。プログラムの完全な割込みによる並行処理をする場合
には、受信処理部分の最後である「stop bit process」で受信処理のプログラム
をcallするように追加します。(リスト中にコメントで注記してあります)
4.外観構成
以下の写真が外観ですが、今回は通信プログラム試験用のものということで、特にケース
には入れていません。
写真には有りませんが、外部コネクタとして25ピンのDSUBコネクタをRS232C用との
接続用として本体右下にあるコネクタと接続しています。
全体の外観です。右下のコネクタで通信用コネクタと
スイッチをつなぎます。
PICなどは液晶表示器の下側に実装されています。
上側の液晶表示器を取り外したところです。液晶表示器は
コネクタで接続するようになっています。
RS232C用のIC(MAX232)用のコンデンサは背が高いので
寝かせて取り付けています。
実装状態を横から見たもので、液晶表示器の下に部品が
実装されているのが良く分かると思います。