📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
編集の要約なし |
|||
| 1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
ATmega328には、PCとのシリアル通信を簡単に実現するUSART (Universal Synchronous/Asynchronous Receiver/Transmitter) 機能が搭載されている。<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 | |+ UCSRnA : USART制御/状態レジスタA (n = 0 または 1) | ||
|- | |- | ||
! ビット !! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0 | ! ビット !! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0 | ||
| 50行目: | 60行目: | ||
! ビット名 !! 説明 | ! ビット名 !! 説明 | ||
|- | |- | ||
| RXCn | | RXCn || 受信完了フラグ。<br>未読データがあるとき1になる | ||
| | |||
|- | |- | ||
| TXCn | | TXCn || 送信完了フラグ。<br>送信が完了すると1になる。<br>送信完了割り込みを発生可能 | ||
| | |||
|- | |- | ||
| UDREn | | UDREn || 送信データレジスタ空きフラグ。<br>送信バッファが新規データを受け取れる状態で1になる。<br>送信バッファ空き割り込みを発生可能 | ||
| | |||
|- | |- | ||
| FEn | | FEn || フレーミングエラーフラグ。<br>受信バッファ内の次の文字にフレームエラーがあると1になる | ||
| | |||
|- | |- | ||
| DORn | | DORn || データオーバーランフラグ。<br>受信バッファ満杯時に新たなスタートビットを検出すると1になる | ||
| | |||
|- | |- | ||
| UPEn | | UPEn || パリティエラーフラグ。<br>受信バッファ内の次のフレームにパリティエラーがあると1になる | ||
| | |||
|- | |- | ||
| U2Xn | | U2Xn || 倍速許可 (非同期通信のみ)<br>1を設定すると分周比が16から8になり、通信速度が2倍になる | ||
| 倍速許可<br> | |||
|- | |- | ||
| MPCMn | | MPCMn || マルチプロセッサ通信モード<br>1を設定すると、アドレス情報を含まない受信データが無視される | ||
| | |||
|} | |} | ||
</center> | </center> | ||
<br> | <br> | ||
==== UCSRnB - 制御/状態レジスタB ==== | |||
<center> | <center> | ||
{| class="wikitable" | {| class="wikitable" | ||
|+ UCSRnB : USART制御 / 状態レジスタB | |+ UCSRnB : USART制御/状態レジスタB (n = 0 または 1) | ||
|- | |- | ||
! ビット !! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0 | ! ビット !! 7 !! 6 !! 5 !! 4 !! 3 !! 2 !! 1 !! 0 | ||
| 91行目: | 94行目: | ||
! ビット名 !! 説明 | ! ビット名 !! 説明 | ||
|- | |- | ||
| RXCIEn | | RXCIEn || 受信完了割り込み許可<br>RXCnによる割り込みを許可する | ||
| 受信完了割り込み許可<br> | |||
|- | |- | ||
| TXCIEn | | TXCIEn || 送信完了割り込み許可<br>TXCnによる割り込みを許可する | ||
| 送信完了割り込み許可<br> | |||
|- | |- | ||
| UDRIEn | | UDRIEn || 送信データレジスタ空き割り込み許可<br>UDREnによる割り込みを許可する | ||
| 送信データレジスタ空き割り込み許可<br> | |||
|- | |- | ||
| RXENn | | RXENn || 受信許可<br>USART受信機能を有効にする | ||
| 受信許可<br> | |||
|- | |- | ||
| TXENn | | TXENn || 送信許可<br>USART送信機能を有効にする | ||
| 送信許可<br> | |||
|- | |- | ||
| UCSZn2 | | UCSZn2 || データビット長選択ビット2<br>UCSRnCのUCSZn1, UCSZn0と組み合わせてデータビット長を設定する | ||
| | |||
|- | |- | ||
| RXB8n | | RXB8n || 9ビット長データ受信時の9ビット目 | ||
| | |||
|- | |- | ||
| TXB8n | | TXB8n || 9ビット長データ送信時の9ビット目 | ||
| | |||
|} | |} | ||
</center> | </center> | ||
<br> | <br> | ||
UCSRnC | ==== UCSRnC - 制御 / 状態レジスタC ==== | ||
UCSRnCは、パリティ、ストップビット、データ長等の通信フォーマットを設定する。<br> | |||
<br> | |||
<center> | <center> | ||
{| class="wikitable" | {| class="wikitable" | ||
|+ UCSRnC : USART制御/ 状態レジスタC | |+ 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> | ||
| 135行目: | 128行目: | ||
<center> | <center> | ||
{| class="wikitable" | {| 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> | </center> | ||
<br> | <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> | </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> | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:AVR]] | [[カテゴリ:AVR]] | ||