USBシリアル通信サンプル †USB-シリアル変換モジュールを使って、PCとAVRで通信ができるようにする。 今回使うUART(USART)は、送信と受信の2つのポートでデータのやり取りをする方式で、基本的には1対1の通信なのかな? AVRはこれらの方式をサポートしていて、それぞれ違うレジスタとポートを使って、機能を実現するっぽい。 秋月のUSB-シリアル変換モジュールをPCのUSBに繋ぐと、まず、ドライバのインストールをする必要がある。 ドライバは、以下のページからダウンロードできる。 VCPとD2XXというのがあるけど、今はどちらも同じファイルが置いてあるらしい。 ファイルを解凍しておいて、モジュールにPCからUSBを接続すると、ドライバのインストールウィザードが出るので、解凍したフォルダを指定してインストール。 インストールが終わると、デバイスマネージャのポートのところに、今インストールしたシリアルポートが出来ているはず。 とりあえずの動作確認を行うために、まず、TeraTermをダウンロードしてインストール。 で、モジュールのTXDとRXDのピンを、ジャンパで繋ぐ。 繋いだら、TeraTermを立ち上げて、接続先をシリアルの、インストールしたポートを指定。(今回はCOM8) TXDとRXDのピンを繋いでるジャンパを抜いたら、文字を入力しても表示されなくなるから、表示される=ちゃんと繋がってるってことで。 回路図 †今回は、RXD(PD0)とTXD(PD1)のピンを使うため、今までPDに繋がっていたLCDを、PBに移動しました。
で、FT232RLのTXD(送信側)をAVRのRXD(受信側)に、FT232RLのRXD(受信側)をAVRのTXD(送信側)に繋げて終了。 もうブレッドボードがいっぱいいっぱい……。 ↓ ちょっとすっきり! ソースコード †まず、メインで参照する各種ライブラリ。 #include <avr/io.h> #include "LcdLib.h" #define USART_BPS 25 // ボーレート設定値 void Usart_init( void ) { UBRR0 = USART_BPS; // ボーレート分周値レジスタ(1MHz駆動の2400bpsに設定) UCSR0B = 0b00011000; // 受信許可bitと送信許可bitを立てる UCSR0C = 0b00000110; // 非同期/パリティ禁止/停止1bit/データbit長8bit } void Usart_rcvchar( char *data ) { while( !( UCSR0A & 0b10000000 )){ ; // 受信完了フラグが立つまで待つ } *data = UDR0; // 受信データを出力引数に設定 } void Usart_sndchar( char data ) { while( !( UCSR0A & 0b00100000 )){ ; // 送信データレジスタが空くまで待つ } UDR0 = data; // 送信データをレジスタに設定 } int main( void ) { char data = ' '; // 受信/送信データ格納用 Lcd_init(); // LCD初期化 Lcd_setstr( "Receive Data:" ); // 初期表示 Usart_init(); // シリアル通信初期化 while( 1 ){ // 一文字受信 Usart_rcvchar( &data ); // LCDを初期位置に戻して、テキストと受信データを出力 Lcd_setpos( 0, 0 ); Lcd_setstr( "Receive Data:" ); Lcd_setchar( data ); // 受信データをエコーバック Usart_sndchar( data ); } return 0; } 基本動作 †まずは初期化。 UCSRBとUCSRCに設定してあるのは、ソース内コメント通り。 受信関数、送信関数は簡単ですね。 メインは、初期化後、受け取ってLCDに表示してPCに戻すというループを繰り返しているだけです。 あぁ、ちなみに、動かすときは、まずAVRの電源を入れて、PCにCOMポートを認識させた上で、今回は2400bpsに設定しているので、TeraTerm等でそのCOMポートに2400bpsで繋いで(設定→シリアルポート)から、文字を入力してください。 というわけで、実際に動かしてみたのはこんな感じ。 ボーレートを上げるには、ベースクロックを上げたり、倍速モードbitを立ててやんないとならないらしい。 おまけ †UART部分をライブラリ化して、LCDに受信したデータの16進コードも表示する機能をつけてみた。 #include <stdio.h> #include "LcdLib.h" #include "UsartLib.h" int main( void ) { char data = ' '; // 受信/送信データ格納用 char str[5] = " "; // 16進コード格納用 Lcd_init(); // LCD初期化 Lcd_setstr( "Receive Data:" ); // 初期表示 Usart_init(); // シリアル通信初期化 while( 1 ){ // 一文字受信 Usart_rcvchar( &data ); // LCDを初期位置に戻して、テキストと受信データを出力 Lcd_setpos( 0, 0 ); Lcd_setstr( "Receive Data:" ); Lcd_setchar( data ); // 2行目に16進コードを出力 Lcd_setpos( 1, 0 ); sprintf( str, "0x%02X", data ); Lcd_setstr( str ); // 受信データをエコーバック Usart_sndchar( data ); } return 0; }
|