概要
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;