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

提供:MochiuWiki : SUSE, EC, PCB
2021年11月15日 (月) 00:30時点におけるWiki (トーク | 投稿記録)による版 (文字列「<source lang」を「<syntaxhighlight lang」に置換)
ナビゲーションに移動 検索に移動

概要

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に送信する。

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

<syntaxhighlight lang="c++">
// 受信用(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;
}
</source>


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

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