第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ってのも、ヘン。まあ、内部のことだから、関係ないです。