シリアル通信(オウム返し)

このエントリーをはてなブックマークに追加

 

 PICを単品で使うのもいいのですが、PICとパソコン、PICとマイコンなどのように色々な機器と通信ができると非常に便利です。ということで今回はシリアル通信(ウィキペディア)です。まずはコンピュータから送ったデータを受け取り、同じデータをコンピュータに送り返す、オウム返しを行います。

 

1.今回使用するPICについて

 今回使用するPICは「PIC12F1822」です。

 

2.回路

シリアル通信で使用するピンについて
RA4:TxD(送信)
RA5:RxD(受信)
(PICのRxDとコンピュータのTxDとつなげます)

 パソコンとつなげているシリアル通信の機器は「AE-UM232RL」です。
(参考までに販売サイト紹介:秋月電子通商AE-UM232RL製品サイト

 

 


     

 

3.プログラム

 

1.基本設定

ANSELA = 0b00000000 ;   // すべてデジタルI/Oに割当てる
TRISA  = 0b00101000 ;   // RA3,5を入力とする
PORTA  = 0b00000000 ;   // ピン状態初期化

RXDTSEL = 1;            // RA5を受信とする
TXCKSEL = 1;            // RA4を送信とする
53行目

 シリアル通信を行うための設定を行います。初めにポートをデジタルI/Oに設定します。
ANSELA = 0b00000000;

54行目

 RA5は受信に使うので、入力に設定します。
TRISA = 0b00101000;

55行目

 ピンの状態を初期化しておきます。
PORTA = 0b00000000;

57行目

 RA5をRxDにするので、以下のように設定します。
RXDTSEL = 1;

58行目

 RA4をTxDにするので、以下のように設定します。
TXCKSEL = 1;

 

2.シリアル通信の送信設定

TXSTA   = 0x24;         // 非同期/8ビット/パリティなし

 

 送信の制御に関する設定を行います。

 bit 名前  設定値  内容
 bit2  BRGH 1  ハイスピード
 bit4  SYNC 0  非同期モード
 bit5  TXEN 1  送信を有効にする
 bit6  TX9 0  8ビット送信

TXSTA = 0b00100100;
(プログラムでは16進数で「0x24」としています)

 

3.シリアル通信の受信設定

RCSTA   = 0x90;         // シリアルポート使用/連続受信あり

 

 受信の制御に関する設定を行います。

 bit 名前  設定値  内容
 bit3  ADDEN 0  8ビットなので
 bit4  CREN 1  連続受信を有効にする
 bit6  RX9 0  8ビット受信
 bit7  SPEN 0  シリアルポートを有効にする

RCSTA = 0b10010000;
(プログラムでは16進数で「0x90」としています)

 

4.シリアル通信の通信速度の設定

BAUDCON = 0x08;         // 16bitモード

// 16Bitモードで設定
SPBRG  = 0x40;          // ボーレートを9600に設定(下位8bit)
SPBRGH = 0x03;          // ボーレートを9600に設定(上位8bit)

 

 baudレート(通信速度)に関する設定を行います。(ちなみにボーレートと読みます)

 bit 名前  設定値  内容
 bit3  BRG16 1  16ビットbaudレートジェネレータを使用する

RCSTA = 0b00001000;
(プログラムでは16進数で「0x08」としています)

 続いてbaudレートの設定を行います。計算方法ですが、ここまでの設定で
SYNC:0
BRG16:1
BRGH:1
としているので、計算式は

baudレート = Fosc / (4 * (n + 1))

となります。nを求めたいので、

n = Fosc / (4 * baudレート) – 1

となり、値を入れて計算すると

Fosc:32[MHz]
baudレート:9600
n = 32000000 / (4 * 9600) – 1
n = 832.33

となり、設定する値は832となります。これを16進数に変更すると「0x0340」となります。プログラムは以下のようにします。

下位8ビット
SPBRG = 0x40;
上位8ビット
SPBRGH = 0x03;

 

5.シリアル通信の受信割り込みの設定

RCIF = 0;               // シリアル割込みの受信フラグを初期化
RCIE = 1;               // シリアル割込みの受信を有効
PEIE = 1;               // 周辺装置割込みを有効
GIE  = 1;               // 全割込み処理を許可

 

 シリアル通信で受信データが来た時の割り込みの設定を行います。割り込みについては「PIC12F1822の割り込み処理について」を参照してください。基本は同様です。

68行目

 シリアル通信受信の割り込みフラグを初期化
RCIF = 0;

69行目

 シリアル通信受信の割り込みを有効にする
RCIE = 1;

70行目

 周辺機能割り込みを有効にする
PEIE = 1;

71行目

 割り込みを有効にする
GIE = 1;

 

6.割り込み時のプログラム

void interrupt rx_uart0( void )
{
     if( RCIF )
     {
          rx_data = RCREG;    // レジスタからデータ格納
          rx_flg = true;
          RCIF = 0;           // 割込受信フラグをリセット
     }
}
40行目:if( RCIF )

 割り込みが発生し、シリアル通信受信の割り込みフラグ(RCIF)が真のときに処理を行うようにします。

42行目

 受信したデータをレジスタから取り出します。
rx_data = RCREG;

43行目

 受信したデータがあることをメインプログラムに知らせるために、受信データがあるフラグを立てます。
rx_flg = true;

44行目

 シリアル通信受信の割り込みフラグをリセットします。
RCIF = 0;

 

7.メイン

for(;;)
{
    // データを受信したか?
    if( rx_flg )
    {
        // 送信可能か?
        if( TXIF )
        {
            TXREG = rx_data;    // 送信レジスタへデータをセットする
            rx_flg = false;
        }
    }
}
76行目:if( rx_flg )

 メインのプログラムでは、受信データがある場合、そのデータを送信する処理を作ります。データを受信すると、割り込み処理でrx_flgを真にするので、真のときに送信処理を行うようにします。

79行目:if( TXIF )

 送信が可能かレジスタのチェックを行います。TXREGに何かが入っていると0になります(簡単に言うと、送信中のデータがあるとTXIFは0になるということです)。

81行目

 送信レジスタに受信したデータをセットします。
TXREG = rx_data;

82行目

 受信したデータを送信したので、受信データがあるフラグを下ろします。
rx_flg = false;

 

ソースコード

 プログラムの全文を掲載します。

  プログラム

<注意>
本サイトの注意事項を確認してください。
ソースコードや回路図などを使用する場合、上記注意とともに、自己責任でお願いします。

 

   
   

 

3.動作確認

 PCとPICを接続し、PCからシリアル通信でデータを送ってください。すると、PICから送信したのと同じデータが送信されてきます。

注:PCでシリアル通信を行う場合、シリアルポートとシリアル通信を行うソフトが必要になります。
(参考ソフト:Tera Term

 

<更新履歴>

新規作成:2015年4月12日
第2版:2016年9月30日:フォーマット変更(内容の変更はなし)

 

シリアル通信(オウム返し)」への4件のフィードバック

    • Tera Termでは文字を送受信しているだけなので、特別なことは何もしていません。
      また、Tera Termはシリアルポートを選択している程度で、
      ボー・レートなども標準で9600になってると思うので、そのままです。
      質問の意図とあっていますか?

  1. 解決しました
    どうやらbaudレートの値が間違えていたようで文字化けしていたので…
    レートを見直せば直りました!アドバイスありがとうございます

コメントを残す

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

CAPTCHA


日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)