PIC16F1938でシリアル通信

マイコンで最初に行うのがポートのON/OFF確認。
それで、次に出来るようにならないといけないのがシリアル通信で、printf(””);が使えるようになること。
これが出来ないと、A/D変換、I2C、SPIを使用したときの動作確認が面倒になる。

マイコンとPC間の通信ははUSBシリアル変換モジュール「FT232RL」を使用します。
「FT232RL」を使用した商品は多数ありますが、どれでも問題無いと思います。

ここでは自分が作ったFT232RL専用基板を使います。
http://cat0048.my.coocan.jp/USB-USART/USB-USART1.htm
信号の接続はクロスするように接続してください。

PIC側 TX(RC6) −−−−→ RXD  FT232RL側
     RX(RC7) −−−−→ TXD
       GND  −−−−→ GND

ついでに、内臓EEPROMの動作確認と、ポートBを入力にして入力内容をシリアル通信にて表示します。

ポートBを入力ポートにして気づいたのですが、ポートBのRB7とRB6はプログラムの書き込み時に使用します。
このポートが別の装置などに接続されていると、書き込み時に影響が出て書き込み出来ない場合があります。
書き込み時はRB6とRB7には何も接続しないでください、また書き込み後は書き込み装置は外してください。

サンプルプログラムはここ、(zipファイル)


通信速度のボーレートが結構面倒です。
”9600bps”と書くだけで済むなら簡単ですが、XC8コンパイラーでは’SPBRG’レジスタにボーレートに合う数値を設定しないといけない。
(ちなみにCCSコンパイラは簡単です、というかマイクロチップ製のコンパイラ以外は簡単・・・・・)

私の場合こんな感じで計算しています。

BRGH=1の高速モード、システムクロック8MHz、ボーレート19200bps を設定したい。

システムクロック÷ボーレート÷16X4−1

8000000 ÷ 19200 ÷ 16 X 4 −1
=103    SPBRG = 103

BRGH=0の低速モード、システムクロック4MHz、ボーレート1200bps を設定したい。

システムクロック÷ボーレート÷16X4−1

4000000 ÷ 1200 ÷ 16 X 4 −1
=207.333    SPBRG = 207

SPBRGレジスタは8Bitなので255以上の設定は不可ですので注意してください。



ターミナルソフトは「Tera Term」を使用します。
設定は下の通り。


サンプルプログラムをビルドしてマイコンに書き込み込めばターミナルソフトに数列、文字列が表示されます。
EEPROMに書き込んでだ値が正常に読み込みできる事が確認できます。
後は、繰り返しポートBの入力状態を表示します。


次は受信テストです。 まず割り込み無しで行います。
サンプルプログラムはここ (zipファイル) 
ターミナルソフトにて文字を送信するためにキーを1文字打ち込みます。(ここでは’q’)
打ち込んだキーの文字が表示されます。
rxdata1 = q
rxdata2 = q

今度は、2文字続けて打ち込みます。(ここでは、’rg’)
rxdata1 = r
rxdata2 = g

今後は、3文字以上を続けて打ち込んでみてください。
たぶん、
rxdata1 =
rxdata2 =
を表示したあと、”RCIF = 0”の表示が続いてキーを受け付けなくなります。
これは、バッファからデータが漏れ受信エラーを起こしているためです。
この場合、いったんUARTを無効化して再初期化設定が必要です。

シリアル送信設定用レジスタ"RCSTA"を読み込んで確認すると92hになっているはずです。
それでプログラムで

RCSTA = 0x80;
RCSTA = 0x90;

と操作するとまた受信出来るようになります。

データの取りこぼしが無いようにするには、
2バイト程度の受信を間を置いて行う。(バッファのデータをすべて抜く余裕のある処理)
データの取りこぼしが起こらないような通信スピード、受信処理を行う。
送信側と制御を行いながら通信を行う。(フロー制御)
必要があります。

シリアル通信の受信は割り込みを使った方が無難です。

サンプルプログラムはここ (zipファイル)
リターンキーの改行コードには’CR’と’LF’を設定できますが、今回のサンプルプログラムは’CR’のみ設定してください。


通常は他の処理をしていてかまいません、キーボードから適当にキーを押して
最後にリターンキーを押すと今まで押したキーの文字が表示されます。

データを受信中も他の処理が出来ますが、リターンキー(CR)が押されたフラグを監視する必要があります。



割り込みを使った場合、不要な受信も受けてしまいますので無視したい場合は一旦
 RCSTA = 0x80; 
と、操作すると一切受け付けなくなります。


応用例として「バーコードリーダー」を使ってみます。出力は’RS−232C’のものです。


PIC等のマイコンで読み込む場合は、レベル変換が必要となります。





シリアル通信を行うプログラムを書いたとき、シリアルのTX・RXのあるポートCの操作は注意してください。
ポートC全体を操作するような事はやらない方が無難です。(PORTC =0xFF など)
シリアル通信でゴミが発生する可能性があります。

あと、
シリアル通信のテスト中怪奇現象が起こりました・・・、
マイコンの電源は外している、PICkit3も外しているのにLEDが点滅するのです???
原因はFT232RLはUSBにつながっていますので、PCの電源がUSBからFT232RLへRX・TXを経由して
マイコンのポートへ電気が流れてマイコンが動作して、不安定な動作を繰り返している為です。

FT232RLの電源はUSBからでなくマイコンと同じ電源から取るほうが無難です。

メインへ