「ATmega328のUSARTの使用方法(準備)」の版間の差分

提供: MochiuWiki : SUSE, EC, PCB

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

 
(同じ利用者による、間の4版が非表示)
1行目: 1行目:
== 概要 ==
== 概要 ==
PCとATmega328の間で、データの送受信を行う方法としてシリアル通信がある。<br>
ATmega328には、シリアル通信を実現するUSART (Universal Synchronous/Asynchronous Receiver/Transmitter) 機能が搭載されている。<br>
ATmega328では、シリアル通信が簡単にできるUSARTという機能があるので、USARTの知識と使用方法を記載する。<br>
USARTは、<u>非同期通信 (調歩同期式)</u> と <u>同期通信</u> の両方に対応しており、PCやマイコン間でのデータ送受信に利用できる。<br>
<br>
USARTの特徴として、全二重通信、ハードウェアによるパリティ生成・チェック、フレーミングエラー検出、データオーバーラン検出等がある。<br>
<br>
ボーレートは専用レジスタ (UBRR0) で設定可能であり、5~9ビットのデータ長、1~2ビットのストップビット、偶数・奇数パリティに対応している。<br>
<br>
送受信には専用のバッファが用意されており、割り込み駆動での通信も可能である。<br>
<br><br>
<br><br>


== シリアル通信とUSART ==
== ハードウェアのセットアップ ==
===== シリアル通信で必要なもの =====
==== 必要なもの ====
PCとATmega328の間で通信するために、両者を接続するものが必要である。<br>
ATmega328とPCをシリアル通信で接続するには、以下に示すものが必要である。<br>
ここでは、FT232RL(USB−シリアル変換モジュール)を使用して、ATmega328のUSART機能でシリアル通信を行う。<br>
<br>
* FT232RL (USB-シリアル変換モジュール)
* USB mini-Bケーブル
* FT232RLドライバ (PCにインストール)
<br>
==== FT232RLのドライバインストール ====
# FTDI社の公式サイトからドライバをダウンロードする。
# ダウンロードしたファイルを解凍する。
# FT232RLをPCに接続し、ドライバを要求されたら解凍したディレクトリ (CDM ○○ WHQL Certified) を指定する。
# インストールが完了するまで待機する。
<br>
<br>
===== ATmega328のシリアル通信で必要なもの =====
==== FT232RLの設定 ====
FT232RL(USB−シリアル変換モジュール)<br>
FT232RLは、ジャンパ設定により電源供給方法とI/O電圧を選択できる。<br>
USB miniBケーブル(FT232RLとPCを接続するケーブル)<br>
FT232RLのドライバ(PCにインストールする)<br>
<br>
<br>
===== FT232RLのドライバのインストール方法 =====
===== ジャンパ1 (J1) - I/O電圧選択 =====
# ドライバをFTDI社からダウンロードする。
* 1-2間ショート
# ダウンロードしたドライバを解凍する。
*: I/O電圧を3.3Vに設定
# FT232RLをPCに接続すると、ドライバを要求されるので、解凍したドライバのフォルダ(CDM ○○ WHQL Certified)を選択する。
* 2-3間ショート
# ドライバのインストールが完了する。
*: I/O電圧をVccに設定
<br>
<br>
FT232RLは、USBポートから電源をとるか、外部から電源を供給するかをジャンパにより電源(Vcc)を選択することができる。<br>
===== ジャンパ2 (J2) - 電源選択 =====
その他に、I/Oピンの電圧を3.3[V]またはVccかをジャンパにより選択することができる。<br>
* ショート
*: USBポートから電源供給 (Vcc = 5[V])
* オープン
*: 外部から電源供給 (Vcc = 3.3~5[V])
<br>
<br>
* ジャンパ1(J1)
==== ATmega328との接続 ====
** 1 - 2間をショート : I/Oの電圧を3.3[V]にする
下図に、USBポートから電源を取る場合の接続例を示す。<br>
** 2 - 3間をショート : I/Oの電圧をVccにする
<br>
<br>
* ジャンパ2(J2)
[[ファイル:ATmega328 USART Ready 1.jpg|フレームなし|中央]]
** 有り(ショート) : USBポートから電源を取る(Vcc = 5[V])
** 無し(オープン) : 外部から電源を取る(Vcc = 3.3 - 5[V])
<br><br>
<br><br>


