PCとの通信実験
 AVRにはUSARTの機能があります。これを使うとPCと通信ができるはずです。MCで計測したデータをPCに保存したり、処理したりできるようになります。
電圧の測定などがPCに取り込めると新しい使い方ができると思います。

手始めに、次のようものを考えました。
MCの表示装置には液晶表示器を使います。PCからの受信データはここに表示して、確認できるようにします。
MCが作り出すデータとして、時計機能から時刻データを用意します。PCから送信命令があったときに送信します。
MCはポートに余裕がある手持ちのmega8を使います。90S2313でも十分ですが、TQFPのmega8に挑戦してみようと思います。

クロックは、大事をとって水晶を使うことにしました。以前に2313でUSBに接続したとき(http://www.cesko.host.sk/IgorPlugUSB/IgorPlug-USB%20(AVR)_eng.htm)、 セラロックではクロックがふらついて極めて不安定になり、ときどきしか通信できなかったものが水晶を使うと安定した経験からです。共立電子で特売100円の 水晶発振器(KYORI KCO-3028と書かれています)16.000MHzのものを使いました。このためにヒューズビットの書き換えが必要です。
時計機能はタイマー割込でカウントアップします。時計として使うわけではないので精度は追求していませんし、時刻あわせ機能も付けません。
左が
USBコンバータ

中央が
この通信実験回路

右が
シリアル書き込み機

液晶表示器は表示部が65mm×15mmの小型のものを使いました。TOSHIBA TLC-2491のラベルがあります。日本橋のデジットで300円で出ていたものです。以前に購入した 600円のものとよく似ていたので(リード線がついていないだけ?)、「同じですか?」と聞きましたが、同じように使えます、1行か2行かは確認していませんと のことで、端子のデータもありませんでした。ICは違いますが、あまりにも似ているのでそのまま使ったところ全く同様に使えました。16文字×2行のものです。 この表示器はコントラスト端子をGNDにつなぐとちょうど良くなりますので、分圧の可変抵抗は入れていません。

液晶表示のプログラムは別項「 周波数カウンタ(の様なもの)」で紹介した楠 昌浩さんのものを利用させてもらっています。表示器のレディ応答を待たずに、ディレイ で処理しているのでR/W端子はGNDに接続しています。mega8はポートが多いのですが、8ビットあるPBとPDがクロックとUSARTに取られて、8ビットのポートが 取れません。PBとPCに分けて液晶と繋ぎましたが、未熟なためプログラムの修正に苦労しました。
暗中模索で進めるものですから、時計機能が動いていることの確認にLEDを点滅させています。

PCとの接続はCOMポートを使うわけですが、AVRの書き込み用にシリアルポートCOM1を常時使っています。少し書いては動作させてプログラムを進める私には、 シリアルポートの差し替えは大変な労力です。そこで、以前に作った FT232BMを使ったUSB-シリアルコンバータを使うことにしました。これは、「USB接続プログラ ムライタの試作」で紹介したnagnagさんの回路、またはFTDIのアプリケーションノート FT232BM Designers Guide Revision 2.0 (http://www.ftdichip.com/Documents/dg232v20.pdf)に書かれているものです。私のものはCOM4に接続されます。TXDとRXDを取り出してクロスで接続しています。 RTS#とCTS#は直接繋いであります。これで、プログラムを書くときと、ハイパーターミナルを使うときに接続を変えなくてすみます。

USARTの使い方はデータシートのみが頼りです。何度も読み返しました(もちろん日本語です)。その中から次の部分を見つけだして強引に書いて見ました。
void USART_Init(unsigned int baud)
{
	 UBRRH = (unsigned char)(baud>>8);	 /* ボーレート設定(上位バイト) */
	 UBRRL = (unsigned char)baud;	 /* ボーレート設定(下位バイト) */
	 UCSRB = (1<<RXEN)|(1<<TXEN);	 /* 送受信許可*/
	 UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0):	 /* フレーム形式設定(8ビット,2ストップビット) */
}
注: このコード例はデバイス定義ファイルがインクルードされることが前提です。
初期化コードと併せられます。

void USART_Transmit(unsigned char data)
{
	 while ( !(UCSRA & (1<<UDRE)) );	 /* 送信バッファ空き待機*/
	 UDR = data;	 /* データ送信(送信開始) */
}

unsigned char USART_Receive(void)
{
	 while ( !(UCSRA & (1<<RXC)) );	 /* 受信完了待機*/
	 return UDR;	 	 /* 受信データ取得*/
}
注: このコード例はデバイス定義ファイルがインクルードされることが前提です。
PCから送られてきた文字を液晶の1行目に表示し、同時にPCに送り返しています。PCから「?」マークが送られてきたときは、空白に続けて時分秒の時刻を 送り返すことにしています。

mega8 TQFPの半田付け:このパッケージはピッチが0.8mmです。USBのFTDI FT232BMも同じですが半田付けは困難です。1つの方法として端子にリード線を付けてみました。 0.4mmの錫メッキ線を前もって半田付けしました。そのままではリードに半田付けするときに外れてしまいますから、厚紙(名刺を切りました)で挟んで接着剤で 止めました。不細工な姿ですが一応初期の目的は達しています。接着剤の絶縁性も何とか無事を得ています。この状態が上の写真です。
その後、QFP専用の鏝先を作りましたので、直接の半田付けに変更しました。MC周りがすっきりしました。これを使えば何とかなりそうです。 右に(恥ずかしながら)半田のアップを置きます。
   
MCの下にある白いシートはテフロンです。耐熱性があるために使いました。また、半田屑が散って端子をショートしないようにMCを少し浮かせてみました。

これでハイパーターミナルを起動して、PCの文字キーを押すと、MCのLCDにその文字が表示され、同時に送り返された文字が画面に表示されます。PCから「?」 マークを送ると時刻の文字列をモニターに返してきます。
一応、初期の目的は達しました。


同時には写真が撮れないのでずれています

何とか動きましたが、まだUSARTの使い方がよく分かっていません。ここをはっきりさせることと、電圧測定の機能を作って、PCのエクセルで処理できるように 頑張ろうと思います。エクセルに取り込むソフトウエアは公開していただいているようなので何とかなると思うのですが。
回路図  プログラム  lcd.c   lcd.h(ヘッダファイルは拡張子を .h に戻してください。)

05.04.02 追記 クロックを変えてみました
一つはセラミック発振子の10MHzで19200bpsの通信、もう一つは内蔵発振器デフォルトの1MHzで9600bpsです。結果は、ともに通信できました。 以外と内蔵RCでも実用になるのかもしれません。
ただ、mega8のクロック設定は謎を解いているようで、データシートのこっちをうろうろ、あっちをうろうろ。もう少しわかりやすく書いてもらえないものだろうか と思います。条件をすべて並べると収集がつかなくなりますので、よく使いそうな組み合わせだけ書き出してみました。
内蔵発振子で1MHzのときは ヒューズの下位バイトが 1110 0001 (デフォルト)、2MHzでは 1110 0010、 
4MHzでは 1110 0011、8MHzでは1110 0100です。
クリスタルでは、3〜8MHzの時は下位バイトは 1111 1111 (低速立ち上がり電源)で、
セラミックでは、3〜8MHzの時は下位バイトは 1100 1111 (低速立ち上がり電源)です。
クリスタルやセラミックで8MHzを超えるとき(16MHzまで)は、上記の設定の上に 上位ヒューズビットを 1101 1001 から
1100 1001 に変更します。 CKOPT(上位バイトのbit4)を0にするわけです。
もし、これらの値を使われるときはデータシートでもう一度確認してください。下位バイトは大丈夫ですが、上位バイトを間違うとISPでは訂正できなくなることがあり ますから。

なお、クロックを変えるとボーレイトの設定も変えねばなりません。今回は次のように変更しました。
クロック10MHzの時、UBRRL = 64; として、その上に UCSRA|=_BV(U2X); //倍速 を付け加えました。
クロック1MHzの時は、UBRRL = 12; として、その上に UCSRA|=_BV(U2X); //倍速 を付け加えました。
データシート(日本語)のp103〜p104を調べて誤差が許容範囲にはいる値を探しました。

追加事項はこれだけですが、行数には現れない時間がかかりました。




はじめのページへもどる


inserted by FC2 system