MochiuWiki : SUSE, EC, PCB
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
検索
個人用ツール
ログイン
Toggle dark mode
名前空間
ページ
議論
表示
閲覧
ソースを閲覧
履歴を表示
ATmega328でUART通信のソースを表示
提供: MochiuWiki : SUSE, EC, PCB
←
ATmega328でUART通信
あなたには「このページの編集」を行う権限がありません。理由は以下の通りです:
この操作は、次のグループのいずれかに属する利用者のみが実行できます:
管理者
、new-group。
このページのソースの閲覧やコピーができます。
== 概要 == ATmega328に用意されているUSART機能を使用してシリアル通信を行う。<br> USARTはUniversal Synchronous Asynchronous Receiver Transmitterの略で、<br> 非同期通信のUARTだけでなく、同期通信も可能とした機能のことである。<br> <br> 今回は、非同期通信のUARTについてのみ記述する。<br> <br> AVRのマイコンでUARTを使うには、以下の3つの設定を行う必要がある。<br> # ボーレートの設定 # レシーバとトランスミッタの有効化 # フレームフォーマットの設定 <br><br> == ボーレートの設定 == 設定したいボーレート(通信速度)に合わせて通信用の内部クロックを生成するため、下表の式を元にUBRRレジスタの値を算出する。<br> [[ファイル:ATmega328 UART 1.jpg|フレームなし|中央]] BAUD : ボーレート<br> Fosc : ATmega328のクロック周波数<br> <source lang="c++"> // Set baudrate parameter // RoundOff UBRR0 = (U16)(((F32)F_CPU / (F32)BAUDRATE / 16.0) - 1.0 + 0.5); </source> <br> 表と式が異なるが、そのまま計算すると整数切り捨てのための誤差が大きくなるため、四捨五入で誤差を小さくしている。<br> 誤差が大きくなると文字化けするので、適宜試しながら正しく通信できる速度を探らなければならない。<br> <br> UBRRレジスタのサンプル値もデータシートに記載されているので、そちらを参照して定数で指定してもよい。<br> 例えば、ATmega328のクロック周波数が8[MHz]のとき、ボーレート19.2[kbps]に設定したければUBRRレジスタの値は25になる。<br> [[ファイル:ATmega328 UART 2.jpg|フレームなし|中央]] <br><br> == レシーバとトランスミッタの有効化 == レシーバとトランスミッタの有効化は、USARTのコントロールレジスタを設定する。<br> <source lang="c++"> // Enable receiver and transmitter UCSR0B = (1 << RXEN0) | (1 << TXEN0); </source> <br><br> == フレームフォーマットの設定 == シリアル通信では1本の信号線で時系列に0または1を送信することで通信を行う。<br> そのため、予めどのようなフォーマットでデータを送信するかを定義する必要がある。<br> <br> シリアル通信のフレームフォーマットは以下の要素で構成されます。<br> <center> {| class="wikitable" |- ! 名称 !! ビット数 !! 説明 |- | スタートビット || 1 || フレームの先頭であることを示すビット |- | データビット || 5 - 9 || 送信するデータ<br>5 - 9[bit]の範囲で自由に設定できる |- | パリティビット || 0 or 1 || ビットの誤りをチェックするビット<br>設定しなくともよい |- | ストップビット || 1 or 2 || フレームの終わりであることを示すビット |} </center> <br> 上表において、スタートビットは常に1[bit]なので、残りの3項目のビット数を設定する。<br> <source lang="c++"> // Set frame format: 8data, 1stop bit : 8N1 UCSR0C = (0 << USBS0) | (3 << UCSZ00); </source> 一般的には、データビット8[bit]、パリティビット無し、ストップビット1[bit]の通称8N1という形式が多い。<br> ここでも、8N1形式で送受信を行う。<br> <br><br> == サンプルコード == 送信と受信ともにUDR0レジスタを用いて1[byte]データを操作する。<br> 1度の操作で1[byte]しか扱えないため、数byteを送受信するときは単純に同じ操作を繰り返す。<br> <br> ===== 送信方法 ===== 送信バッファが空になるまで待機し、UDR0レジスタに1[Byte]分のデータを書き込む。<br> <source lang="c++"> void Transmit1Byte(char data) { // Wait for empty transmit buffer while(!(UCSR0A & (1 << UDRE0))); // Put data into buffer, sends the data UDR0 = data; } </source> <br> ===== 受信方法 ===== 1[Byte]分のデータを受信するまで待機(ポーリング)し、UDR0レジスタを読み取る。<br> <source lang="c++"> char Receive1Byte(void) { // Wait for data to be received while(!(UCSR0A & (1 << RXC0))); // Get and return received data from buffer return UDR0; } </source> <br><br> __FORCETOC__ [[カテゴリ:AVR]]
ATmega328でUART通信
に戻る。
案内
メインページ
最近の更新
おまかせ表示
MediaWiki についてのヘルプ
ツール
リンク元
関連ページの更新状況
特別ページ
ページ情報
We ask for
Donations
Collapse