うしこlog
公開: 2013/09/01

AVRのUSART機能を使う(実践編)

今回の内容

 PC-マイコン間で、データの受け渡しをする方法としてシリアル通信があります。AVRでは、シリアル通信が簡単にできる「USART」という機能があるので、実際にUSART機能を使用してパソコンとAVRとの間でシリアル通信をしていきます。

前回と次回の内容

 前回は、AVRとパソコンをFT232RLを用いて接続しました。また、USARTのボーレート設定方法についても説明しました。
次回は、AVRでリモコンを作成していきます。

[追記] AVRに関する記事を以下の記事にまとめましたので、ぜひご覧ください。

AVRに関する記事

パソコンとAVRでデータの送受信しよう

 パソコンからデータを送信し、AVRでそのデータを受信してみましょう。また、確認として受信したデータをパソコンに送信してみます。

今回は、AVR-パソコン間での、通信速度(ボーレート)は2400とします。

パソコン側の設定

 パソコン側からAVRにデータを送るにはどうしたらいいのでしょう。

答えは、Tera Termというソフトを使って、シリアル通信によりデータを送信します。

まず、Tera TermからTeraTermをダウンロード、インストールします。

インストールしたら、Tera Termを立ち上げます。

TeraTerm立ち上げ
TeraTermを立ち上げた時

立ち上げたら、キャンセルを押します。その後、設定->シリアルポートを選びます。

TeraTermシリアル通信
TeraTerm設定

その後、COMポート番号を選び、ビットレートやパリティなどの設定をします。この設定は、AVRのUSARTのレジスタ(UCSRnA,B,C)で設定したのと同じ設定にします(UCSRnの'n'は数字)。レジスタの詳細は前回の記事を参照してください。

TeraTermシリアルポート設定
シリアルポート設定

これで、パソコンからAVRにデータを送ることができます。

AVR側の設定 (送受信プログラム)

 パソコンからのデータを、AVRで受信するためのプログラムを以下に示します。AVRが受信したかを確認するために、受信したデータをパソコンに送信するようにしました。

ボーレート計算や、レジスタ設定などは前回の記事をご覧ください。

/* 受信用(マイコンで受信)
   *UBRR0 = 動作周波数 / (ボーレート * 16) - 1 
    ボーレート : 2400
    動作周波数 : 1M
    ならば
    UBRR0 = 25

   *UCSR0B : 受信・送信有効にする設定
    000  1      1       000
      受信有効 送信有効
    
   *UCSR0C : 非同期動作、データビット長を8bitとして設定
    00000110

   *UDR0   : 送受信するデータのレジスタ

   *UCSR0AのUDRE : 送信準備OKなら1になる
     準備OK -> 00100000

   *UCSR0AのRXC  : 受信準備OKなら1になる
     受信 -> 10000000
*/

/* 注意: 改行をキーボードで押すと、\rになる! */

/*****ここからプログラム *****/
#include <avr/io.h>
#include <util/delay.h>

int main(void)
{
  unsigned char data = 0;  //受信したデータを格納

  DDRD = 0b11111100;       //portD : 0,1pin以外出力
  PORTD = 0b00000000;

  UBRR0 = 25;   //ボーレート2400 @1MHz

  UCSR0A = 0b00000000;    //受信すると10000000になる
                          //送信有効になると00100000になる

  UCSR0B = 0b00011000;    //送受信有効
  UCSR0C = 0b00000110;    //データ8bit
                          //非同期,パリティなし
                          //Stop 1bit
        
  while(1){
     //受信するまで待つ
    while( !(UCSR0A & 0b10000000) );  //0ならループ
    data = UDR0;  //受信したデータを格納

     //受信できたかを確認するために受信データを返す
     //送信できるまで待つ
    while( !(UCSR0A & 0b00100000) );  //0ならループ
    UDR0 = data;  //受信したデータを送信
  }

  return 0;
}

 このプログラムをAVRに書き込み、FT232RLなどでパソコンとAVRを繋げてシリアル通信ができるようにします。そして、TeraTermなどのアプリケーションを立ち上げ、ボーレートなどの設定をAVRと同じ設定にします。

 例えばTeraTermの場合では、ボーレート:2400, データ:8bit, パリティ:none, ストップ:1bit, フロー:none)にします。
これで、パソコンからデータを送信して、AVRがそのデータを受信することができます。

<< AVRのUSART機能を使う(準備編) AVRでリモコンを作成するへ >>