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

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

編集の要約なし
1行目: 1行目:
== 概要 ==
== 概要 ==
PCとATmega328の間で、データの送受信を行う方法としてシリアル通信がある。<br>
ATmega328には、PCとのシリアル通信を簡単に実現するUSART (Universal Synchronous/Asynchronous Receiver/Transmitter) 機能が搭載されている。<br>
ATmega328では、シリアル通信が簡単にできるUSARTという機能があるので、USARTの知識と使用方法を記載する。<br>
<br><br>
<br><br>


== シリアル通信とUSART ==
== ハードウェアのセットアップ ==
===== シリアル通信で必要なもの =====
==== 必要なもの ====
PCとATmega328の間で通信するために、両者を接続するものが必要である。<br>
ATmega328とPCをシリアル通信で接続するには、以下に示すものが必要である。<br>
ここでは、FT232RL(USB−シリアル変換モジュール)を使用して、ATmega328のUSART機能でシリアル通信を行う。<br>
<br>
<br>
===== ATmega328のシリアル通信で必要なもの =====
* FT232RL (USB-シリアル変換モジュール)
FT232RL(USB−シリアル変換モジュール)<br>
* USB mini-Bケーブル
USB miniBケーブル(FT232RLとPCを接続するケーブル)<br>
* FT232RLドライバ (PCにインストール)
FT232RLのドライバ(PCにインストールする)<br>
<br>
<br>
===== FT232RLのドライバのインストール方法 =====
==== FT232RLのドライバインストール ====
# ドライバをFTDI社からダウンロードする。
# FTDI社の公式サイトからドライバをダウンロードする。
# ダウンロードしたドライバを解凍する。
# ダウンロードしたファイルを解凍する。
# FT232RLをPCに接続すると、ドライバを要求されるので、解凍したドライバのフォルダ(CDM ○○ WHQL Certified)を選択する。
# FT232RLをPCに接続し、ドライバを要求されたら解凍したディレクトリ (CDM ○○ WHQL Certified) を指定する。
# ドライバのインストールが完了する。
# インストールが完了するまで待機する。
<br>
<br>
FT232RLは、USBポートから電源をとるか、外部から電源を供給するかをジャンパにより電源(Vcc)を選択することができる。<br>
==== FT232RLの設定 ====
その他に、I/Oピンの電圧を3.3[V]またはVccかをジャンパにより選択することができる。<br>
FT232RLは、ジャンパ設定により電源供給方法とI/O電圧を選択できる。<br>
<br>
<br>
* ジャンパ1(J1)
===== ジャンパ1 (J1) - I/O電圧選択 =====
** 1 - 2間をショート : I/Oの電圧を3.3[V]にする
* 1-2間ショート
** 2 - 3間をショート : I/Oの電圧をVccにする
*: I/O電圧を3.3Vに設定
* 2-3間ショート
*: I/O電圧をVccに設定
<br>
<br>
* ジャンパ2(J2)
===== ジャンパ2 (J2) - 電源選択 =====
** 有り(ショート) : USBポートから電源を取る(Vcc = 5[V])
* ショート
** 無し(オープン) : 外部から電源を取る(Vcc = 3.3 - 5[V])
*: 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の設定 ==
===== 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"
|+ UCSRnA : USART制御 / 状態レジスタA<br>(n : 0 または 1)
|+ 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になる
| USART受信完了フラグ<br>未読データがあるときに1がセットされる
|-
|-
| TXCn
| TXCn || 送信完了フラグ。<br>送信が完了すると1になる。<br>送信完了割り込みを発生可能
| USART送信完了フラグ<br>新規データがないときに1がセットされる<br>送信完了割り込みを発生できる
|-
|-
| UDREn
| UDREn || 送信データレジスタ空きフラグ。<br>送信バッファが新規データを受け取れる状態で1になる。<br>送信バッファ空き割り込みを発生可能
| USART送信データレジスタ空きフラグ<br>送信バッファが新規データを受け取る準備ができたら1がセットされる<br>送信バッファ空き割り込みを発生できる
|-
|-
| FEn
| FEn || フレーミングエラーフラグ。<br>受信バッファ内の次の文字にフレームエラーがあると1になる
| フレーミング異常フラグ<br>受信バッファ内の次の文字にフレームエラーが発生したときに1になる
|-
|-
| DORn
| DORn || データオーバーランフラグ。<br>受信バッファ満杯時に新たなスタートビットを検出すると1になる
| データオーバーラン発生フラグ<br>データオーバーランを検出すると1になる<br>受信バッファが満杯のときに、新たにスタートビットを検出するとデータオーバーランが発生する
|-
|-
| UPEn
| UPEn || パリティエラーフラグ。<br>受信バッファ内の次のフレームにパリティエラーがあると1になる
| パリティ誤りフラグ<br>受信バッファ内の次のフレームにパリティエラーが発生したときに設定される
|-
|-
| U2Xn
| U2Xn || 倍速許可 (非同期通信のみ)<br>1を設定すると分周比が16から8になり、通信速度が2倍になる
| 倍速許可<br>非同期通信のみ有効で、1を設定すると分周比を16から8にする<br>結果として、通信速度が2倍になる
|-
|-
| MPCMn
| MPCMn || マルチプロセッサ通信モード<br>1を設定すると、アドレス情報を含まない受信データが無視される
| 1を設定すると、マルチプロセッサ通信モードが有効になる<br>アドレス情報を含まない受信データが無視される
|}
|}
</center>
</center>
<br>
<br>
==== UCSRnB - 制御/状態レジスタB ====
<center>
<center>
{| class="wikitable"
{| class="wikitable"
|+ UCSRnB : USART制御 / 状態レジスタB<br>(n : 0 または 1)
|+ 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>UCSRnAの受信完了フラグ(RXCn)での割り込みを許可する
|-
|-
| TXCIEn
| TXCIEn || 送信完了割り込み許可<br>TXCnによる割り込みを許可する
| 送信完了割り込み許可<br>UCSRnAの送信完了フラグ(TXCn)での割り込みを許可する
|-
|-
| UDRIEn
| UDRIEn || 送信データレジスタ空き割り込み許可<br>UDREnによる割り込みを許可する
| 送信データレジスタ空き割り込み許可<br>UCSRnAのUDREnでの割り込みを許可する
|-
|-
| RXENn
| RXENn || 受信許可<br>USART受信機能を有効にする
| 受信許可<br>USART受信を許可する
|-
|-
| TXENn
| TXENn || 送信許可<br>USART送信機能を有効にする
| 送信許可<br>USART送信を許可する
|-
|-
| UCSZn2
| UCSZn2 || データビット長選択ビット2<br>UCSRnCのUCSZn1, UCSZn0と組み合わせてデータビット長を設定する
| データビット長選択2<br>USCRnCのUCSZn1とUCSZn0ビットと組み合わせたUCSZn2は、送受信フレームのデータのビット長を設定する
|-
|-
| RXB8n
| RXB8n || 9ビット長データ受信時の9ビット目
| 9ビット長のデータを受信したときの9番目のビット
|-
|-
| TXB8n
| TXB8n || 9ビット長データ送信時の9ビット目
| 9ビット長のデータを送信するときの9番目のビット
|}
|}
</center>
</center>
<br>
<br>
UCSRnC (USART Control and Status Register n C) は、パリティやストップビットの設定を行うためのレジスタである。<br>
==== UCSRnC - 制御 / 状態レジスタC ====
UCSRnCは、パリティ、ストップビット、データ長等の通信フォーマットを設定する。<br>
<br>
<center>
<center>
{| class="wikitable"
{| class="wikitable"
|+ UCSRnC : USART制御/ 状態レジスタC<br>(n : 0 または 1)
|+ 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>
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ビット
|-
|-
| UMSELn 1 - 0
| 010 || 7ビット
| USART動作選択<br>00(非同期動作)<br>01(同期動作)<br>10(予約)<br>11(マスターSPI)
|-
|-
| UPMn 1 - 0
| 011 || 8ビット
| パリティ選択<br>00(禁止)<br>01(予約)<br>10(偶数パリティ許可)<br>11(奇数パリティ許可)
|-
|-
| USBSn
| 111 || 9ビット
| 送信時に挿入されるストップビットのビット数を指定する<br>0 : ストップビットは1ビット<br>1 : ストップビットは2ビット
|-
|-
| UCSZn 1 - 0
| rowspan="2" | UCPOLn
| データビット長を選択<br>UCSZn2と組み合わせて使用する<br>000(5bit)<br>001(6bit)<br>010(7bit)<br>011(8bit)<br>111(9bit)<br>他は予約
| 0 || 非同期モード
|-
|-
| UCPOLn
| 1 || 同期モード (クロック極性選択)
| クロック極性を選択する<br>1 : 同期モード<br>0 : 非同期モード
|}
|}
</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レジスタの5ビット目であるUDREnに1がセットされると送信が有効になる。<br>
==== データ送信 ====
UCSRnAレジスタのUDREn (ビット5) が1になると、送信バッファが空き状態となり送信可能になる。<br>
<br>
<br>
例えば、下記のように記述すれば、送信が有効になると変数dataを送信することができる。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  while(!(UCSR0A & 0b00100000));  // 送信が有効になるまで待つ
// 送信バッファが空くまで待機
  UDR0 = data;                     // データを送信する
  while (!(UCSR0A & 0b00100000));
  // データを送信
  UDR0 = data;
  </syntaxhighlight>
  </syntaxhighlight>
