ATmega328のUSARTの使用方法(実践)
概要
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にする。