第20週 シリアル通信
よそんちの娘の話。
遊び呆けて毎晩帰るのが遅くなかなか捕まらない東京に住む娘を、ときたま携帯で捕まえては「夕べは何時に帰ったんだよっ」と叱りつけている田舎のお父さん。もちろん、親の小言を電話で言ったところで聞くはずもありませんが。
そこでちょっと作戦を変えて、今日こそは1発かましてやろうと「今朝は何時に帰ったんだよっ」と言い方を変えて不意打ち食らわせてやりました。
バカ娘、ひるむかと思いきや、「う〜ん、帰ってない」だと。
1発かますつもりが、1発かまされてしもた。(^^;
あ、言っときますけど、これ、よそんちの娘の話ですからね。
シリアル通信
製作したテスト回路の機能のうち、最後に残ったシリアル通信に挑戦です。
パソコン側で入力した文字をRS232Cで受信し、LCD表示器に表示したうえで、パソコンに「OK!」と返す。なんか意味アルかと言われても、困る。(^^;
機能
(1) パソコンとPICをつなぐ。
(2) パソコン側で入力した文字をCRT表示し、[CR]入力したら、あるいは32文字を越えたらPIC側に送る。
(3) PIC側で受けた文字をLCD表示器に表示。([CR]は削除)
(4) PIC側から「OK!」の文字を送る。
(5) パソコンで「OK!」をCRT表示。
モード
非同期モード 通信速度9600bps 8ビットデータ パリティなし 1スタートビット 1ストップビット
USART動作
データブックをかいつまんで覚えとしておおまか整理すると
(1) 受信
データの流れ
シリアル入力RXピン --> RSR(Receive shift reg.) --> RCREG --> データ
コントロールの流れ
1.スタートビット検出でシリアルデータをRSRレジスタに取り込み。
2.ストップビット検出でRSRに貯まったデータバイトをRCREGに転送。
3.PIR1レジスタのRCIFビットが立つ。(ここまではPICがやる。)
4.RCIFビットを見てデータ読み込み。(ここはプログラムが管理、つまり私がやる。)
ここでちょっとしっくりこなかった点があります。
連続的に受信できるようにRCREGは2個あるらしいのですが、これがアドレスは1つでFIFO(先入れ先出し)に
なっているらしいです。
先ほどのRCIFビットは英文ではFULLとEMPTYですがFULLの意味は満杯ではなくて有効なデータがあると
いうことのようです。(和訳データではこのあたりのことを空と満了ではなく「空」と「フル」と苦しい訳し方をしています。)
(2) 送信
データの流れ
データ --> TXREG --> TSR(Transmit shift reg.) --> シリアル出力TXピン
コントロールの流れ
1.TXSTAレジスタのTRMTビット1:TSR空
2.TXREGにデータ書き込み(ここまではプログラムが管理、つまり私がやる。)
3.TXREGのデータはTSRの転送されてシリアルデータとして順次出力される。(ここからはPICがやる。)
4.シリアル出力が完了するとTRMTビットが立って1.に戻り次のデータ書き込みができる。
ここではTSRが空になるまで次のデータ書き込みを待ちますからTXREGが役立たずです。
ここでもう一つTXREGの空を示すPIR1レジスタのTXIFビット(送信割り込みフラグ)を見ればもっと早く
次のデータを書き込めるみたいです。でも、割り込みなんていうから近づかない。(^^;
設定
必要なレジスタの設定
TXSTA 送信関連
Bit6 TX9=0:8ビット送信
Bit5 TXEN=1:送信イネーブル
Bit4 SYNC=0:非同期モード
Bit2 BRGH=1:高速bps
RCSTA 受信関連
Bit7 SPEN=1:受信イネーブル
Bit6 RX9=0:8ビット受信
Bit4 CREN=1:連続受信可(ちょっと意味不明)
SPBRG ボーレート発生レジスタ
BRGH=1の場合SPBRG=129で9600
1.ステッピングモータ回路のポートは 一応出力としておく。不使用
2.アナログ回路は一応プログラム初期 設定で入力にしておく。不使用。 3.パソコン側はモード、速度等を合致 させて、キーボード入力で[CR] までをそのままシリアル送信させ、 また、受信したらそのままCRT に表示するプログラムにしておく。
プログラムはこちら
特にややこしい箇所はありませんが、LCDが[CR]コードをヘンな表示してしまうのでこれは表示プログラムで
捨てるようにしました。
一応エラー処理なんか入れてみたのですが、エラーが起こらないのでチェックできません。いいのやら、ダメなのやら。(^^;
パソコンの上半部分が入力文字表示、下半部分がPICからのリターン文字表示。
LCDはパソコンからの文字を16文字で折り返して表示している。表示後おくった「OK!」はCRTに表示されている。(^^)(^^)
【今週のなるほど】
受信のRCREGは2個ある。
アドレスは1個だから、ヘン。2個のうち1個にデータがあるとFULLってのも、ヘン。まあ、内部のことだから、関係ないです。