📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
ページの作成:「== 概要 == ATmega328に用意されているUSART機能を使用してシリアル通信を行う。<br> USARTはUniversal Synchronous Asynchronous Receiver Transmitter…」 |
細 文字列「source lang」を「syntaxhighlight lang」に置換 |
||
| (同じ利用者による、間の2版が非表示) | |||
| 14行目: | 14行目: | ||
== ボーレートの設定 == | == ボーレートの設定 == | ||
設定したいボーレート(通信速度)に合わせて通信用の内部クロックを生成するため、下表の式を元にUBRRレジスタの値を算出する。<br> | 設定したいボーレート(通信速度)に合わせて通信用の内部クロックを生成するため、下表の式を元にUBRRレジスタの値を算出する。<br> | ||
[[ファイル:ATmega328 UART 1.jpg|フレームなし|中央]] | |||
BAUD : ボーレート<br> | BAUD : ボーレート<br> | ||
Fosc : ATmega328のクロック周波数<br> | Fosc : ATmega328のクロック周波数<br> | ||
< | <syntaxhighlight lang="c++"> | ||
// Set baudrate parameter | // Set baudrate parameter | ||
// RoundOff | // RoundOff | ||
UBRR0 = (U16)(((F32)F_CPU / (F32)BAUDRATE / 16.0) - 1.0 + 0.5); | UBRR0 = (U16)(((F32)F_CPU / (F32)BAUDRATE / 16.0) - 1.0 + 0.5); | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
表と式が異なるが、そのまま計算すると整数切り捨てのための誤差が大きくなるため、四捨五入で誤差を小さくしている。<br> | 表と式が異なるが、そのまま計算すると整数切り捨てのための誤差が大きくなるため、四捨五入で誤差を小さくしている。<br> | ||
| 27行目: | 28行目: | ||
UBRRレジスタのサンプル値もデータシートに記載されているので、そちらを参照して定数で指定してもよい。<br> | UBRRレジスタのサンプル値もデータシートに記載されているので、そちらを参照して定数で指定してもよい。<br> | ||
例えば、ATmega328のクロック周波数が8[MHz]のとき、ボーレート19.2[kbps]に設定したければUBRRレジスタの値は25になる。<br> | 例えば、ATmega328のクロック周波数が8[MHz]のとき、ボーレート19.2[kbps]に設定したければUBRRレジスタの値は25になる。<br> | ||
[[ファイル:ATmega328 UART 2.jpg|フレームなし|中央]] | |||
<br><br> | <br><br> | ||
== レシーバとトランスミッタの有効化 == | == レシーバとトランスミッタの有効化 == | ||
レシーバとトランスミッタの有効化は、USARTのコントロールレジスタを設定する。<br> | レシーバとトランスミッタの有効化は、USARTのコントロールレジスタを設定する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
// Enable receiver and transmitter | // Enable receiver and transmitter | ||
UCSR0B = (1 << RXEN0) | (1 << TXEN0); | UCSR0B = (1 << RXEN0) | (1 << TXEN0); | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
| 58行目: | 60行目: | ||
<br> | <br> | ||
上表において、スタートビットは常に1[bit]なので、残りの3項目のビット数を設定する。<br> | 上表において、スタートビットは常に1[bit]なので、残りの3項目のビット数を設定する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
// Set frame format: 8data, 1stop bit : 8N1 | // Set frame format: 8data, 1stop bit : 8N1 | ||
UCSR0C = (0 << USBS0) | (3 << UCSZ00); | UCSR0C = (0 << USBS0) | (3 << UCSZ00); | ||
</ | </syntaxhighlight> | ||
一般的には、データビット8[bit]、パリティビット無し、ストップビット1[bit]の通称8N1という形式が多い。<br> | 一般的には、データビット8[bit]、パリティビット無し、ストップビット1[bit]の通称8N1という形式が多い。<br> | ||
ここでも、8N1形式で送受信を行う。<br> | ここでも、8N1形式で送受信を行う。<br> | ||
| 73行目: | 75行目: | ||
===== 送信方法 ===== | ===== 送信方法 ===== | ||
送信バッファが空になるまで待機し、UDR0レジスタに1[Byte]分のデータを書き込む。<br> | 送信バッファが空になるまで待機し、UDR0レジスタに1[Byte]分のデータを書き込む。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
void Transmit1Byte(char data) | void Transmit1Byte(char data) | ||
{ | { | ||
| 82行目: | 84行目: | ||
UDR0 = data; | UDR0 = data; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
===== 受信方法 ===== | ===== 受信方法 ===== | ||
1[Byte]分のデータを受信するまで待機(ポーリング)し、UDR0レジスタを読み取る。<br> | 1[Byte]分のデータを受信するまで待機(ポーリング)し、UDR0レジスタを読み取る。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
char Receive1Byte(void) | char Receive1Byte(void) | ||
{ | { | ||
| 96行目: | 98行目: | ||
return UDR0; | return UDR0; | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:AVR]] | [[カテゴリ:AVR]] | ||