AVR でRS-232C通信

画像

AVRとPCでシリアル通信できるかを確認します。

1. 用意するもの

ATtiny2313

MAX232N

MAX232N (秋月) は TTL レベルの信号を RS-232C レベルに変換してPCと通信するために必要。変換ICとしては秋月で一番安いので購入。ただし、電源電圧は5Vのみとのこと。また、普通の変換ICは外付けコンデンサが 0.1μであるが、これは1μが必要。

変換は2チャンネルあるので、入力11pin ->出力14pin および 入力13pin ->出力12pin を使用。

2. 接続

http://akiba.geocities.jp/atmel_avr_atros/20071014.html を参照しました。

MAX232Nまわりは付属のデータシートを参照しましたが、これがくせものです。

付属のデータシートでは Pin2(Vs+)はCを通して接地になっています。しかし、他所にあるデータシートは大方が Vs+ の C が Vcc に接続されています。どちらに接続してもAVR->PCへの送信はできていますが、文字化けの発生で悩んでいたため、このどちらも試してみました。結果は接地したほうが文字化けは減少します。ので、秋月でもらったシートの方が正しいようですが、いまひとつ合点がいきません。

その後 - ADM3202AN を秋月にて購入しました。このICは 3.3V 動作で、外付けC は 0.1μです。データシートでは 2pin (V+) の C はVccに接続するようになっていたので、そのようにして接続しました。

結果 - 文字化けは発生しなくなりました(9600bps)。MAX232N はちょっと難がありだったのでこちらをつかっていこうと思います。

3. プログラム

これも http://akiba.geocities.jp/atmel_avr_atros/20071014.html を参照しました。

このプログラムで使われているレジスタ設定の方法(下記)は 2313のデータシートに記載がありました。

UBRRH = (unsigned char)(baud>>8); // ボーレート上位

UBRRL = (unsigned char)baud; // ボーレート下位

UCSRB = (1<

UCSRC = (1<

PC側の受信にはTera Termを使用。

#include

#define FOSC 8000000 // 8MHz

#define BAUD 9600

#define MYUBRR FOSC/16/BAUD-1 // UART分周率

void sio_init(unsigned int baud){

UBRRH = (unsigned char)(baud>>8); // ボーレート上位

UBRRL = (unsigned char)baud; // ボーレート下位

UCSRB = (1<

UCSRC = (1<

}

void sio_puts(char *buf)

{

while(*buf){

while ( !(UCSRA & (1<

UDR = *buf++;

}

}

int main(void){

sio_init(MYUBRR); // USART設定

for(;;){

sio_puts("ATtiny2313 ");

}

}

4. 結果

フューズビットとボーレートの関係がよくわからず、かつ、早いスピードでは文字化けが発生するため、うまく動くまで難儀しました。

//成功パターン

//BAUD 1200

// CKDIV8 0

// CKOUT 0

// CK clock 8MHz

//失敗パターン

//BAUD 9600 -> 文字化け混ざる

// CKDIV8 0

// CKOUT 0

// CK clock 8MHz

とりあえず 9600bps にて

1. AVR ->MAX232 ->PC での文字列受信OK(文字化けあり)

2. AVR ->MAX232 ->XPORT <-LAN <-TELNET (文字化けさらにあり)

//XPORTにRS-232C接続(中継3線ケーブル使用)し、PCからEther経由でXPORTのIP:10001にtelnet ログイン。

//このプログラムが出力する文字列をXPORTからtelnet経由での受信に成功。ただし、AVR直結で受信するよりも文字化けはさらに多い。