記事のミス等のお問い合わせはTwitterにてお願いします。AVRマイコンのシリアル通信カテゴリ:工作の基礎マイコン前回までは何回かに分けて割り込み処理のお話をしてきましたが、今回は内容がガラッと変わってシリアル通信のお話を行います。ちなみに、Atmega328Pには一般的にシリアル通信と言われる「USART」のほかにも、「I2C」や「SPI」もありますが、今回紹介するには「USART」です。初めに、この3つの通信方式を筆者の偏見で軽くまとめてみます。感覚的にまとめるとざっとこんな感じです。「USART」と「I2C」「SPI」通信の最大の差は、1対複数のバス通信が規格としてサポートされているかいないかと言えるでしょう。引き換えに「I2C」と「SPI」は通信可能な距離が短く、距離が延びると安定性が非常に低くなります。筆者の経験上、I2Cは数十センチの距離でもモータなどのノイズでエラーが発生し正しく通信できません。(SPIはArduinoのシールド程度の距離でしか使用していないので不明です)Arduino系の分野では「I2C」はセンサなどとの通信、「SPI」はシールドとの通信に使われることが多いです。SPI通信はAVRマイコンのシリアル書き込みにも使われていますね。今回紹介する「USART」は基本的には1対1の通信ですが、工夫をすることにより、1対複数の通信も実装することは可能です。これにより比較的長い距離でも高い安定性で複数の子に対して通信を行うことも可能というわけです。筆者はこの方法でモータ演奏基板の通信を行っています。(I2CとSPIは好みの問題で自分が実装する箇所には使っていません)前置きはこの程度にしておいて、実際にAVRマイコンでのシリアル通信の使い方の紹介をしていきたいと思います。いえ、基本的にシリアル通信は理論的な個所はほぼなく、条件次第で通信速度設定時に計算を行う程度となっているので、今回はレジスタの設定をメインに紹介を行いたいと思います。)のP138~P141に書かれています。このうちシリアル通信の動作の設定を行うレジスタは「UCSR0A」「UCSR0B」「UCSR0C」の3つ、通信速度の設定を行うレジスタは「UBRR0」(12bit必要なのでデータシートではUBRR0LとUBRR0Hと分かれているが、プログラム上は一括で書ける)となっており、通信データが入るレジスタが「UDR0」となっています。初めに設定のレジスタを見ていきましょう。(書き込み)7RXCUSART受信完了フラグ:USARTのデータの受信が完了すると1が設定されます。受信完了割り込みを使わない場合は、このビットを読み込むことで、データが届いているかの判定を行います。受信完了割り込みを使う場合はこのビットは1にする必要があります。受信完了割り込みを使う場合:1使わない場合:06TXCUSART送信完了フラグ:USARTのデータの送信が完了すると1が設定されます。送信完了割り込みを使う場合はこのビットは1にする必要があります。送信完了割り込みを使う場合:1使わない場合:05UDREUSART送信データレジスタ空きフラグ:送信のデータレジスタ(UDR0)がデータを受け取り可能な時に1が設定されます。データを送信するときはこのビットを読み込み、1であることを確認してから、データをUDR0に送ります。データレジスタ空割り込みを使う場合はこのビットは1にする必要があります。データレジスタ空割り込みを使う場合:1使わない場合:04FEフレーミング異常フラグ:フレーミング異常が発生した時に1が設定されますが、特に使いません。03DORデータオーバーラン発生フラグ:オーバーラン状態が発生した時に1が設定されますが特に使いません。02UPEバリティー誤りフラグ:受信したデータがバリティーチェックを通らかった(データが破損している)場合に1が設定されます。Arduinoとの通信(関数を使う場合)では使えません。01U2X倍速許可:非同期動作でシリアル通信の速度を倍にする設定ですが、特に必要性がないので使いません。倍速無効:0倍速許可:10MPCM複数プロセッサ通信動作:複数のマイコンを接続し到着データの選別を行う機能です。9bit通信が必須となり、Arduinoなどへの互換性確保が難しいので、今回は使いません。(書き込み)7RXCIE受信完了割り込み許可:受信完了の割り込みを許可するレジスタです。受信完了割り込みを使うときは、受信完了フラグ(RXC)に1を設定する必要があります。受信完了割り込みを使う場合:1使わない場合:06TXCIE送信完了割り込み許可:送信完了の割り込みを許可するレジスタです。送信完了割り込みを使うときは、送信完了フラグ(TXC)に1を設定する必要があります。送信完了割り込みを使う場合:1使わない場合:05UDRIE送信データレジスタ空き割り込み許可:データレジスタ空割り込みを許可するレジスタです。データレジスタ空割り込みを使うときは、送信データレジスタ空きフラグ(UDRE)に1を設定する必要があります。データレジスタ空割り込みを使う場合:1使わない場合:04RXEN受信許可:シリアル通信の受信部の動作を許可します。シリアルでデータを受信する場合は1を設定しなければなりません。データを受信する場合:1受信を行わない場合:03TXEN送信許可:シリアル通信の送信部の動作を許可します。シリアルでデータを送信する場合は1を設定しなければなりません。1対複数のシリアル通信を行う場合は、通常時は無効(0)にしないとIOが短絡するので注意が必要です。別途記載1RXB8受信データビット8:9bitのシリアル通信を行う場合は受信データの9bit目をここから読み出します。9bitのシリアル通信を行う場合は送信データの9bit目をここから書き込みます。SPI」から選択します。通常は「非同期動作」を選択します。非同期動作:0,0(UMSEL1,0)同期動作:0,1主装置SPI:1,16UMSEL05UPM1バリティー選択:バリティーチェックを「無効」「偶数バリティー」「奇数バリティー」から選択します。Arduinoなどと通信する場合は「無効」を選択します。(UPM1,0)偶数:1,0奇数:1,14UPM03USBS停止ビット選択:送信時に送られる停止ビットの長さを「1ビット」か「2ビット」から選択します。通常は、「1ビット」を選びます。1ビット:02ビット:12UCSZ1データビット長選択:シリアル通信のデータのビット長の選択を行います。「5ビット」から「9ビット」で選択できますが、通常は「8ビット」を選択します。5ビット:0,0,0(UCSZ2,1,0)6ビット:0,0,17ビット:0,1,08ビット:0,1,19ビット:1,1,1(複数プロセッサ動作許可を有効時選択)1UCSZ00UCPOLクロック極性選択:同期動作の時にデータの送受信時のクロックの状態を選択します。非同期動作では0を書き込みます。受信時下降端:0送信時下降端,受信時上昇端:1※ビット2,1は主装置SPI動作の時は設定項目自体が変わります。設定項目名がビット2:UDORD(データ順選択)、ビット1:UCPHA:クロック位相選択に変わります。詳細はここでは省略します。以上がシリアル通信(USART)の設定レジスタです。続いて、通信速度の設定レジスタの紹介をします。通信速度の設定レジスタは「UBRR0」です。このレジスタに値を設定することで通信速度が決定されます。このレジスタに入力する値はデータシートP136~P137のボートレート設定例の表から検索するか、データシートP126の数式を変換した以下の式で求めます。この検索、計算した値を「UBRR0」レジスタに入力することで通信速度が設定できます。最後にデータの送受信の方法ですが、やり方として2種類あり割り込みを使う方法と使わない方法に分けられます。前者の割り込みを使う方法の場合は、設定レジスタで割り込みを使う設定(割り込み許可と完了フラグを1)にし、割り込みの関数内で受信時は「UDR0レジスタから読み取り」送信時は「UDR0レジスタに書き込み」を行います。割り込みを使わない場合は、main関数の無限ループ内で各完了フラグが1に設定されているときに受信時は「UDR0レジスタから読み取り」送信時は「UDR0レジスタに書き込み」を行います。サンプルプログラム今回は割り込みを使った場合で、Arduinoからデータを受信するようにした場合のプログラムとなります。ここでの設定した内容は、上の設定レジスタの表の設定値の太線の値となっています。UDR0;}以上がサンプルプログラムとなります。今回はArduinoからのデータ受信を目的にプログラミングを行いました。今回まででモータを鳴らすための回路、プログラム設計に必要な基礎のお話はほぼ紹介したので、次回からは全体的な設計のお話を少ししたいと思います。そのあとまた気分次第でモータを鳴らすことにはつかない基礎的なお話もするかもしれないです。