== USARTの設定 ==
== USARTの設定 ==
===== USARTのレジスタ設定 =====
動作周波数とボーレートの組み合わせによっては、誤差が大きくなる場合がある。<br>
UCSRnA(USART Control and Status Register n A)は、シリアル通信の制御や状態を表すためのレジスタである。<br>
実際の通信では、誤差を考慮してUBRR0の値を調整する必要がある。<br>
<br>
==== UCSRnA - 制御/状態レジスタA ====
UCSRnAは、シリアル通信の制御と状態を管理するレジスタである。<br>
<br>
<center>
<center>
{| class="wikitable"
{| class="wikitable"
! colspan = "9" | UCSRnA : USART制御/状態レジスタA(n : 0 or 1)
|+ UCSRnA : USART制御/状態レジスタA (n = 0 または 1)
|-
|-
! ビット !! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0
! ビット !! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0
45行目: 62行目:
|}
|}
</center>
</center>
* RXCn  : USART受信完了フラグ<br>未読データがあるときに1がセットされる
* TXCn  : USART送信完了フラグ<br>新規データがないときに1がセットされる<br>送信完了割り込みを発生できる
* UDREn : USART送信データレジスタ空きフラグ<br>送信バッファが新規データを受け取る準備ができたら1がセットされる<br>送信バッファ空き割り込みを発生できる
* FEn  : フレーミング異常フラグ<br>受信バッファ内の次の文字にフレームエラーが発生したときに1になる
* DORn  : データオーバーラン発生フラグ<br>データオーバーランを検出すると1になる<br>受信バッファが満杯のときに、新たにスタートビットを検出するとデータオーバーランが発生する
* UPEn  : パリティ誤りフラグ<br>受信バッファ内の次のフレームにパリティエラーが発生したときに設定される
* U2Xn  : 倍速許可<br>非同期通信のみ有効で、1を設定すると分周比を16から8にする<br>結果として、通信速度が2倍になる
* MPCMn : 1を設定すると、マルチプロセッサ通信モードが有効になる<br>アドレス情報を含まない受信データが無視される
<br>
<br>
<center>
<center>
{| class="wikitable"
{| class="wikitable"
! colspan = "9" | UCSRnB : USART制御/状態レジスタB(n : 0 or 1)
! ビット名 !! 説明
|-
| RXCn || 受信完了フラグ。<br>未読データがあるとき1になる
|-
| TXCn || 送信完了フラグ。<br>送信が完了すると1になる。<br>送信完了割り込みを発生可能
|-
| UDREn || 送信データレジスタ空きフラグ。<br>送信バッファが新規データを受け取れる状態で1になる。<br>送信バッファ空き割り込みを発生可能
|-
| FEn || フレーミングエラーフラグ。<br>受信バッファ内の次の文字にフレームエラーがあると1になる
|-
| DORn || データオーバーランフラグ。<br>受信バッファ満杯時に新たなスタートビットを検出すると1になる
|-
| UPEn || パリティエラーフラグ。<br>受信バッファ内の次のフレームにパリティエラーがあると1になる
|-
| U2Xn || 倍速許可 (非同期通信のみ)<br>1を設定すると分周比が16から8になり、通信速度が2倍になる
|-
| MPCMn || マルチプロセッサ通信モード<br>1を設定すると、アドレス情報を含まない受信データが無視される
|}
</center>
<br>
==== UCSRnB - 制御/状態レジスタB ====
<center>
{| class="wikitable"
|+ UCSRnB : USART制御/状態レジスタB (n = 0 または 1)  
|-
|-
! ビット !! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0
! ビット !! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0
64行目: 96行目:
|}
|}
</center>
</center>
* RXCIEn : 受信完了割り込み許可<br>UCSRnAの受信完了フラグ(RXCn)での割り込みを許可する
* TXCIEn : 送信完了割り込み許可<br>UCSRnAの送信完了フラグ(TXCn)での割り込みを許可する
* UDRIEn : 送信データレジスタ空き割り込み許可<br>UCSRnAのUDREnでの割り込みを許可する
* RXENn  : 受信許可<br>USART受信を許可する
* TXENn  : 送信許可<br>USART送信を許可する
* UCSZn2 : データビット長選択2<br>USCRnCのUCSZn1とUCSZn0ビットと組み合わせたUCSZn2は、送受信フレームのデータのビット長を設定する
* RXB8n  : 9ビット長のデータを受信したときの9番目のビット
* TXB8n  : 9ビット長のデータを送信するときの9番目のビット
<br>
<br>
UCSRnC(USART Control and Status Register n C)は、パリティやストップビットの設定を行うためのレジスタである。<br>
<center>
<center>
{| class="wikitable"
{| class="wikitable"
! colspan = "9" | UCSRnC : USART制御/状態レジスタC(n : 0 or 1)
! ビット名 !! 説明
|-
| RXCIEn || 受信完了割り込み許可<br>RXCnによる割り込みを許可する
|-
| TXCIEn || 送信完了割り込み許可<br>TXCnによる割り込みを許可する
|-
| UDRIEn || 送信データレジスタ空き割り込み許可<br>UDREnによる割り込みを許可する
|-
| RXENn || 受信許可<br>USART受信機能を有効にする
|-
| TXENn || 送信許可<br>USART送信機能を有効にする
|-
| UCSZn2 || データビット長選択ビット2<br>UCSRnCのUCSZn1, UCSZn0と組み合わせてデータビット長を設定する
|-
| RXB8n || 9ビット長データ受信時の9ビット目
|-
| TXB8n || 9ビット長データ送信時の9ビット目
|}
</center>
<br>
==== UCSRnC - 制御 / 状態レジスタC ====
UCSRnCは、パリティ、ストップビット、データ長等の通信フォーマットを設定する。<br>
<br>
<center>
{| class="wikitable"
|+ UCSRnC : USART制御 / 状態レジスタC (n = 0 または 1)  
|-
|-
! ビット !! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0
! ビット !! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0
|-
|-
! 名前
! 名前
| colspan = "2" | UMSELn 1 - 0
| colspan="2" | UMSELn1-0 || colspan="2" | UPMn1-0 || USBSn || colspan="2" | UCSZn1-0 || UCPOLn
| colspan = "2" | UPMn 1 - 0
| USBSn
| colspan = "2" | UCSZn 1 - 0
| UCPOLn
|}
|}
</center>
</center>
* UMSELn 1 - 0 : USART動作選択<br>00(非同期動作)<br>01(同期動作)<br>10(予約)<br>11(マスターSPI)
* UPMn 1 - 0  : パリティ選択<br>00(禁止)<br>01(予約)<br>10(偶数パリティ許可)<br>11(奇数パリティ許可)
* USBSn        : 送信時に挿入されるストップビットのビット数を指定する<br>0 : ストップビットは1ビット<br>1 : ストップビットは2ビット
* UCSZn 1 - 0  : データビット長を選択<br>UCSZn2と組み合わせて使用する<br>000(5bit)<br>001(6bit)<br>010(7bit)<br>011(8bit)<br>111(9bit)<br>他は予約
* UCPOLn      : クロック極性を選択する<br>1 : 同期モード<br>0 : 非同期モード
<br>
<br>
 
