通信 USART

AVR2313

AVRでシリアルのUSART通信。USBとRS232Cポートの両方で通信してみる。


USB変換チップを使うと、従来のRS232Cと同じ方法でUSB通信も可能になります。

シリアル通信

AVRのUSARTでシリアル通信。RS232Cポートで、レベル変換のIC MAX232系を使った通信と
USB変換チップFT232RLを使ったUSBの通信。

USBでは従来のRS232Cの通信へ変換するだけなので、どちらもAVRのTxD、RxDを使う通信で、RS232CポートでもUSBでも同じ通信プログラム内容です。


  • USBでは 変換チップFT232RL
    ft232rl
  • 従来のRS232Cの通信では ADM3202 のICを使用(max232の互換チップ)
    adm3202

 

の通信を書きました。

 

受ける側のマイコンプログラムは この2つなら、どっちでもプログラム内容は同じです。

 

USB変換チップFT232RL

秋月電子のUSB変換チップFT232RLを使用しました。

ft232rl


USBの機能を持たずUASRTの機能しかないATtiny2313のようなチップの場合、簡単にシリアル通信機能ができます。

 

電源をUSBポートから供給と、外部から供給をジャンパピンで切り替えになってます。
USB接続は、通常のUSB同様、PnP(プラグアンドプレイ)で接続するとドライバ要求が自動的に現れ、アトメルサイトからダウンロードしたドライバをしていると自動的にインストールされる。

 

電源をUSBポートから電源供給のジャンパ設定にしておくと、単独でUSBコネクタつないだだけでもPnPできるようです。
設定が完了すると 新たなCOMポートができます。

 

RS232CポートがあるPCだと 従来 COMポート1 があり、これで従来のケーブルで通信です。MAX232系を使った通信ではこのポートを使用。
FT232RLのPnPで設定すると COMポート2~ ができるので、USBではこのポートを使用します。

 

FT232RL

他にもIO出力使用にもできる機能もあるようですが、通信についての設定。

 

ジャンパ設定

2つのジャンパピン jp1,jp2があります。

外部から電源供給の設定にしました。

  1. JP1の3本は  2-3をつなぐ
  2. JP2の2本は  オープンでつながない(片足入れておくといい)
    (下図)
USB接続ドライバ
 

FTDIで CDM 2.04.16 をダウンロード( 10/1/'09)

 

プラグを差し込んで、ドライバ要求が出たら 解凍したフォルダCDM 2.04.16 WHQL Certifiedを指定すると設定完了します。
付属の取説にもありますが、1度完了すると、ドライバ要求が再度でるので2回すると完了。

 

WinXPでは

 コントロールパネル - システム - ハードウエア - デバイスマネージャー

で確認できます

 

でこんなドライバ項目が加わりました。(COM3)
これでCOM3ができました(PCによりCOMxの数字は異なる)

接続

ケーブルは通常のUSBコネクタより機器への差し込み口が小さいポートのものが必要です。

通信

TxD、RxD をクロスにつなぐとできました。
FT232RL  ATtiny2313

TxD  -  RxD

RxD  -  TxD

 

回路図

AVR-FT232接続回路図

 

通信プログラムは RS232CのMAX232系チップを使った通信と同じです。

 

サンプルプログラム

送信したデータをオウム替えしに受信するプログラム。

 

usrt


/************************************************

RS232C

文字列、バイト 転送関数

char = unsigned char でバイト転送も可
(gccはコンパイラオプションで
 char: signed or unsigned を切り替えの様子)
**************************************************/

#include	


//1文字送信
void rs_putc (char c)
{
    loop_until_bit_is_set(UCSRA, UDRE); //UDREビットが1になるまで待つ
    UDR = c;
}

//1文字受信
char rs_getc(void)
{
    while(!(UCSRA & _BV(RXC))) ;
    return UDR;
}

// テキスト送信 (nullターミネーション 改行コード)
void rs_puts (char *st)
{
  while (*st) {
    rs_putc (*st);
    if (*(st++) == '\n') rs_putc('\r');
  }
}

// テキスト受信 (nullターミネーション 改行コード)
//	オウム返し返信あり
short rs_gets (char *s)
{
  short i = 0;
  char c;
  while (1) {
    c = rs_getc ();
    if ((c == '\n') || (c == '\r')) {
      s[i] = '\0'; if (i != 0) i++;
      rs_putc ('\n');
      break;
   } else if ((i > 0) && (c == '\b')) {
      rs_puts ("\b \b");
      i--;
    } else if ( (c >= ' ') && (c <= '~') ) {
      s[i++] = (char)c;
     rs_putc (c);
    } else rs_putc ('\a');
  }
  return i;
}



int main(void)
{

	char rs_ary[20];
	

	UCSRB = _BV(TXEN)|_BV(RXEN); /* 送受信許可 */

	UCSRC = 0b00000110;
     					// パリなし
     					//  ストップビット 1ビット
					    //  データビット 8ビット 

    UBRRH = 0;
    UBRRL = 207;    /* 4MHzにて 1200bps 設定 */
//    UBRRL = 25;    /* 4MHzにて 9600bps 設定 */


	
	while(1){

			rs_gets(rs_ary);	//文字列受信 → rs_ary[20]
			rs_puts(rs_ary);	//rs_ary[20] → 文字列送信


	}
}

       


ハイパーターミナルで abcdとか入力して送ると オウム返しに表示する。
つないでこれが機能すると成功 とりあえず通信テストといったところです。

●ボーレート設定

ボーレートは 1200 にしています。ハイパーターミナルでも同じにします。
ハイパーターミナルなどの設定は H8の パソコンと通信 のところを参照のこと

 

ボーレート設定はは使用するクロックによって設定数値がかわります。

2313では マニュアル p88に 周波数別のボーレート用の設定数値、計算方法も あります。

 

これは4MHz bpst1200での設定数値

* 内部発信を使う場合、周波数に誤差がでて、通信では誤差は4%ぐらいまでのようなので 通信エラーにならぬよう転送速度は遅めにするのがいいでしょう。

 

MAX232C

RS232C通信のチップを使って従来のシリアル9Pinケーブルで通信
* RS232Cケーブルはストレートタイプを使用

 

H8ボードのように通信チップがついてないので付ける必要があります。

 

ADM2302のRS232C通信回路

5Vのマイコンとつなぐには信号電圧変換する必要があるので、これを担当するのがMAX232の専用ICです、互換チップもあってADM2302を使用。

 

MAX232C接続回路

コンデンサをいっぱい周りに付ける必要があるのがわずらわしいです。

マイコンのpin 通信はTXDとRXDの2pinだけ使用です。


 

スポンサーリンク
  • facebook
  • twtter
  • google+
  • hatena