「ATmega328のUSARTの使用方法(準備)」の版間の差分
細 文字列「source lang」を「syntaxhighlight lang」に置換 |
|||
| (同じ利用者による、間の3版が非表示) | |||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
ATmega328には、シリアル通信を実現するUSART (Universal Synchronous/Asynchronous Receiver/Transmitter) 機能が搭載されている。<br> | |||
USARTは、<u>非同期通信 (調歩同期式)</u> と <u>同期通信</u> の両方に対応しており、PCやマイコン間でのデータ送受信に利用できる。<br> | |||
<br> | |||
USARTの特徴として、全二重通信、ハードウェアによるパリティ生成・チェック、フレーミングエラー検出、データオーバーラン検出等がある。<br> | |||
<br> | |||
ボーレートは専用レジスタ (UBRR0) で設定可能であり、5~9ビットのデータ長、1~2ビットのストップビット、偶数・奇数パリティに対応している。<br> | |||
<br> | |||
送受信には専用のバッファが用意されており、割り込み駆動での通信も可能である。<br> | |||
<br><br> | <br><br> | ||
== | == ハードウェアのセットアップ == | ||
===== | ==== 必要なもの ==== | ||
ATmega328とPCをシリアル通信で接続するには、以下に示すものが必要である。<br> | |||
<br> | <br> | ||
* FT232RL (USB-シリアル変換モジュール) | |||
FT232RL( | * USB mini-Bケーブル | ||
USB | * FT232RLドライバ (PCにインストール) | ||
<br> | <br> | ||
==== | ==== FT232RLのドライバインストール ==== | ||
# | # FTDI社の公式サイトからドライバをダウンロードする。 | ||
# | # ダウンロードしたファイルを解凍する。 | ||
# | # FT232RLをPCに接続し、ドライバを要求されたら解凍したディレクトリ (CDM ○○ WHQL Certified) を指定する。 | ||
# | # インストールが完了するまで待機する。 | ||
<br> | <br> | ||
==== FT232RLの設定 ==== | |||
FT232RLは、ジャンパ設定により電源供給方法とI/O電圧を選択できる。<br> | |||
<br> | <br> | ||
===== ジャンパ1 (J1) - I/O電圧選択 ===== | |||
* 1-2間ショート | |||
*: I/O電圧を3.3Vに設定 | |||
* 2-3間ショート | |||
*: I/O電圧をVccに設定 | |||
<br> | <br> | ||
===== ジャンパ2 (J2) - 電源選択 ===== | |||
** | * ショート | ||
** | *: USBポートから電源供給 (Vcc = 5[V]) | ||
* オープン | |||
*: 外部から電源供給 (Vcc = 3.3~5[V]) | |||
<br> | |||
==== ATmega328との接続 ==== | |||
下図に、USBポートから電源を取る場合の接続例を示す。<br> | |||
<br> | |||
[[ファイル:ATmega328 USART Ready 1.jpg|フレームなし|中央]] | |||
<br><br> | <br><br> | ||
== USARTの設定 == | == USARTの設定 == | ||
==== | 動作周波数とボーレートの組み合わせによっては、誤差が大きくなる場合がある。<br> | ||
実際の通信では、誤差を考慮してUBRR0の値を調整する必要がある。<br> | |||
<br> | |||
==== UCSRnA - 制御/状態レジスタA ==== | |||
UCSRnAは、シリアル通信の制御と状態を管理するレジスタである。<br> | |||
<br> | |||
<center> | <center> | ||
{| class="wikitable" | {| class="wikitable" | ||
|+ 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> | ||
<br> | <br> | ||
<center> | <center> | ||
{| class="wikitable" | {| class="wikitable" | ||
! | ! ビット名 !! 説明 | ||
|- | |||
| 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> | ||
<br> | <br> | ||
<center> | <center> | ||
{| class="wikitable" | {| class="wikitable" | ||
! | ! ビット名 !! 説明 | ||
|- | |||
| 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" | | | colspan="2" | UMSELn1-0 || colspan="2" | UPMn1-0 || USBSn || colspan="2" | UCSZn1-0 || UCPOLn | ||
| colspan = "2" | | |||
| USBSn | |||
| colspan = "2" | | |||
| UCPOLn | |||
|} | |} | ||
</center> | </center> | ||
<br> | <br> | ||
<center> | |||
{| class="wikitable" | |||
! ビット名 !! 設定値 !! 説明 | |||
|- | |||
| 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> | |||
UBRR0の値は以下の式で計算する。<br> | |||
ここで、<math>f_{OSC}</math> は動作周波数[Hz]、<math>\mbox{BAUD}</math> はボーレート[bps]である。<br> | |||
<br> | |||
* U2Xn = 0 (通常速度) の場合 | |||
*: <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> | |||
計算例 : | |||
クロック周波数1[MHz]、ボーレート2400[bps]、通常速度の場合 | |||
<math>\mbox{UBRR0} = \dfrac{1000000}{16 \times 2400} - 1 = 25</math> | |||
<br><br> | |||
===== | == データの送受信 == | ||
==== データ送信 ==== | |||
UCSRnAレジスタのUDREn (ビット5) が1になると、送信バッファが空き状態となり送信可能になる。<br> | |||
<br> | <br> | ||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
while(!(UCSR0A & 0b00100000)); // | // 送信バッファが空くまで待機 | ||
UDR0 = data; | while (!(UCSR0A & 0b00100000)); | ||
</ | |||
// データを送信 | |||
UDR0 = data; | |||
</syntaxhighlight> | |||
<br> | <br> | ||
==== | ==== データ受信 ==== | ||
UCSRnAレジスタのRXCn (ビット7) が1になると、受信データが利用可能になる。<br> | |||
<br> | <br> | ||
<syntaxhighlight lang="c++"> | <syntaxhighlight lang="c++"> | ||
while(!(UCSR0A & 0b10000000)); // | // 受信完了まで待機 | ||
data = UDR0; | while (!(UCSR0A & 0b10000000)); | ||
</ | |||
// 受信データを読み出す | |||
data = UDR0; | |||
</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のドライバインストール
- FTDI社の公式サイトからドライバをダウンロードする。
- ダウンロードしたファイルを解凍する。
- FT232RLをPCに接続し、ドライバを要求されたら解凍したディレクトリ (CDM ○○ WHQL Certified) を指定する。
- インストールが完了するまで待機する。
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は、シリアル通信の制御と状態を管理するレジスタである。
| ビット | 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
| ビット | 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は、パリティ、ストップビット、データ長等の通信フォーマットを設定する。
| ビット | 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;