<center>
===== 送信のタイミング =====
{| class="wikitable"
送信のタイミングは、UCSRnAレジスタの5ビット目であるUDREnに1がセットされると送信が有効になる。<br>
! ビット名 !! 設定値 !! 説明
|-
| rowspan="4" | UMSELn1-0
| 00 || 非同期動作
|-
| 01 || 同期動作
|-
| 10 ||  (予約)
|-
| 11 || マスターSPI
|-
| rowspan="4" | UPMn1-0
| 00 || パリティなし
|-
| 01 ||  (予約)
|-
| 10 || 偶数パリティ
|-
| 11 || 奇数パリティ
|-
| rowspan="2" | USBSn
| 0 || ストップビット:1ビット
|-
| 1 || ストップビット:2ビット
|-
| rowspan="5" | UCSZn2-1-0
| 000 || 5ビット
|-
| 001 || 6ビット
|-
| 010 || 7ビット
|-
| 011 || 8ビット
|-
| 111 || 9ビット
|-
| rowspan="2" | UCPOLn
| 0 || 非同期モード
|-
| 1 || 同期モード (クロック極性選択)
|}
</center>
<br>
==== ボーレートの設定 ====
ボーレートはUBRR0レジスタで設定する。<br>
<br>
<br>
例えば、下記のように記述すれば、送信が有効になると変数dataを送信することができる。<br>
UBRR0の値は以下の式で計算する。<br>
<source lang="c++">
ここで、<math>f_{OSC}</math> は動作周波数[Hz]、<math>\mbox{BAUD}</math> はボーレート[bps]である。<br>
while(!(UCSR0A & 0b00100000));  // 送信が有効になるまで待つ
UDR0 = data;                      // データを送信する
</source>
<br>
<br>
===== 受信のタイミング =====
* U2Xn = 0 (通常速度) の場合
受信のタイミングは、UCSRnAレジスタの7ビット目であるRXCnに1がセットされると受信は有効になる。<br>
*: <math>\mbox{UBRR0} = \dfrac{f_{OSC}}{16 \times \mbox{BAUD}} - 1</math>
*: <br>
* U2Xn = 1 (倍速) の場合
*: <math>\mbox{UBRR0} = \dfrac{f_{OSC}}{8 \times \mbox{BAUD}} - 1</math>
<br>
<br>
例えば、下記のように記述すれば、受信が有効になるまで待機し、データを受信することができる。<br>
計算例 :
<source lang="c++">
クロック周波数1[MHz]、ボーレート2400[bps]、通常速度の場合
while(!(UCSR0A & 0b10000000));  // 受信が有効になるまで待つ
data = UDR0;                      // 受信したデータを格納する
<math>\mbox{UBRR0} = \dfrac{1000000}{16 \times 2400} - 1 = 25</math>
</source>
<br><br>
 
