ATmega328のUSARTの使用方法(準備)

提供: MochiuWiki : SUSE, EC, PCB

📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)

概要

ATmega328には、シリアル通信を実現するUSART (Universal Synchronous/Asynchronous Receiver/Transmitter) 機能が搭載されている。
USARTは、非同期通信 (調歩同期式)同期通信 の両方に対応しており、PCやマイコン間でのデータ送受信に利用できる。

USARTの特徴として、全二重通信、ハードウェアによるパリティ生成・チェック、フレーミングエラー検出、データオーバーラン検出等がある。

ボーレートは専用レジスタ (UBRR0) で設定可能であり、5~9ビットのデータ長、1~2ビットのストップビット、偶数・奇数パリティに対応している。

送受信には専用のバッファが用意されており、割り込み駆動での通信も可能である。


ハードウェアのセットアップ

必要なもの

ATmega328とPCをシリアル通信で接続するには、以下に示すものが必要である。

  • FT232RL (USB-シリアル変換モジュール)
  • USB mini-Bケーブル
  • FT232RLドライバ (PCにインストール)


FT232RLのドライバインストール

  1. FTDI社の公式サイトからドライバをダウンロードする。
  2. ダウンロードしたファイルを解凍する。
  3. FT232RLをPCに接続し、ドライバを要求されたら解凍したディレクトリ (CDM ○○ WHQL Certified) を指定する。
  4. インストールが完了するまで待機する。


FT232RLの設定

FT232RLは、ジャンパ設定により電源供給方法とI/O電圧を選択できる。

ジャンパ1 (J1) - I/O電圧選択
  • 1-2間ショート
    I/O電圧を3.3Vに設定
  • 2-3間ショート
    I/O電圧をVccに設定


ジャンパ2 (J2) - 電源選択
  • ショート
    USBポートから電源供給 (Vcc = 5[V])
  • オープン
    外部から電源供給 (Vcc = 3.3~5[V])


ATmega328との接続

下図に、USBポートから電源を取る場合の接続例を示す。



USARTの設定

動作周波数とボーレートの組み合わせによっては、誤差が大きくなる場合がある。
実際の通信では、誤差を考慮してUBRR0の値を調整する必要がある。

UCSRnA - 制御/状態レジスタA

UCSRnAは、シリアル通信の制御と状態を管理するレジスタである。

UCSRnA : USART制御/状態レジスタA (n = 0 または 1)
ビット 7 6 5 4 3 2 1 0
名前 RXCn TXCn UDREn FEn DORn UPEn U2Xn MPCMn


ビット名 説明
RXCn 受信完了フラグ。
未読データがあるとき1になる
TXCn 送信完了フラグ。
送信が完了すると1になる。
送信完了割り込みを発生可能
UDREn 送信データレジスタ空きフラグ。
送信バッファが新規データを受け取れる状態で1になる。
送信バッファ空き割り込みを発生可能
FEn フレーミングエラーフラグ。
受信バッファ内の次の文字にフレームエラーがあると1になる
DORn データオーバーランフラグ。
受信バッファ満杯時に新たなスタートビットを検出すると1になる
UPEn パリティエラーフラグ。
受信バッファ内の次のフレームにパリティエラーがあると1になる
U2Xn 倍速許可 (非同期通信のみ)
1を設定すると分周比が16から8になり、通信速度が2倍になる
MPCMn マルチプロセッサ通信モード
1を設定すると、アドレス情報を含まない受信データが無視される


UCSRnB - 制御/状態レジスタB

UCSRnB : USART制御/状態レジスタB (n = 0 または 1)
ビット 7 6 5 4 3 2 1 0
名前 RXCIEn TXCIEn UDRIEn RXENn TXENn UCSZn2 RXB8n TXB8n


ビット名 説明
RXCIEn 受信完了割り込み許可
RXCnによる割り込みを許可する
TXCIEn 送信完了割り込み許可
TXCnによる割り込みを許可する
UDRIEn 送信データレジスタ空き割り込み許可
UDREnによる割り込みを許可する
RXENn 受信許可
USART受信機能を有効にする
TXENn 送信許可
USART送信機能を有効にする
UCSZn2 データビット長選択ビット2
UCSRnCのUCSZn1, UCSZn0と組み合わせてデータビット長を設定する
RXB8n 9ビット長データ受信時の9ビット目
TXB8n 9ビット長データ送信時の9ビット目


UCSRnC - 制御 / 状態レジスタC

UCSRnCは、パリティ、ストップビット、データ長等の通信フォーマットを設定する。

UCSRnC : USART制御 / 状態レジスタC (n = 0 または 1)
ビット 7 6 5 4 3 2 1 0
名前 UMSELn1-0 UPMn1-0 USBSn UCSZn1-0 UCPOLn


ビット名 設定値 説明
UMSELn1-0 00 非同期動作
01 同期動作
10 (予約)
11 マスターSPI
UPMn1-0 00 パリティなし
01 (予約)
10 偶数パリティ
11 奇数パリティ
USBSn 0 ストップビット:1ビット
1 ストップビット:2ビット
UCSZn2-1-0 000 5ビット
001 6ビット
010 7ビット
011 8ビット
111 9ビット
UCPOLn 0 非同期モード
1 同期モード (クロック極性選択)


ボーレートの設定

ボーレートはUBRR0レジスタで設定する。

UBRR0の値は以下の式で計算する。
ここで、 は動作周波数[Hz]、 はボーレート[bps]である。

  • U2Xn = 0 (通常速度) の場合

  • U2Xn = 1 (倍速) の場合


計算例 :
クロック周波数1[MHz]、ボーレート2400[bps]、通常速度の場合




データの送受信

データ送信

UCSRnAレジスタのUDREn (ビット5) が1になると、送信バッファが空き状態となり送信可能になる。

 // 送信バッファが空くまで待機
 while (!(UCSR0A & 0b00100000));
 
 // データを送信
 UDR0 = data;


データ受信

UCSRnAレジスタのRXCn (ビット7) が1になると、受信データが利用可能になる。

 // 受信完了まで待機
 while (!(UCSR0A & 0b10000000));
 
 // 受信データを読み出す
 data = UDR0;