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

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

 
(同じ利用者による、間の10版が非表示)
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>
実際の通信では、誤差を考慮して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
44行目: 62行目:
|}
|}
</center>
</center>
* RXCn  : USART受信完了フラグ<br>未読データがあるときに1がセットされる
* TXCn  : USART送信完了フラグ<br>新規データがないときに1がセットされる<br>送信完了割り込みを発生できる
* UDREn : USART送信データレジスタ空きフラグ<br>送信バッファが新規データを受け取る準備ができたら1がセットされる<br>送信バッファ空き割り込みを発生できる
* FEn  : フレーミング異常フラグ
* DORn  : データオーバーラン発生フラグ
* UPEn  : パリティ誤りフラグ
* U2Xn  : 倍速許可<br>非同期動作のときのみ有効
* MPCMn : 複数プロセッサ通信動作
<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
63行目: 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,0ビットと組み合わせたUCSZn2は、送受信フレームのデータビット数を設定する
* RXB8n  : 受信データビット8
* TXB8n  : 送信データビット8
<br>
<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        : 禁止ビット選択
* UCSZn 1 - 0  : データビット長選択<br>UCSZn2と組み合わせて使用する<br>000(5bit)<br>001(6bit)<br>010(7bit)<br>011(8bit)<br>111(9bit)<br>他は予約
* UCPOLn      : クロック極性選択<br>同期動作のときのみ有効
<br>
<br>
 
<center>
===== 送信のタイミング =====
{| class="wikitable"
送信のタイミングは、UCSRnAレジスタの5ビット目であるUDREnに1がセットされると送信が有効になる。<br>
! ビット名 !! 設定値 !! 説明
<br>
|-
例えば、下記のように記述すれば、送信が有効になると変数dataを送信することができる。<br>
| rowspan="4" | UMSELn1-0
<source lang="c++">
| 00 || 非同期動作
while(!(UCSR0A & 0b00100000));  // 送信が有効になるまで待つ
|-
UDR0 = data;                      // データを送信する
| 01 || 同期動作
</source>
|-
| 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>
===== 受信のタイミング =====
==== ボーレートの設定 ====
受信のタイミングは、UCSRnAレジスタの7ビット目であるRXCnに1がセットされると受信は有効になる。<br>
ボーレートはUBRR0レジスタで設定する。<br>
<br>
<br>
例えば、下記のように記述すれば、受信が有効になるまで待機し、データを受信することができる。<br>
UBRR0の値は以下の式で計算する。<br>
<source lang="c++">
ここで、<math>f_{OSC}</math> は動作周波数[Hz]、<math>\mbox{BAUD}</math> はボーレート[bps]である。<br>
while(!(UCSR0A & 0b10000000));  // 受信が有効になるまで待つ
data = UDR0;                      // 受信したデータを格納する
</source>
<br>
<br>
===== ボーレートの設定 =====
* U2Xn = 0 (通常速度) の場合
USARTのボーレートの設定は、UBRR0レジスタで設定する。(動的に設定することも可能)<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>
UBRR0の値は、以下の式で計算することができる。<br>
計算例 :
<math>UBRR0 = \frac{\mbox{動 作 周 波 数}}{\mbox{ボ ー レ ー ト} * 16} - 1</math><br>
クロック周波数1[MHz]、ボーレート2400[bps]、通常速度の場合
例えば、ATmega328のクロック周波数が1[MHz]、ボーレートを2400として通信する場合、UBRR0レジスタは下記の値となる。<br>
<math>UBRR0 = \frac{1000000}{2400 * 16} - 1 = 25</math><br>
<math>\mbox{UBRR0} = \dfrac{1000000}{16 \times 2400} - 1 = 25</math>
<br><br>
<br><br>


== FT232RLとATmega328の接続方法 ==
== データの送受信 ==
USBポートから電源を取る場合は、以下のように回路を組めばシリアル通信ができる。<br>
==== データ送信 ====
[[ファイル:ATmega328 USART Ready 1.jpg|フレームなし|中央]]
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]]