2007. 2. 27. 18:10

USART는 외부 디바이스와 직렬로 인터페이스를 통해 데이터를 송수신할 수 있게 해준다.

외부 디바이스는 다른 마이컴이 될 수 있고 PC도 될 수 있다. PC의 COM포트와 연결하기 위해서는 9핀 케이블과 데이터 전송의 레벨을 조절해 주는 전용 통신 칩이 추가로 필요하다.

범용 동기 수신 송신기(USART)로 데이터를 수신하거나 송신하는 방법에 대해 알아보자.

USART를 제어하기 위한 레지스터로는
USART를 통해 보낼 데이터나 받은 데이터를 두는 - USART I/O 데이터 레지스터(UDRn)  

USART 상태를 알 수 있는 - USART 제어 상태 레지스터(UCSRnA, UCSRnB, UCSRnC)
그리고 데이터 통신의 속도를 결정하는보레이트(Baud Rate)를 설정하는
- USART 보레이트 레지스터(UBRRnL, UBRRnH)가 있다.

통신 속도를 결정해 주는 보레이트가 얼마만큼 가능한지는 마이컴에 부착될 수 있는 크리스탈이나 오실레이터의 속도에 의해 좌우된다. 보레이트 설정하는 방법으로 사용 크리스탈의 주파수를 계산식에 넣어서 나온 값을 UBRR에 넣을 수도 있지만, 데이터 시트에 예로 나와있는 표를 참조할 수도 있다.

USART로 데이터 송수신을 위한 순서는
① UCSR에 송수신 인터럽트 및 방식을 설정하고,
② USART 보레이트 레지스터(UBRRnL, UBRRnH)를 설정하여 데이터 송수신 통신 속도를 선택한다.
③ 그리고, 전역 인터럽트 플래그를 '셋'하여 인터럽트를 활성한 후,
④ 그에 따른 USART 송수신 인터럽트 처리 루틴을 구성한다.


관련 자료
1172567451_lecture2.zip   테스트용 프로그램

 

아래의 예제 소스를 테스트 할 수 있는 PC용 시리얼통신 프로그램입니다.

프로그램 예제
시리얼 통신(RS232, 38400bps)을 통해서 들어오는 입력을 분석하여, 업카운트일 때, LED를 1씩 증가하며 출력하고 다운카운트일 때는 1씩 감소시키면서 출력하는 프로그램

#include <iom128.h>
#include <ina90.h>
#include <sig-avr.h>
#include <interrupt.h>

#define   SYSTEM_CLOCK  16000000   // CLOCK (X-tal frequency)

typedef unsigned char BYTE;

volatile int Count = 0;
volatile BYTE RS_Char=0x00;

SIGNAL(SIG_UART0_RECV)              // USART 수신용 인터럽트 함수
{
       RS_Char=inp(UDR0);
}

void UART_Init(unsigned long BaudRate)
{                                                    
       outp(0x00, UCSR0A);              // Not Double mode, Not multi_communication 
       outp(0x98, UCSR0B);              // 0b 1001 1000 RXCIE,TXCIE,UDRIE,RxEN,TxEN,xxx
       outp(0x06, UCSR0C);              // Setting BaudRate
       outp(0x00, UBRR0H);
       outp((SYSTEM_CLOCK/BaudRate/16 - 1),UBRR0L);
}

void TxData(BYTE data)
{
       while (!(inp(UCSR0A) & (1<<UDRE)));
       outp(data, UDR0);
}

void Port_Init(void)
{                                                   
       outp(0xFF, DDRA);                 //Port_A setting up output
}

int main(void)
{                                                  
       outp(0x00, MCUCR);               // External Memory Disable 
       Port_Init();
       UART_Init(38400);
       sei();

       while(1)
       {
              if (RS_Char == 0x01) Count++;

              else if (RS_Char == 0x02) Count--;

              if (Count > 255) Count=0;

              else if (Count < 0) Count=255;

              outp(Count, PORTA);
        }

        return 0;
}
Posted by Paul Hwang