USBシリアル通信サンプル
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
#analog
#norelated
#contents
* USBシリアル通信サンプル [#h0f365ac]
USB-シリアル変換モジュールを使って、PCとAVRで通信ができる...
AVRの通信というと、UART(USART)やら、I2Cやら、SPIやらとい...
今回使うUART(USART)は、送信と受信の2つのポートでデータの...
I2Cってのは、同じ2本だけど、複数繋いで、それぞれを識別し...
SPIは4本使って、複数繋いで、I2Cより速くデータを送れるバス...
AVRはこれらの方式をサポートしていて、それぞれ違うレジスタ...
UART(USART)はRXD(PD0)とTXD(PD1)、I2CはSCL(PC5)とSDA(PC4)...
[[秋月のUSB-シリアル変換モジュール:http://akizukidenshi.c...
FT232RのUSB UARTドライバと、USBシリアルポートドライバの2...
ドライバは、以下のページからダウンロードできる。~
[[FTDI社のドライバダウンロードページ:http://www.ftdichip....
VCPとD2XXというのがあるけど、今はどちらも同じファイルが置...
昔は用途で分かれていたとかなんとか。~
どっちのページに行ってもいいので、OS(今回はXP用)に対応し...
ファイルを解凍しておいて、モジュールにPCからUSBを接続する...
2回とも同じフォルダね。~
&ref(usb_uart.png,left,nowrap,75%,USB UARTドライバ);&ref(...
インストールが終わると、デバイスマネージャのポートのとこ...
今回の例だと、COM8として認識されています。(AVRライタがCOM...
#ref(devicemng.png,left,nowrap,デバイスマネージャ)
とりあえずの動作確認を行うために、まず、[[TeraTerm:http:/...
まぁ、標準のハイパーターミナルとかでもいいんだけど、使い...
で、モジュールのTXDとRXDのピンを、ジャンパで繋ぐ。~
送信ポートと受信ポートをつないで、ループバックで返すよう...
繋いだら、[[TeraTerm:http://sourceforge.jp/projects/ttssh...
繋がったら、適当に文字を入力してみて、それが画面に表示さ...
入力した文字が、USBを経由して、モジュールのTXD(送信側)か...
デフォルトの9600bpsでつながるけど、今回はこの速度のままで...
#ref(serealtest.png,left,nowrap,シリアルポートテスト)
TXDとRXDのピンを繋いでるジャンパを抜いたら、文字を入力し...
** 回路図 [#s3e509b8]
今回は、RXD(PD0)とTXD(PD1)のピンを使うため、今までPDに繋...
それに伴って、LCDライブラリも多少手を加えてあります。~
#ref(UsbTest.png,left,nowrap,USBシリアル通信サンプル)
%%FT232RLには、PCからUSBが繋がっており、電源はそっちから...
%%AVRの方から取ってもいいとは思うんだけど。%%~
試してみたら、FT232RLに繋がってるUSBの方から、経路はわか...
FT232RLにUSBを繋ぐと、基板の電源の方に付けている、導通確...
その電流の影響があるのか、基板のSWをONにした最初のタイミ...
リセットボタンを押すと、正常に表示されるんだけどね。~
なので、電源は基板と同じ方から取るようにしました。~
で、FT232RLのTXD(送信側)をAVRのRXD(受信側)に、FT232RLのRX...
#ref(UsbTestp.png,left,nowrap,USBシリアル通信サンプル)
もうブレッドボードがいっぱいいっぱい……。~
というわけで、後で追加でブレッドボードを購入します。~
↓
#ref(UsbTestp2.png,left,nowrap,USBシリアル通信サンプル)
ちょっとすっきり!~
** ソースコード [#y4a51868]
まず、メインで参照する各種ライブラリ。~
&ref(util.h,left,nowrap,ユーティリティヘッダ);&ref(util.c...
#include <avr/io.h>
#include "LcdLib.h"
#define USART_BPS 25 // ボーレート設定値
void Usart_init( void )
{
UBRR0 = USART_BPS; // ボーレート分周値レジスタ(1MHz駆...
UCSR0B = 0b00011000; // 受信許可bitと送信許可bitを立てる
UCSR0C = 0b00000110; // 非同期/パリティ禁止/停止1bit/デ...
}
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;
}
*** 基本動作 [#z4886d61]
まずは初期化。~
UBRRレジスタに、ボーレートを設定している。~
このボーレートを設定するレジスタは、実はUBRRHとUBRRLに分...
UCSRBとUCSRCに設定してあるのは、ソース内コメント通り。~
受信や送信完了での割り込みはしていません。~
パリティは調べたらなんとなくわかるけど、停止bitとかとあわ...
そのうち余力があれば掘り下げたいけど……。~
受信関数、送信関数は簡単ですね。~
それぞれ、なんか来たよフラグと、送る入れ物が空いてるよフ...
メインは、初期化後、受け取ってLCDに表示してPCに戻すという...
あぁ、ちなみに、動かすときは、まずAVRの電源を入れて、PCに...
最初、電源を入れずに[[TeraTerm:http://sourceforge.jp/proj...
#ref(ttsetting.png,left,nowrap,TeraTerm設定)
というわけで、実際に動かしてみたのはこんな感じ。~
[[TeraTerm:http://sourceforge.jp/projects/ttssh2/]]上でキ...
#u2b(8l0ro9lwqT0,w=480,h=385)
ボーレートを上げるには、ベースクロックを上げたり、倍速モ...
誤差とかも色々考慮しないとならないので、大変そうだ。~
クロックを上げると、今のLCDライブラリだと、動作不安定だし...
この辺も今後の課題。~
** おまけ [#f65768c2]
UART部分をライブラリ化して、LCDに受信したデータの16進コー...
&ref(UsartLib.h,left,nowrap,USARTライブラリヘッダ);&ref(U...
#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;
}
%%sprintfを使ってるけど、これでプログラムサイズが一気に3k...
%%ATmega168Pだったら、Flashは16kbあるので、まだまだ余裕(...
ごめん、そんなに増えないわ、増えるのは1kbくらいかも。~
hexファイルサイズが結構増えるけど、実際に書き込まれるサイ...
終了行:
#analog
#norelated
#contents
* USBシリアル通信サンプル [#h0f365ac]
USB-シリアル変換モジュールを使って、PCとAVRで通信ができる...
AVRの通信というと、UART(USART)やら、I2Cやら、SPIやらとい...
今回使うUART(USART)は、送信と受信の2つのポートでデータの...
I2Cってのは、同じ2本だけど、複数繋いで、それぞれを識別し...
SPIは4本使って、複数繋いで、I2Cより速くデータを送れるバス...
AVRはこれらの方式をサポートしていて、それぞれ違うレジスタ...
UART(USART)はRXD(PD0)とTXD(PD1)、I2CはSCL(PC5)とSDA(PC4)...
[[秋月のUSB-シリアル変換モジュール:http://akizukidenshi.c...
FT232RのUSB UARTドライバと、USBシリアルポートドライバの2...
ドライバは、以下のページからダウンロードできる。~
[[FTDI社のドライバダウンロードページ:http://www.ftdichip....
VCPとD2XXというのがあるけど、今はどちらも同じファイルが置...
昔は用途で分かれていたとかなんとか。~
どっちのページに行ってもいいので、OS(今回はXP用)に対応し...
ファイルを解凍しておいて、モジュールにPCからUSBを接続する...
2回とも同じフォルダね。~
&ref(usb_uart.png,left,nowrap,75%,USB UARTドライバ);&ref(...
インストールが終わると、デバイスマネージャのポートのとこ...
今回の例だと、COM8として認識されています。(AVRライタがCOM...
#ref(devicemng.png,left,nowrap,デバイスマネージャ)
とりあえずの動作確認を行うために、まず、[[TeraTerm:http:/...
まぁ、標準のハイパーターミナルとかでもいいんだけど、使い...
で、モジュールのTXDとRXDのピンを、ジャンパで繋ぐ。~
送信ポートと受信ポートをつないで、ループバックで返すよう...
繋いだら、[[TeraTerm:http://sourceforge.jp/projects/ttssh...
繋がったら、適当に文字を入力してみて、それが画面に表示さ...
入力した文字が、USBを経由して、モジュールのTXD(送信側)か...
デフォルトの9600bpsでつながるけど、今回はこの速度のままで...
#ref(serealtest.png,left,nowrap,シリアルポートテスト)
TXDとRXDのピンを繋いでるジャンパを抜いたら、文字を入力し...
** 回路図 [#s3e509b8]
今回は、RXD(PD0)とTXD(PD1)のピンを使うため、今までPDに繋...
それに伴って、LCDライブラリも多少手を加えてあります。~
#ref(UsbTest.png,left,nowrap,USBシリアル通信サンプル)
%%FT232RLには、PCからUSBが繋がっており、電源はそっちから...
%%AVRの方から取ってもいいとは思うんだけど。%%~
試してみたら、FT232RLに繋がってるUSBの方から、経路はわか...
FT232RLにUSBを繋ぐと、基板の電源の方に付けている、導通確...
その電流の影響があるのか、基板のSWをONにした最初のタイミ...
リセットボタンを押すと、正常に表示されるんだけどね。~
なので、電源は基板と同じ方から取るようにしました。~
で、FT232RLのTXD(送信側)をAVRのRXD(受信側)に、FT232RLのRX...
#ref(UsbTestp.png,left,nowrap,USBシリアル通信サンプル)
もうブレッドボードがいっぱいいっぱい……。~
というわけで、後で追加でブレッドボードを購入します。~
↓
#ref(UsbTestp2.png,left,nowrap,USBシリアル通信サンプル)
ちょっとすっきり!~
** ソースコード [#y4a51868]
まず、メインで参照する各種ライブラリ。~
&ref(util.h,left,nowrap,ユーティリティヘッダ);&ref(util.c...
#include <avr/io.h>
#include "LcdLib.h"
#define USART_BPS 25 // ボーレート設定値
void Usart_init( void )
{
UBRR0 = USART_BPS; // ボーレート分周値レジスタ(1MHz駆...
UCSR0B = 0b00011000; // 受信許可bitと送信許可bitを立てる
UCSR0C = 0b00000110; // 非同期/パリティ禁止/停止1bit/デ...
}
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;
}
*** 基本動作 [#z4886d61]
まずは初期化。~
UBRRレジスタに、ボーレートを設定している。~
このボーレートを設定するレジスタは、実はUBRRHとUBRRLに分...
UCSRBとUCSRCに設定してあるのは、ソース内コメント通り。~
受信や送信完了での割り込みはしていません。~
パリティは調べたらなんとなくわかるけど、停止bitとかとあわ...
そのうち余力があれば掘り下げたいけど……。~
受信関数、送信関数は簡単ですね。~
それぞれ、なんか来たよフラグと、送る入れ物が空いてるよフ...
メインは、初期化後、受け取ってLCDに表示してPCに戻すという...
あぁ、ちなみに、動かすときは、まずAVRの電源を入れて、PCに...
最初、電源を入れずに[[TeraTerm:http://sourceforge.jp/proj...
#ref(ttsetting.png,left,nowrap,TeraTerm設定)
というわけで、実際に動かしてみたのはこんな感じ。~
[[TeraTerm:http://sourceforge.jp/projects/ttssh2/]]上でキ...
#u2b(8l0ro9lwqT0,w=480,h=385)
ボーレートを上げるには、ベースクロックを上げたり、倍速モ...
誤差とかも色々考慮しないとならないので、大変そうだ。~
クロックを上げると、今のLCDライブラリだと、動作不安定だし...
この辺も今後の課題。~
** おまけ [#f65768c2]
UART部分をライブラリ化して、LCDに受信したデータの16進コー...
&ref(UsartLib.h,left,nowrap,USARTライブラリヘッダ);&ref(U...
#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;
}
%%sprintfを使ってるけど、これでプログラムサイズが一気に3k...
%%ATmega168Pだったら、Flashは16kbあるので、まだまだ余裕(...
ごめん、そんなに増えないわ、増えるのは1kbくらいかも。~
hexファイルサイズが結構増えるけど、実際に書き込まれるサイ...
ページ名: