YS電子工作ラボ

PIC - Tera Term間 
      UARTモジュール制御

(→プロジェクトファイル(Harmony Ver.2.04版 ) ダウンロード


<仕様>
 
・PIC32MZとPC間の文字列送受信通信をRS232C(正式にはEIA-574規格)を用いて行う。
 ・PIC32MZはPIC32MZ2048EFH100とする。
 ・PCの通信ソフトは Tera Termをつかうこと。
 ・通信条件   ボーレート:9600bps
           データ長: 8ビット
           パリティ: なし 
           ストップビット: 1ビット
           フロー制御: なし
 ・PICが起動したら PC側に文字列 "Hellow World !!"を送信する。
 ・PC側でキーインした(Tera Term が送信した)文字を PIC側で受信したら文字列"data="を追加して
  PC側に返信する。
     例1:  "b"を受信したら "data=b"を返信する。
     例2:  "4"を受信したら "data=4"を返信する。 
          
 ・Tera Term 側の表示は エコーバックはしないで 送受信文字のみを表示する。
 ・‘PCのUSBポートとRS232Cポートの変換は、ラトックシステム(株)のUSBシリアルコンバーター REX-USB60Fを使用する。 
 ・ Harmonyは、Ver.2.01bを使うものとする。
 ・UARTモジュールはダイナミックライブラリを使い、モジュールの諸元は以下とする。
   モジュールID: U6
   TXポート: RC2
   RXポート: RG9






<回路図>
(→PDFファイル


<外観>
  
PIC32MZ評価ボード(→購入方法)を使った実験品の外観です。





<動作結果>  (→ 動画:1080pのHD動画を見ることができます。)


Tera Termを起動して通信条件を
以下のように設定します。
② 
PICの電源をONにするとPIC側から
PC側(Tera Term)に "Hellow World !!"が
送信されてきます。
③ 
キーボードから "a"をキーインすると
PC側から "data=a"が送信されて
きます。
 
 

キーボードから "b"をキーインすると
PC側から "data=b"が送信されて
きます。

キーボードから "3"をキーインすると
PC側から "data=3"が送信されて
きます。

キーボードから "4"をキーインすると
PC側から "data=4"が送信されて
きます。
 
 






<解説> 記載してある内容は要点だけです。 詳細はプロジェクトファイルを精読願います。
      (以下は、Harmony v2.04 をもとに作成しています。最新のバージョンとは異なることがあるかもしれませんので注意してください。)

 ■ USARTに関するMHCは、以下のように設定します。
   ■ Options

項目 ①Config設定
Device & Project Configuration
  > PIC32MZ2048 Device Configuration
②USART設定
Harmony Framework Configuration > Drivers
 > USART
MHC  
備考 デフォルトからの変更要領:
 FPLLIDIV: DIV3
 FPLLICLK: PLL_POSC
 POSCMOD: EC

システムクロック周波数: 200MHz
外部OSC: 24MHz
タイマ用ペリフェラルクロック
     周波数(PBCLK3): 100MHz


#pragma config FNOSC = SPLL
#pragma config POSCMOD = EC
#pragma config FPLLIDIV = DIV_3
#pragma config FPLLICLK = PLL_POSC
#pragma config FPLLMULT = MUL_50
#pragma config FPLLODIV = DIV_2 
デフォルトからの変更要領:
 Use USART Driver? チェックを入れる
 USART Module ID: USART_ID_6


   ■ Pin Settings

項目 ④ポート設定 
MHC
備考   デフォルトからの変更要領:
 RC2/Function: U6TX
        (U6のTX設定)
 RG9/Function: U6RX
        (U6のRX設定)



 ■ app.cに、青字部分を追加します。
  ① 1バイト送信する関数です。 送信バッファに1バイトを書き込み、送信バッファが空になるまで待ちます。
    void Write_Byte(char chr) //1バイト送信関数
    {
      PLIB_USART_TransmitterByteSend(USART_ID_6, chr); //送信バッファーに1バイト書込み・送信
      // U6TXREG = chr; ////送信バッファーに1バイト書込み・送信
      while (!PLIB_USART_TransmitterIsEmpty(USART_ID_6)); //送信バッファーが空になるまで待つ
      //while(!U6STAbits.TRMT); //送信バッファーが空になるまで待つ
    }


  ② 文字列を送信する関数です。 1バイト送信したら、ポインタを進めます。文字列の終端の\0を検出するまで繰り返し、1バイトづつ
     文字列を送信します。
    void WriteString(const char *str) //文字列送信関数
    {
      while(*str)
      {
        Write_Byte(*str); //データ送信
        str++;
      }
    }



  ③ 文字列 "Hellow World !!" を送信して、"\r" で Carriage Return (復帰)して "\n" で Line Feed (改行)します。
    //文字列送信
    WriteString("Hellow World !!\r\n");


以下、app.c




■ system_interrupt.cに、以下のように青字部を追加します。  ① sprintf()に対してコンパイラのワーニングがでないように stdio.hをインクルードします。     #include "stdio.h"     char Buf[17];    ② USARTモジュールのU6に受信割り込みが発生して、 受信データがある場合受信データを1バイト dataに読み込みます。    読み込んだデータの前に "data="を追加して WriteString()で返信します。        if (PLIB_USART_ReceiverDataIsAvailable(USART_ID_6)) //受信データ有の場合      //if(U6STAbits.URXDA == 1) //受信データ有の場合 //Receive buffer has data, at least one more character can be read     {    char data;   data = PLIB_USART_ReceiverByteReceive(USART_ID_6); //受信データ読み込み   //data = U6RXREG; //受信バッファ読み込み   sprintf(Buf,"data=%c\r\n",data);   WriteString(Buf); //文字列送信    } 以下、system_interrupt.c