PICでシリアル通信(送信)する

はじめに

Arduinoでシリアル通信をするには、RXとTXを相互に接続してSerial.printlnを使うだけで出来てしまうが、PICだとそうもいかないので、PICでのシリアル通信を体験してみる。

今回用意するのは

UART

PICにはUARTというシリアル通信用のモジュールがあり、シリアル通信のルールなども規定されている。

www.rohde-schwarz.com

実装

シリアル通信で送信する時に設定するレジスタは、シリアル通信自体の許可と、シリアル通信の送信(TX)の許可、高速モード設定、非同期モードの設定を行う。そして最後はボーレートの設定を行う。

ボーレートはデータシート上で設定値がいくつかあるが、非同期モードかつ高速モードでの設定値を確認する。該当箇所は以下の部分

f:id:kyonta1022:20211104210642p:plain

レジスタの設定

// bit7 SPEN: Serial Port Enable bit
RCSTA = 0b10000000;
// bit5 TXEN: Transmit Enable bit
// bit4 SYNC: USART Mode Select bit 0(SYNC: USART Mode Select bit)
// bit2 BRGH: High Baud Rate Select bit 1(High speed)
TXSTA = 0b00100100;
// USART Baud Rate Generator ASYNCHRONOUS MODE (BRGH = 1) 9600bps 4MHz
SPBRG = 25;

実装はこんな感じになる。

gist.github.com

回路図

Arduino側で通信内容を確認するようにしていたのだが、ここでめっちゃ嵌った。 嵌った部分としては、PIC側への電力はACアダプタから供給していたのだが、Arduino側の電圧とPIC側の電圧が微妙に異なっており、何度やってもArduino側で通信の受信結果を確認できなかった。プログラムを疑って色々変えたが何も変わらず、UARTによるデータ通信で気をつけること | hiro345 に載っていた「電圧が一致していないマイコン間の接続」の部分を見直してみたらシリアル通信が正常に通るようになった。

なのでPIC側への電力供給はACアダプタからでなく、Arduino側の5VとGNDを使用する。

f:id:kyonta1022:20211103212618p:plain

まとめ

基本はこれだけで通信可能となるが、送ってる途中でたまに文字化けする文字がある場合は、まず電圧を疑う....電圧問題はあったが、レジスタの設定さえちゃんとすれば、PICでも簡単に実現できた。