ATmega328のUSARTの使用方法(実践)

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

PCとATmega328の間で、データの送受信を行う方法としてシリアル通信がある。
ATmega328では、シリアル通信が簡単にできるUSARTという機能があるので、USARTの知識と使用方法を記載する。


PCとATmega328でデータの送受信をする

PCからデータを送信し、ATmega328そのデータを受信する。
また、確認として受信したデータをPCに送信する。
ここでは、PCとATmega328の間での、通信速度(ボーレート)は2400とする。

PCからATmega328にデータを送信するには、TeraTermを使用して、シリアル通信によりデータを送信する。

まず、TeraTermを起動して、[設定] - [シリアルポート]を選択する。
[シリアルポート設定]画面が開くので、COMポート番号やビットレート、パリティ等の設定を行う。
この設定は、ATmega328のUSARTのUCSRnAレジスタ等で設定したものと同じ設定にする。
ATmega328のレジスタの設定は、こちらのページを参照すること。


サンプルコード

PCから送信されたデータを、ATmega328で受信するためのサンプルコードを以下に記述する。
また、ATmega328が受信したかどうかを確認するために、受信したデータをPCに送信する。

ボーレートの計算やレジスタの設定等は、こちらのページを参照すること。

 // 受信用(ATmega328で受信)
 // UBRR0 = ATmega328のクロック周波数 / (ボーレート * 16) - 1 
 // ボーレート : 2400
 // 動作周波数 : 1[MHz]
 // UBRR0 = 25
 //
 // UCSR0B : 送受信を有効にする設定
 // 000     1         1       000
 //      受信有効   送信有効
 //
 // UCSR0C : 非同期動作、データビット長を8bitとして設定
 // 00000110
 //
 // UDR0   : 送受信するデータのレジスタ
 //
 // UCSR0AのUDRE : 送信の準備ができた場合、1になる
 // 送信 -> 00100000
 //
 // UCSR0AのRXC  : 受信の準備ができた場合、1になる
 // 受信 -> 10000000
 
 // 注意 : キーボードで改行すると、\rになる
 
 #include <avr/io.h>
 #include <util/delay.h>
 
 int main()
 {
    unsigned char data = 0;  // 受信データを格納
 
    DDRD  = 0b11111100;  // PD0とPD1以外を出力にする
    PORTD = 0b00000000;
 
    UBRR0 = 25;  // ボーレート2400@1[MHz]
 
    UCSR0A = 0b00000000;  // 受信の準備ができた場合、0b10000000になる
                          // 送信の準備ができた場合、0b00100000になる
 
    UCSR0B = 0b00011000;  // 送受信有効
    UCSR0C = 0b00000110;  // データ長 : 8bit
                          // 非同期
                          // パリティなし
                          // ストップビット : 1bit
 
    while(1)
    {
       // 受信するまで待機する
       while(!(UCSR0A & 0b10000000));
       data = UDR0;  // 受信したデータを格納する
 
       // 受信完了を確認するために受信データを送信する
       // 送信の準備ができるまで待機する
       while(!(UCSR0A & 0b00100000));
       UDR0 = data;  // データを送信する
   }
 
   return 0;
 }


上記のソースコードをATmega328に書き込み、FT232RL等でPCとATmega328を接続してシリアル通信ができるようにする。
そして、TeraTerm等を起動して、ボーレートの設定をATmega328と同じ設定にする。

例えば、TeraTermでは、ボーレートを2400、データ長を8bit、パリティをnone、ストップビットは1bit、フローはnoneにする。