/********************************************************************************
Product : LKino-MEGA128
Project : RS232 송신 테스트
Date    : 2017-01-19
Author  : Kyung Nam Lee
Company : LKEMBEDDED ( http://www.lkembedded.co.kr )
Comments: Printf을 이용하여 RS232포트로 "LKino MEGA128 Training Board RS232COM Test"문자를 출력하는 프로그램

Pin map
LK-ATmega128M		LKino-MEGA128		LK-UTS
TX0					R2IN
RX0					/T2OUT
					RX					RX(RS232)
					TX					TX(RS232)
********************************************************************************/
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
void usart_putchar(char data);
int usart_putchar_printf(char var, FILE *stream);
static FILE mystdout; /* FDEV_SETUP_STREAM(usart_putchar_printf, NULL, _FDEV_SETUP_WRITE); */
void usart_putchar(char data)
{
	while ( !( UCSR0A & (1 << UDRE0)) ) ;  // 버퍼가 비워질 때까지 대기
	UDR0 = (unsigned char)data;  // 버퍼의 데이터를 전송
}
// this function is called by printf as a stream handler
int usart_putchar_printf(char var, FILE *stream)
{
	// translate \n to \r for br@y++ terminal
	if (var == '\n') usart_putchar('\r');
	usart_putchar(var);
	return 0;
}
void retarget_stdio(void)
{
	mystdout.put = usart_putchar_printf;
	mystdout.get = NULL;
	mystdout.flags = _FDEV_SETUP_WRITE;
	mystdout.udata = 0;

	stdout = &mystdout;
}
int main(void)
{
	// USART0 초기화
	// 통신 파라메터: 8 Data, 1 Stop, No Parity
	// USART0 수신: Off
	// USART0 송신: On
	// USART0 모드: 비동기
	// USART0 보레이트: 9600
	UCSR0A = 0x00;
	UCSR0B = 0x08;
	UCSR0C = 0x06;
	UBRR0H = 0x00;
	UBRR0L = 0x67;
	retarget_stdio();
	while (1)
	{
		printf("LKino MEGA128 Training Board RS232COM Test \r\n");
		_delay_ms(500);
	}
}