//ICC-AVR application builder : 2006-06-29 오후 11:19:25
// Target : M128
// Crystal: 16.000Mhz
#include <stdio.h>
#include <iom128v.h>
#include <macros.h>

char state;
char data;
char count;
char len_L,len_H;
char r_data[23];
char complete;

void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x00;
 PORTC = 0x00; //m103 output only
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
 PORTE = 0x00;
 DDRE  = 0x00;
 PORTF = 0x00;
 DDRF  = 0x00;
 PORTG = 0x00;
 DDRG  = 0x00;
}

//UART0 initialize
// desired baud rate: 19200
// actual: baud rate:19231 (0.2%)
// char size: 8 bit
// parity: Disabled
void uart0_init(void)
{
 UCSR0B = 0x00; //disable while setting baud rate
 UCSR0A = 0x00;
 UCSR0C = 0x06;
 UBRR0L = 0x33; //set baud rate lo
 UBRR0H = 0x00; //set baud rate hi
 UCSR0B = 0x18;
}

//UART1 initialize
// desired baud rate:57600
// actual baud rate:58824 (2.1%)
// char size: 8 bit
// parity: Disabled
void uart1_init(void)
{
 UCSR1B = 0x00; //disable while setting baud rate
 UCSR1A = 0x00;
 UCSR1C = 0x06;
 UBRR1L = 0x10; //set baud rate lo
 UBRR1H = 0x00; //set baud rate hi
 UCSR1B = 0x98;
}

#pragma interrupt_handler uart1_rx_isr:31
void uart1_rx_isr(void)
{
 //uart has received a character in UDR
 data=UDR1;
 
 if(state==4)
 {
 	if(data==0x03)
	{
		state=0;
		count=0;
		complete=1;
	}
 	
 }else if(state==3)
 {
 	r_data[count]=data;
	count++;
	if(count==len_L)state=4;
	 	
 }else if(state==2)
 {
	len_H=data;
	state=3;
 }else if(state==1)
 {
	len_L=data;
	state=2;
 }else if(data==0x02)state=1;
 
}

//call this routine to initialize all peripherals
void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 XDIV  = 0x00; //xtal divider
 XMCRA = 0x00; //external memory
 port_init();
 uart0_init();
 uart1_init();

 MCUCR = 0x00;
 EICRA = 0x00; //extended ext ints
 EICRB = 0x00; //extended ext ints
 EIMSK = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 ETIMSK = 0x00; //extended timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

void delay_ms(unsigned int ms)
{
	unsigned int i;
	while(ms--)
	{
		i=2727;
		while(i--);
	}
}

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

void check_ID(void)
{
	char i;
	char send[]={0x02,0x01,0x00,0x70,0x73,0x03};
	printf("Check ID.\r\n");

	for(i=0;i<6;i++)USART_Transmit(send[i]);
}

void Read_data(char addr)
{
	char i;
	char lrc=0x00;
	char send[]={0x02,0x02,0x00,0x71,0x00,0x00,0x03};
	send[4]=addr;
	printf("Read data.\r\n");

	for(i=0;i<7;i++)
	{
		if(i==5)send[5]=lrc;

		USART_Transmit(send[i]);
		lrc^=send[i];
	}
	
}
void Write_data(char addr, char *str)
{
	char i;
	char lrc=0x00;
	char send[]={0x02,0x12,0x00,0x72,0x00};
	send[4]=addr;

	printf("Write data.\r\n");

	for(i=0;i<5;i++)
	{
		USART_Transmit(send[i]);
		lrc^=send[i];
	}
	for(i=0;i<16;i++)
	{
		if(*str==NULL)USART_Transmit(0x00);
		else
		{
			USART_Transmit(*str);
			lrc^=*str;
			str++;

		}
	}
	USART_Transmit(lrc);
	USART_Transmit(0x03);
	
}

void init_var(void)
{
	data=0;
	len_L=len_H=0;
	state=0;
	complete=0;
	
}
void main(void)
{
	char i;
	char *str="Korea";
	init_var();
	init_devices();
	
	delay_ms(500);
	//check_ID();
	//Write_data(0x01, str);
	Write_data(0x01, "우리나라");
	delay_ms(3000);
	Read_data(0x01);

	while(1)
	{
		if(complete==1)
		{
			for(i=0;i<len_L;i++)
			{
				if(r_data[i]!=NULL)printf("%c",r_data[i]);
			}
			printf("\r\n");
			complete=0;
		}
	}
} 

