prinf를 이용한 ATMEGA128 USART 통신
//****************************************************************************************************//
// <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);
}
}