<br>
<br>
===== 受信のタイミング =====
==== データ受信 ====
受信のタイミングは、UCSRnAレジスタの7ビット目であるRXCnに1がセットされると受信は有効になる。<br>
UCSRnAレジスタのRXCn (ビット7) が1になると、受信データが利用可能になる。<br>
<br>
<br>
例えば、下記のように記述すれば、受信が有効になるまで待機し、データを受信することができる。<br>
  <syntaxhighlight lang="c++">
  <syntaxhighlight lang="c++">
  while(!(UCSR0A & 0b10000000));  // 受信が有効になるまで待つ
// 受信完了まで待機
  data = UDR0;                     // 受信したデータを格納する
  while (!(UCSR0A & 0b10000000));
  // 受信データを読み出す
  data = UDR0;
  </syntaxhighlight>
  </syntaxhighlight>
<br>
===== ボーレートの設定 =====
USARTのボーレートの設定は、UBRR0レジスタで設定する。(動的に設定することも可能)<br>
<br>
UBRR0の値は、以下の式で計算することができる。<br>
<math>UBRR0 = \frac{\mbox{動 作 周 波 数}}{\mbox{ボ ー レ ー ト} * 16} - 1</math>  <math>\mbox{(U2Xn = 0 の と き)}</math><br>
<math>UBRR0 = \frac{\mbox{動 作 周 波 数}}{\mbox{ボ ー レ ー ト} * 8} - 1</math>  <math>\mbox{(U2Xn = 1( 倍 速 許 可 ) の と き)}</math><br>
<br>
例えば、ATmega328のクロック周波数が1[MHz]、ボーレートを2400として通信する場合、UBRR0レジスタは下記の値となる。<br>
<math>UBRR0 = \frac{1000000}{2400 * 16} - 1 = 25</math><br>
<br><br>
== FT232RLとATmega328の接続方法 ==
USBポートから電源を取る場合は、以下のように回路を組めばシリアル通信ができる。<br>
[[ファイル:ATmega328 USART Ready 1.jpg|フレームなし|中央]]
<br><br>
<br><br>


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