📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
| (同じ利用者による、間の10版が非表示) | |||
| 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> | |||
* FT232RL (USB-シリアル変換モジュール) | |||
* USB mini-Bケーブル | |||
* FT232RLドライバ (PCにインストール) | |||
<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> | <br> | ||
==== ATmega328との接続 ==== | |||
下図に、USBポートから電源を取る場合の接続例を示す。<br> | |||
<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 | ||
| 44行目: | 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 | ||
| 63行目: | 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> | <br> | ||
==== | ==== ボーレートの設定 ==== | ||
ボーレートはUBRR0レジスタで設定する。<br> | |||
<br> | <br> | ||
UBRR0の値は以下の式で計算する。<br> | |||
ここで、<math>f_{OSC}</math> は動作周波数[Hz]、<math>\mbox{BAUD}</math> はボーレート[bps]である。<br> | |||
<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> | <br> | ||
計算例 : | |||
クロック周波数1[MHz]、ボーレート2400[bps]、通常速度の場合 | |||
<math>UBRR0 = \ | <math>\mbox{UBRR0} = \dfrac{1000000}{16 \times 2400} - 1 = 25</math> | ||
<br><br> | <br><br> | ||
== | == データの送受信 == | ||
==== データ送信 ==== | |||
UCSRnAレジスタのUDREn (ビット5) が1になると、送信バッファが空き状態となり送信可能になる。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// 送信バッファが空くまで待機 | |||
while (!(UCSR0A & 0b00100000)); | |||
// データを送信 | |||
UDR0 = data; | |||
</syntaxhighlight> | |||
<br> | |||
==== データ受信 ==== | |||
UCSRnAレジスタのRXCn (ビット7) が1になると、受信データが利用可能になる。<br> | |||
<br> | |||
<syntaxhighlight lang="c++"> | |||
// 受信完了まで待機 | |||
while (!(UCSR0A & 0b10000000)); | |||
// 受信データを読み出す | |||
data = UDR0; | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:AVR]] | [[カテゴリ:AVR]] | ||