前回のLCD libraryと同じ「AVR-GCC libraries」のページには、他にも「I2C Master Interface」と「UART library」があります。

今回は、この「UART library」を使ってPCと接続してみました。

ソフト+ハード
例によってEclipseでプロジェクトを作り、(テストコード「test_uart.c]
を含めて)ソースファイルをライブラリから持ってきます。

設定が必要なのは、ボーレイトの設定をしているここだけ。
#define UART_BAUD_RATE 9600

(注:後でここらへんが問題になる。)

他にもクロックの設定部分もあるのですが、、、
#ifndef F_CPU
#define F_CPU 4000000UL
#endif

これは、Eclipseでプロジェクトを作成した時に入力した1Mhzの設定が、自動的にF_CPUに設定されるので、特になにもしなくてもOKです。

ハードの方は、以前、La FoneraにDD-WRTをインストールするときに手に入れた、ストロベリー・リナックス製のUSB<->シリアルアダプタFT232RXがあったので、これとAVRのシリアルピン(RX,TX)をクロス配線でつないだだけの、(またしても)大変簡単な物です。

実行してみる
今までと同じようにコンパイル&ダウンロードして、kermitでシリアルポート(9600bps)を見てみると、、、、

文字化けしている、、、

リセットするとその度に送られてくるので、一応、プログラムは動いているようです。

では、ボーレートが合っていないのか?と思ってkermitで変えてみても相変わらず、文字化けしています。

いろいろと試してみたのですが、ふと思って、ライブラリの設定の9600bpsを1200bpsに変更して、コンパイル&ダウンロード、そしてkermitの設定を1200bpsに合わせてみると、今度はちゃんと文字が表示されました!
kermit

(注:これは、後でやった9600bpsのもの。)

ヒューズの設定
どうも、やはり内臓RC発信器の精度では、9600bpsでは厳しいようです。やはり外部クロックをつけた方がいいのかなぁ、、、

Attiny2313のデーターシートのクロックの部分をよく読んでみると、クロックはディフォールトだと、8Mhzの内臓RC発信器を「1/8分周」して1Mhzのクロックにしているそうです。これを見て思ったのですが、この「1/8分周」の設定を取ってしまえば、9600bpsでもうまく行かないだろうか?

この設定を変えるには、Fuse Low ByteにあるCKDIV8ビットを1(ヒューズは1で無効、0で有効)にしてしまえば良いようです。

で、このヒューズを設定する方法ですが、これはCPUからプログラムで変える物ではなく、プログラムをAVRDudeでダウンロードするときに、一緒に設定する物で、AVRDudeのオプションで設定できます。(AVR-libcにもヒューズ設定のサポートがあるようですが、これはEclipseからは使えない様子。)

AVR-Eclipseには、プロジェクトのAVRDudeプロパティに、このヒューズの専用エディタが付いています。
prop

このプロパティページのDirect Hex Value...の右横にエディタを開くボタンがあります。
button

エディタを開くと、設定できる項目の一覧が表示されるので、その中からCKDIV8をNOに設定します。
fuse-editer


これで、設定はOK。次にプログラムをダウンロードした時にヒューズも設定されます。(あっ、でも、プロジェクトのプロパティから、クロックを8Mhzに設定しなおすのもお忘れなく。)


ヒューズを設定して、kermitで見てみると、9600bpsでも使えるようになりました。

と言っても、今回は簡単にUART通信を試してみるためにこんなことをしましたが、もっと本格的に使うときには外付けのクリスタル等を用意した方がいいですね。(その設定も今回同様、ヒューズを設定すれば使えます。)