📢 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>
  <source lang="c++">
  <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);
  </source>
  </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>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  // Enable receiver and transmitter
  // Enable receiver and transmitter
  UCSR0B = (1 << RXEN0) | (1 << TXEN0);
  UCSR0B = (1 << RXEN0) | (1 << TXEN0);
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


58行目: 60行目:
<br>
<br>
上表において、スタートビットは常に1[bit]なので、残りの3項目のビット数を設定する。<br>
上表において、スタートビットは常に1[bit]なので、残りの3項目のビット数を設定する。<br>
  <source lang="c++">
  <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);
  </source>
  </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>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  void Transmit1Byte(char data)
  void Transmit1Byte(char data)
  {
  {
82行目: 84行目:
     UDR0 = data;
     UDR0 = data;
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>


===== 受信方法 =====
===== 受信方法 =====
1[Byte]分のデータを受信するまで待機(ポーリング)し、UDR0レジスタを読み取る。<br>
1[Byte]分のデータを受信するまで待機(ポーリング)し、UDR0レジスタを読み取る。<br>
  <source lang="c++">
  <syntaxhighlight lang="c++">
  char Receive1Byte(void)
  char Receive1Byte(void)
  {
  {
96行目: 98行目:
     return UDR0;
     return UDR0;
  }
  }
  </source>
  </syntaxhighlight>
<br><br>
<br><br>


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