[AVR] 시리얼 통신

마이크로 컨트롤러의 동작을 확인하는 가장 쉬운 방법은 LED를 On/Off시키는 것인데 이 방법보다 좀더 유연하고, Input까지 받을 수 있는 방법이 바로 시리얼 통신이다. ATmega8A에서는 UART(Universal Asynchronous Receiver/Transmitter)를 이용해 RS232 통신이 가능하다.

“PC — USB-to-Serial cable — Null Modem cable — MAX232 회로 — ATmega8a” 순으로 연결

1. USB-to-Serial 케이블

요즘 PC에는 Serial 포트가 없기 때문에 USB-to-Serial 케이블이 필요하다.

http://www.aten.co.kr/products/productItem.php?model_no=UC232A

(참고, 위의 케이블을 Mac OS X에서 사용한다면 아래 링크를 참고해 설치해야한다.

http://rolande.wordpress.com/2012/10/25/getting-the-aten-usb-serial-adapter-working-with-mac-osx-lion/)

2. Null Modem 케이블

모뎀 없이 DTE(Data Terminal Equipment)에 바로 연결한다고 Null Modem 케이블이라고 불리는데, 아래 배선도에서 2, 3, 5번 만 연결되어 있으면 된다.

<출처 : http://www.camiresearch.com/Data_Com_Basics/New_Cable_pdfs/3.pdf>

3. MAX232 회로

RS232의 신호레벨은 -15V ~ 15V 사이이기 때문에 5V를 사용하는 회로에 바로 연결하면 안된다. 이러한 신호레벨을 0 ~ 5V로 변환해주는 회로가 필요하다.

<출처 : http://sodoityourself.com/max232-serial-level-converter/>

여기서 주의할 점은 Null modem cable을 사용했다면 RX와 TX가 서로 바뀌어서 연결이 되었기 때문에 위에 회로도에서 PC DB9 Female의 2번, 3번에 연결된 선을 바꿔줘야한다. 그리고 커넥터는 DB9 Male을 사용한다.

끝으로 Rx와 Tx는 ATmega8A의 2번(RXD), 3번(TXD)에 연결하면 된다.

4. 터미널 설정

<WindowsXP>

하이퍼터미널은 Windows XP에서 기본으로 제공해주는 터미널이다.

시작 > 보조프로그램 > 통신 > 하이퍼터미널

연결이름 입력 > 연결에 사용할 모뎀 (USB-to-Serial의 포트번호)

비트/초 19200 선택, 나머지는 기본값 > 확인

<Mac OS X>

ZTerm 설치  http://www.dalverson.com/zterm/

 

5. 시리얼 통신 프로그램 작성

간단한 echo 프로그램이다. 사용자가 PC에서 입력한 글자를 받아서 그대로 출력한다. AVR Studio에서 빌드해준다.

(Baud rate는 19200 bps)

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

#define FOSC 16000000// Clock Speed 
#define BAUD 19200 
#define MYUBRR FOSC/16/BAUD-1 

void USART_Transmit( unsigned char data );
void USART_Init( unsigned int ubrr);
unsigned char USART_Receive( void );

int main( void ) 
{ 
    unsigned char c; 

    USART_Init ( MYUBRR ); 
    DDRC = 0x0F; 

    while(1) { 
        c = USART_Receive(); 
        USART_Transmit(c); 
    } 
    return 0; 
} 

unsigned char USART_Receive( void )
{ 
    /* Wait for data to be received */ 
    while ( !(UCSRA & (1<<RXC)) ) 
    ; 
    /* Get and return received data from buffer */ 
    return UDR; 
} 

void USART_Transmit( unsigned char data )
{ 
    /* Wait for empty transmit buffer */ 
    while ( !( UCSRA & (1<<UDRE)) ) 
    ; 
    /* Put data into buffer, sends the data */ 
    UDR = data; 
} 

void USART_Init( unsigned int ubrr)
{ 
    /* Set baud rate */ 
    UBRRH = (unsigned char)(ubrr>>8); 
    UBRRL = (unsigned char)ubrr;
    /* Enable receiver and transmitter */ 
    UCSRB = (1<<RXEN)|(1<<TXEN); 
    /* Set frame format: 8data, 2stop bit */ 
    UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0); 
}

5. 동작확인

키보드로 입력한것이 터미널에 출력되면 된다.

 

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중