最終更新時間:2008年04月12日 16時09分30秒
[公開:any]
[電子工作/AVR]
[電子工作/実験]
[AVR,ATmega168,FT232RL]
FT232RLを使ったUSB−シリアル変換モジュールを秋月電子で購入してきたので、ワンチップマイコンのAVRのUSART機能と接続してPCへのデータ取り込み実験をしてみました。
USB-シリアル変換モジュールは、24ピンのDIPサイズでかなりコンパクトです。FT232RLは、通信速度が300〜460kbpsに対応しているので、かなり高速にデータのやり取りが可能です。
USBから給電して動作させることも出来ますが、今回はブレットボードから電源を供給して使用してみます。
接続するPCには、FT232RLの供給メーカーであるFTDI社のサイトから必要なドライバーをダウンロードしてインストールします。Windowsからは、USB接続が仮想的なシリアルポートとして認識されて、利用できるようになります。
今回の実験回路です。
AVRはATmega168を使用します。AVRのクロック源は、速度的には、内部オシレータでも十分ですが、高速なシリアル通信の場合は、タイミングがシビアになって、文字化け等の影響がでる可能性もあります。今回は、外部のクリスタルオシレータを使用しました。
FT232RLユニットとの接続は、RXDとTXDの2本だけとなります。・・・が、しかし、今回は「AVRを使ったバッテリー放電器の製作」で作った放電器に内蔵することを想定してるので実際は、AVRからのデータの送信のみを実験します。(つまり、PCからの送信データを受信することはない)
ブレットボードで実験中。送信データは、1秒毎に経過秒と4つの固定ダミーデータとなっています。
PC側の受信は、Tera Termを使っていましたが、どーせなら・・ということで専用のアプリケーションを久しぶりにdelphiを使って作成してみました。
COMポートの設定をして、STARTボタンでシリアルポートからデータを取り込むことが出来ます。
今回は、CSV形式のダミーデータを取り込んでいます。取り込みが終わったらファイル保存して、ExcelやOpenOfficeのscalcをつかってグラフ化することができます。
参考までに、今回AVRに書き込んだプログラムです。
AVRStuido4とWinAVR-20071221で作成してあります。
USARTへの送信は、USARTへの1文字送出をファイルディスクプリタとして宣言すれば、fprintfで文字列が送出できるので便利です。
1 |
#include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include <stdio.h> #define FOSC 12000000 #define BAUD 9600 #define MYUBRR FOSC/16/BAUD-1 unsigned int hm; unsigned int sec; char buf[10]; FILE *fp; ISR(TIMER1_COMPA_vect) { hm++; if(hm == 5) { sec++; fprintf(fp, "%d,1.23,1.21,1.12,1.19\n", sec); // elapsed time and dummy data hm = 0; } if(sec > 65534) sec = 0; } void USART_Init(unsigned int baud) { UBRR0 = baud; UCSR0B = (1<<RXEN0)|(1<<TXEN0); UCSR0C = (1<<USBS0)|(3<<UCSZ00); // 8 bit,2 stop bit } void USART_putchar(unsigned char data) { loop_until_bit_is_set(UCSR0A, UDRE0); UDR0 = data; } void USART_putstr(char *s) { while(*s != '\0') { USART_putchar(*s); s++; } } unsigned char USART_Receive(void) { loop_until_bit_is_set(UCSR0A, RXC0); return UDR0; } int main() { TCCR1B = 0b01001011; // Timer1 prescaler 1/64 TIMSK1 = _BV(OCIE1A); // Timer1 compare match A interrupt OCR1A = 37500; // 12MHz / 64 = 187500. 200ms = 37500. USART_Init(MYUBRR); fp = fdevopen(USART_putchar, NULL); sei(); while(1) { } } |