/*	uart library for avr atmega1284p
 *	(c) fabian klabacher
 *	created:	05.01.2011 / 15:30
 *	last updated:	13.05.2011 / 18:56
 */


/*
 uart_init(): init uart
 uart_transmit_mode(): transmit data with uart
 uart_receive_mode(): receive data with uart
 

 functions:
 uart_puts(string): send a complete string with uart
 uart_putc(character): send a single character with uart
  

*/

#include <avr/io.h>

#define F_CPU 20000000
#define BAUD 115200
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)

/////// max length of the received string ///////
#define MAXSTRLEN 15
/////////////////////////////////////////////////

void uart_init();	// general init uart
//void uart_transmit_mode();	// set uart in transmit mode	
//void uart_receive_mode();	// set uart in receive mode
void uart_putc(char char0);	// send a single character to uart
void uart_puts(char string0[]);	// send a whole string to uart
int uart_getc();				// get a single character
int uart_gets(char string1[]);	// get a whole string ended with a ;


void uart_init()
{
	UBRRHn = UBRR_VAL>>8;
	UBRRLn = UBRR_VAL;
	
	UCSRnB = (1<<RXENn)|(1<<TXENn);
	
	UCSRnC = (1<<USBSn)|(3<<UCSZn0);

	return;
}

/*
void uart_transmit_mode()
{
	UCSRnB = (0<<RXENn) | (1<<TXENn);

	return;
}*/

/*
void uart_receive_mode()
{
	UCSRnB = (0<<TXENn) | (1<<RXENn);

	return;
}*/

void uart_putc(char char0)
{
	while(!(UCSRnA & (1<<UDREn)))
	{
	}

	UDRn = char0;

	return;
}

void uart_puts(char string0[])
{
	int n=0;

	while(string0[n] != '\0')
	{
		while(!(UCSRnA & (1<<UDREn)))
		{
		}
		UDRn = string0[n];
		n=n+1;
	}

	return;
}

int uart_getc()
{
	while(!(UCSRnA & (1<<RXCn)))
	{
	}

	return (UDRn);
}

int uart_gets(char string1[])
{
	int n=0;
	char buffer = 'i';

	while(buffer != ';')
	{
		while(!(UCSRnA & (1<<RXCn)))
		{
		}
		buffer = UDRn;
		string1[n]=buffer;
		n=n+1;
	}

	string1[n]='\0';

	return;
}






