UART通信の確認(PIC16F13145)

UARTで通信のテストを行ってみました。個人的な備忘録になります。

使用部品

MCCの設定

UART通信を行うためにMCCでUARTドライバーを追加しておきます。図1の様にAdd Component若しくはDrivers & Peripheralsをクリックし、検索欄にUARTを入力して図2の赤丸をクリックします。

図1 MCCのUART設定
図2 UARTの追加画面

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

図3 UART1の設定

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

図4 ピンの入出力設定

設定が終わったら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社のリファレンスになります。

参考:4.26.2 EUSART – Enhanced USART

組み立てた回路と外観

回路実装

図5のような回路を作りました。

図5 UART実験回路 スイッチ入力端子はプルダウンさせています

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

図6 実験回路外観

TeraTerm設定

そのままではCH340は使用できないのでまず下記メーカーサイトからドライバーを入手してインストールします。

ZIPファイルの中のSETUP.exeを実行してINSTALLを押すとドライバーが入ります。

CH341SER.ZIP – Nanjing Qinheng Microelectronics Co., Ltd.

図7 CH340のドライバインストール画面


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

図8 TeraTerm 起動時の接続先設定画面

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

図9 TeraTermのシリアルポート設定画面

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

調べてみるとTeraTermのマクロ機能を利用すればASCIIコードのデータではなく任意のデータを送れることが分かりました。マクロ機能を使用するために次の文字列をメモ帳に貼付して拡張子をttlにして保存しました。このデータをマイコン側に送ればLEDは5回点滅するはずです。

send $05
setdebug 2
図10 メモ帳の画面 コマンドを記述して保存する
図11 ttl形式でファイルを保存する

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

図12 マクロの実行方法
図13 図9で保存したマクロを開く画面

TeraTermの他のコマンドは下記が参考になると思います。

参考:TTL コマンドリファレンス

動作確認

ブレッドボード上のボタンを押すとTeraTerm上にHello Worldが表示され、マクロを実行するとブレッドボード上のLEDが5回点滅した後にTeraTerm上に05が出力されていることから、マイコンとパソコンで双方向に通信ができていることを確認できました。

動画の前半の動作はHelloWorldの送信で後半の動作はデータを受信した際の動作です。図13に実行結果の画面を示します。

図13 UARTの送受信動作の実行結果

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

コメントを残す

メールアドレスが公開されることはありません。 ※ が付いている欄は必須項目です

CAPTCHA