== データの送受信 ==
==== データ送信 ====
UCSRnAレジスタのUDREn (ビット5) が1になると、送信バッファが空き状態となり送信可能になる。<br>
<br>
<br>
===== ボーレートの設定 =====
<syntaxhighlight lang="c++">
USARTのボーレートの設定は、UBRR0レジスタで設定する。(動的に設定することも可能)<br>
// 送信バッファが空くまで待機
while (!(UCSR0A & 0b00100000));
// データを送信
UDR0 = data;
</syntaxhighlight>
<br>
<br>
UBRR0の値は、以下の式で計算することができる。<br>
==== データ受信 ====
<math>UBRR0 = \frac{\mbox{動 作 周 波 数}}{\mbox{ボ ー レ ー ト} * 16} - 1</math>  <math>\mbox{(U2Xn = 0 の と き)}</math><br>
UCSRnAレジスタのRXCn (ビット7) が1になると、受信データが利用可能になる。<br>
<math>UBRR0 = \frac{\mbox{動 作 周 波 数}}{\mbox{ボ ー レ ー ト} * 8} - 1</math>  <math>\mbox{(U2Xn = 1( 倍 速 許 可 ) の と き)}</math><br>
<br>
<br>
例えば、ATmega328のクロック周波数が1[MHz]、ボーレートを2400として通信する場合、UBRR0レジスタは下記の値となる。<br>
<syntaxhighlight lang="c++">
<math>UBRR0 = \frac{1000000}{2400 * 16} - 1 = 25</math><br>
// 受信完了まで待機
<br><br>
while (!(UCSR0A & 0b10000000));
 
== FT232RLとATmega328の接続方法 ==
// 受信データを読み出す
USBポートから電源を取る場合は、以下のように回路を組めばシリアル通信ができる。<br>
data = UDR0;
[[ファイル:ATmega328 USART Ready 1.jpg|フレームなし|中央]]
</syntaxhighlight>
<br><br>
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:AVR]]
[[カテゴリ:AVR]]

2026年1月10日 (土) 15:54時点における最新版

概要

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;