2012年9月7日金曜日

[AVR]AVRを始める(2) - USART通信

少し間が開いて、AVRについて。

I/Oボードという事で、AVRとPC間で通信をさせたいです。
STK600にはUSBポートとRS-232Cが載っていますので、どちらかを使えばPCとの通信のテストが出来ると思っていました。
以下のコードでひたすらデータを吐き出し続けさせ、PCで観測させようと考えましたが全くできないので、諦めました...
STK600での方法をご存知の方が居られたら、是非ご教示下さい。


#define F_CPU 1000000UL // Clock Speed
#define BAUD 9600
#define MYUBRR ((F_CPU/16/BAUD)-1) //Asynchronous Normal mode

#include <avr/io.h>
#include <util/delay.h>

int main(void){
  unsigned char data = 0x01;
 
  UBRR0H = (unsigned char)(MYUBRR >> 8);
  UBRR0L = (unsigned char)MYUBRR;
  
  UCSR0B = (1 << RXEN0)|(1 << TXEN0);
  /* Stop bit:1, Parity: None, Data bits:8*/
  UCSR0C = (1 << UCSZ01)|(1 << UCSZ00);
 
  while(1){
    while(!(UCSR0A & (1 << UDRE0))){}
    //put data into buffer, send the data
    UDR0 = data;
    delay_ms(50);
    data = data + 0x01;
  }
}

仕方が無いので、一緒に買ったATMEGA328Pを使ってテストを行います。
STK600からISPのピンを引っ張ってフレッドボード上に組んだチップにプログラムします。
Atmel Studio上からプログラムする方法が判らなかった為、Avrdudeを用いて書き込みました。

AVRからRS-232Cを用いて通信する為のトランシーバにSP3232ECPを使います。
回路図は以下の通り。ISPを用いる事で、チップが基盤に実装されていてもプログラムする事が出来ます。(今回はピンの重複がないので、実際どうなるか分かりませんが...)
今回は電源は、ISPのピンから頂いています。
トランシーバIC周りのキャパシタや接地は省略しています。

上記のコードをプログラムし、PCのシリアルポートと通信させ受信を確認しました。

今日はここまで。
次は、送信とUSB変換について...

久しぶりにスパゲティコード

#回路図の作成にはBSch3を利用させて頂きました。