UARTで通信のテストを行ってみました。個人的な備忘録になります。
使用部品
- PIC 16F13145
- CH340E 秋月電子で購入:CH340E USBシリアル変換モジュール Type-C
- タクトスイッチ(動作確認用)
- 10 kΩ抵抗器
- ブレッドボード
- LED(動作確認用)
- パソコン(TeraTermを使用)
MCCの設定
UART通信を行うためにMCCでUARTドライバーを追加しておきます。図1の様にAdd Component若しくはDrivers & Peripheralsをクリックし、検索欄にUARTを入力して図2の赤丸をクリックします。


UARTを追加すると図3の様にUART1が追加されるのでUART1をクリックして右側のツールバー内のInterrupt Drivenを有効にしておきます。ボーレート(設定値:9600)やデータサイズなど他の項目はデフォルトの値にしています。

次にピン入力設定を行います。図1の画面上にあるPinsかPin Package Viewタブから必要な割り当てを行います。今回はUARTを追加したので図3の下側にEUSART1の項目が追加されています。受信と送信の動作を確認したいのでRX1(受信用)をPORTBの5番(RB5)・TX1(送信用)をPORTBの6番(RB6)に割り当てました。また送信ボタン入力用にPORTAの0番(RA0)を入力とし、動作確認用にPORTCの0番(RC0)を出力(LED1)として割り当てています。

設定が終わったらProject ResourceからGenerateします。
プログラム
main.cに下記のコードを記述しました。
#include <string.h>
#include "mcc_generated_files/system/system.h"
void sendhello();
void main(void)
{
SYSTEM_Initialize();
INTCONbits.GIE = 1;
INTCONbits.PEIE = 1;
uint8_t data;
while(1)
{
if(RA0 == 1){
sendhello(); //送信ボタンを押したときに文字列を送信する
}
if(EUSART1_IsRxReady()){
data = EUSART1_Read(); //入力値を読み込む
for(uint8_t i = 0 ; i < data ; i++){
LED1_Toggle();
__delay_ms(100); //指定回数だけLEDを点滅させる
LED1_Toggle();
__delay_ms(500);
}
if(EUSART1_IsTxReady()){
EUSART1_Write(data); //入力値の確認用
}
}
}
}
void sendhello(){
char msg[] = "Hello World\r\n";
for(uint8_t i = 0; i < strlen(msg); i++)
{
if(EUSART1_IsTxReady()){
EUSART1_Write(msg[i]); //LEDを点滅させながら文字を出力
}
LED1_SetHigh();
__delay_ms(100);
LED1_SetLow();
__delay_ms(100);
}
}
マイコンからパソコンへのUART通信はEUSART1_Write()で実装しています。パソコンからマイコンへはEUSART1_Read()で実装しています。EUSART1_Write()やEUSART1_Read()は1バイトずつ読み書きするためHello Worldのような文字列はfor文で1文字ずつ送信しています。受信に関しては、1文字(1バイト)のみなので1度だけ実行する形になっています。またUARTの動作確認が目的のためボタンのチャタリング対策は考慮していません。EUSARTの関数は下記リンクを参考にしました。
下記はMicroChip社のリファレンスになります。
組み立てた回路と外観
回路実装
図5のような回路を作りました。

完成したものは図6に示します。

TeraTerm設定
そのままではCH340は使用できないのでまず下記メーカーサイトからドライバーを入手してインストールします。
ZIPファイルの中のSETUP.exeを実行してINSTALLを押すとドライバーが入ります。
CH341SER.ZIP – Nanjing Qinheng Microelectronics Co., Ltd.

TeraTermを起動する前にCH340をUSB接続します。TeraTermを起動すると接続先を聞かれるので画面下側のシリアルをクリックしてCH340と表示されているポートを選択します。

TeraTermの設定タブからシリアルポートをクリックすると図7の画面が表示されます。マイコン側(MPLAB XのMCC)のUART設定でボーレートや他の設定を変えている場合はTeraTerm側もそれに合わせて設定を変更します。通信設定が同じでないときちんと通信ができません。

TeraTermの端末画面(黒い画面)でマイコン側に設けたボタンを押すと端末画面にHello Worldが表示されると思います。またその画面でパソコンの任意のキーボードのキーを押すとそのキーに対応したASCIIコードがシリアルポートから送信されます。今回のプログラムでは指定回数だけマイコンのLEDを点滅させる動作をさせようとしたのですが上記の仕組みから意図した点滅動作か分かりづらくなりました。ASCIIコードは1バイトのため入力したキーとASCIIコードを照らし合わせれば意図したものかは判断できますが、折角なのでマクロ機能を使用して任意の数字(16進数)を送るようにしました。
調べてみるとTeraTermのマクロ機能を利用すればASCIIコードのデータではなく任意のデータを送れることが分かりました。マクロ機能を使用するために次の文字列をメモ帳に貼付して拡張子をttlにして保存しました。このデータをマイコン側に送ればLEDは5回点滅するはずです。
send $05
setdebug 2


TeraTermでマクロを使用するにはコントロールからマクロをクリックして先ほど作成したttlファイルを開きます。するとコマンドが実行されます。


TeraTermの他のコマンドは下記が参考になると思います。
動作確認
ブレッドボード上のボタンを押すとTeraTerm上にHello Worldが表示され、マクロを実行するとブレッドボード上のLEDが5回点滅した後にTeraTerm上に05が出力されていることから、マイコンとパソコンで双方向に通信ができていることを確認できました。
動画の前半の動作はHelloWorldの送信で後半の動作はデータを受信した際の動作です。図13に実行結果の画面を示します。

以上の実験からUARTの送受信動作と基本的な取り扱い方の確認ができました。読んでいただきありがとうございました。
