「ATmega328のUSARTの使用方法(実践)」の版間の差分
(ページの作成:「== 概要 == PCとATmega328の間で、データの送受信を行う方法としてシリアル通信がある。<br> ATmega328では、シリアル通信が簡単にで…」) |
細 (文字列「<source lang」を「<syntaxhighlight lang」に置換) |
||
22行目: | 22行目: | ||
<br> | <br> | ||
ボーレートの計算やレジスタの設定等は、[[ATmega328のUSARTの使用方法(準備)|こちらのページ]]を参照すること。<br> | ボーレートの計算やレジスタの設定等は、[[ATmega328のUSARTの使用方法(準備)|こちらのページ]]を参照すること。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
// 受信用(ATmega328で受信) | // 受信用(ATmega328で受信) | ||
// UBRR0 = ATmega328のクロック周波数 / (ボーレート * 16) - 1 | // UBRR0 = ATmega328のクロック周波数 / (ボーレート * 16) - 1 |
2021年11月15日 (月) 00:30時点における版
概要
PCとATmega328の間で、データの送受信を行う方法としてシリアル通信がある。
ATmega328では、シリアル通信が簡単にできるUSARTという機能があるので、USARTの知識と使用方法を記載する。
PCとATmega328でデータの送受信をする
PCからデータを送信し、ATmega328そのデータを受信する。
また、確認として受信したデータをPCに送信する。
ここでは、PCとATmega328の間での、通信速度(ボーレート)は2400とする。
PCからATmega328にデータを送信するには、TeraTermを使用して、シリアル通信によりデータを送信する。
まず、TeraTermを起動して、[設定] - [シリアルポート]を選択する。
[シリアルポート設定]画面が開くので、COMポート番号やビットレート、パリティ等の設定を行う。
この設定は、ATmega328のUSARTのUCSRnAレジスタ等で設定したものと同じ設定にする。
ATmega328のレジスタの設定は、こちらのページを参照すること。
サンプルコード
PCから送信されたデータを、ATmega328で受信するためのサンプルコードを以下に記述する。
また、ATmega328が受信したかどうかを確認するために、受信したデータをPCに送信する。
ボーレートの計算やレジスタの設定等は、こちらのページを参照すること。
<syntaxhighlight lang="c++"> // 受信用(ATmega328で受信) // UBRR0 = ATmega328のクロック周波数 / (ボーレート * 16) - 1 // ボーレート : 2400 // 動作周波数 : 1[MHz] // UBRR0 = 25 // // UCSR0B : 送受信を有効にする設定 // 000 1 1 000 // 受信有効 送信有効 // // UCSR0C : 非同期動作、データビット長を8bitとして設定 // 00000110 // // UDR0 : 送受信するデータのレジスタ // // UCSR0AのUDRE : 送信の準備ができた場合、1になる // 送信 -> 00100000 // // UCSR0AのRXC : 受信の準備ができた場合、1になる // 受信 -> 10000000 // 注意 : キーボードで改行すると、\rになる #include <avr/io.h> #include <util/delay.h> int main() { unsigned char data = 0; // 受信データを格納 DDRD = 0b11111100; // PD0とPD1以外を出力にする PORTD = 0b00000000; UBRR0 = 25; // ボーレート2400@1[MHz] UCSR0A = 0b00000000; // 受信の準備ができた場合、0b10000000になる // 送信の準備ができた場合、0b00100000になる UCSR0B = 0b00011000; // 送受信有効 UCSR0C = 0b00000110; // データ長 : 8bit // 非同期 // パリティなし // ストップビット : 1bit while(1) { // 受信するまで待機する while(!(UCSR0A & 0b10000000)); data = UDR0; // 受信したデータを格納する // 受信完了を確認するために受信データを送信する // 送信の準備ができるまで待機する while(!(UCSR0A & 0b00100000)); UDR0 = data; // データを送信する } return 0; } </source>
上記のソースコードをATmega328に書き込み、FT232RL等でPCとATmega328を接続してシリアル通信ができるようにする。
そして、TeraTerm等を起動して、ボーレートの設定をATmega328と同じ設定にする。
例えば、TeraTermでは、ボーレートを2400、データ長を8bit、パリティをnone、ストップビットは1bit、フローはnoneにする。