Embedded/AVR

prinf를 이용한 ATMEGA128 USART 통신

목사 2010. 5. 15. 11:46

//****************************************************************************************************//

//           <printf를 이용한 ATMEGA128 UART 제어 프로그램>
//
//    Compiler  : CodeVision
//    MCU : ATMEGA 128
//    Clock : 16MHz    
//
//****************************************************************************************************//
#include<mega128.h>  
#include<stdio.h>

//****************************************************************************************************//
//
//                                <USART Set>
//
//   <UCSRA0A>
//    송수진 동작을 제어하거나 송수신 상태를 저장하는 기능 수행
//
//       7          6           5          4         3           2        1           0
//    RXC0    TXC0    UDRE0    FE0    DOR0     UPE0   U2X0    MPCM0
//
//    <비트 설명>
//    RXC0
//    수신 버퍼에 읽혀지지 않은 수신 문자가 들어 있으면 1로 Set되고 MCU가 이를 읽어서
//    수신 버퍼가 비어있는 상태라면 0으로 클리어되는 Status Flag 이다.
//
//    TXC0
//    송신 시프트 레지스터에 있는 송신 데이터가 모두 송신되고 UDR0의 송신 버퍼에 아직
//    새로운 송신 데이터가 라이트되지 않은 상태이면 1로 Set되는 Status Flag이다.
//
//    UDRE0
//    UDR0의 송신버퍼가 비어있어서 새로운 송신 데이터를 받을 준비가 되어 있으면 1로
//    Set되는 Status Flag이다.
//
//    FE0
//    UDR0의 수신 버퍼에 현재 저장되어 있는 데이터를 수신하는 동안에 프레임 에러가 발생
//    하였음을 나태내는 Status Flag이다. 프레임 에러는 수신 문자의 첫번째 스톱 비트가
//    0으로  검출되면 발생한다.
//
//    DOR0
//    수신동작에서 오버런 에러가 발생하였음을 나타내는 Status Flag이다. 오러번 에러는
//    UDR0의 수신 버퍼에 현재 읽지 않은 수신 문자가 들어 있는 상태에서 수신 시프트
//    레지스터가 수신 완료되고 다시 그 다음 수신 데이터인 3번째 문자가 스타트 비트가
//    검출되면 발생한다.
//
//    UPE0
//    UDR0의 수신 버퍼에 현재 저장되어 있는 데이터를 수신하는 동안에 패리티 에러가
//    발생하였음을 나타내는 Status Flag이다. 패리티 에러는 UCSR0C 레지스터에서 
//    UPM01=1 로하여 패리티 비트를 사용하도록 설정한 경우에만 발생할 수 있다.
//
//    U2X0
//    비동기 모드에서만 유효한 것으로서 클럭의 분주비를 16에서 8로 절반만큼 낮추어
//    전송속도를 2배 높이는 기능을 수행한다.
//   
//    MPCM0
//    USART0 를 멀티 프로세서 통신 모드로 설정한다. 멀티 프로세서 통신 모드에서는 
//    어드레서 정보를 포함하지 않은 모든 수신 데이터는 수신부에 의하여 무시된다.
//    송신부는 이 비트에 의하여 영향을 받지 않는다.          
//
//    <UCSRA0B>
//    송수신 동작을 제어하거나, 전송 데이터를 9비트로 설정한 경우 전송 데이터의
//    9번째 비트값을 저장하는 기능을 수행한다.                                
//
//        7              6            5            4            3               2          1             0
//    RXCIE0    TXCIE0    UDRIE0    RXEN0    TXEN0     UCSZ02   RXB80    TXB80
//
//    <비트 설명>
//    RXCIE0
//    수신완료 인터럽트를 개별적으로 허용하는 비트이다.
//
//    TXCIE0
//    송신완료 인터럽트를 개별적으로 허용하는 비트이다.
//
//    UDRIE0
//    송신데이터터 레지스터 준비완료 인터럽트를 개별적으로 허용하는 비트이다.
//
//    RXEN0
//    USART0 포트의 수신부가 동작하도록 허용한다.
//    이는 TXD0 핀이 병렬 I/O포트가 아니라 직렬 데이터 송신 단자로 동작하도록 설정한다.
//
//    UCSZ02
//    UCSR0C 레지스터의 UCSZ01~0 비트와 함께 전송 문자의 데이터 비트수를 설정하는데 사용
//
//    RXB80
//    전송 문자가 9비트로 설정된 경우 수신된 문자의 9번째 비트(MSB)를 저장한다.
//    이는 UDR0 레지스터보다 먼저 읽혀야 한다.
//
//    TXB80
//    전송 문자가 9비트로 설정된 경우 송신할 문자의 9번째 비트(MSB)를 저장한다.
//    이는 UDR0 레지스터보다 먼저 라이트되어야 한다.                          
//
//    <UCSRA0C>
//    송수신 동작을 제어하거나, 전송 데이터를 9비트로 설정한 경우 전송 데이터의
//    9번째 비트값을 저장하는 기능을 수행한다.                                
//
//      7            6             5             4            3              2            1             0
//     -       UMSEL0    UPM01     UPM00    USBS0     UCSZ01   UCSZ00   UCPOL0
//
//    <비트 설명>
//    UMSEL0
//    1이면 USART0 포트를 동기 전송 모드로 설정하고, 0이면 비동기 전송 모드로 설정
//
//    UPM01  UPM00              <패리티 모드>
//      0           0        패리티 체크 기능을 사용하지 않음
//      0           1        (reserved)
//      1           0        짝수 패리티 방식을 사용
//      1           1        홀수 패리티 방식을 사용
//
//    USBS0
//    0이면 USART0 포트에서 데이터 포맷을 구성하는 스톱 비트를 1개로 설정하고,
//    1이면 스톱 비트를 2개로 설정한다.
//
//    UCSZ02    UCSZ01  UCSZ00  <전송 데이터 길이>
//      0                 0           0             5비트
//      0                 0           1             6비트
//      0                 1           0             7비트
//      0                 1           1             8비트
//      1                 0           0           (reserved)
//      1                 0           1           (reserved)
//      1                 1           0           (reserved)
//      1                 1           1             9비트
//
//    UCPOL0
//    동기 전송 모드의 슬레이브 동작에서만 유효한것

void initUSART(void)
{
        UCSR0A = 0x00; 
        UCSR0B = 0x18;            
        UCSR0C = 0x06;              //1 Stop Bit, No Parity Bit
        UBRR0H = 0x00;
        UBRR0L = 0x67;               //Baud Rate : 9600
        UDR0   = 0x00;
}                  

void main(void)
{
        char i[10];
        
        initUSART();        
        while(1)
        {
                scanf("%s", i);
                printf("%s\n", i); 
        }
}