#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/wdt.h>
#include <string.h>
#include <stdio.h>

#define BAUD 9600
#define UBRR F_CPU/16/BAUD-1
#define CR	0x0D
#define LF	0x0A

//--------------------------------------------------------------------
void USART_Init (unsigned int ubrr)	//Serial port komunikacia
{
	// set baud rate
	UBRR0H = (unsigned char)(ubrr>>8);
	UBRR0L = (unsigned char)ubrr;
	// Enable receiver and transmitter;
	UCSR0B |= (1 << RXEN0) | (1 << TXEN0);
	//Set Frame format: 8data 1stop
	UCSR0C |= (1 << UCSZ01) | (1 << UCSZ00);
}
//------------------------------------------------------------------------------
void USART_Transmit (char dataout)
{
	while(!(UCSR0A & (1 << UDRE0)));
	UDR0 = dataout;
}
//------------------------------------------------------------------------------
void USART_Transmit_Text (char *text) {
	
	unsigned char	len, i;
	
	len = strlen(text);
	for (i=0; i<len; i++) USART_Transmit (text[i]);	
}
//------------------------------------------------------------------------------
int main (void) {
	char	znak;

	wdt_enable(WDTO_2S);			//zmena WDT na 2sec
	DDRB |= (1<<DDB5);				//nastavenie vyvodu LED na vystup
	USART_Init (UBRR);				//Inicalizacia UART
	USART_Transmit_Text ("\n\rTEST Prijmu znaku cez Rx");	
	USART_Transmit_Text ("\n\rZ - Led On");
	USART_Transmit_Text ("\n\rV - Led OFF");
	USART_Transmit_Text ("\n\rB - Blikanie Led");
	znak = 'B';
	
	while(1) { 
		wdt_reset();
		if ((UCSR0A & (1<<RXC0))) {	//ak je znak v UDR0, tak ho nacitaj
			znak = UDR0;
			USART_Transmit (LF); USART_Transmit (CR); USART_Transmit (znak); 
			switch (znak) {
				case 'Z':	USART_Transmit_Text("-Led On"); PORTB |= (1<<PORTB5); break;
				case 'V':	USART_Transmit_Text("-Led Off"); PORTB &= ~(1<<PORTB5); break;	
				case 'B':	USART_Transmit_Text("-Blikanie Led"); break;
				default:	USART_Transmit_Text("-Nepoznam"); break;
			}
		}
		if (znak == 'B') {			//ak je znak B blikaj
			PORTB |= (1<<PORTB5); _delay_ms (50);
			PORTB &= ~(1<<PORTB5); _delay_ms (500);
			PORTB |= (1<<PORTB5); _delay_ms (50);
			PORTB &= ~(1<<PORTB5); _delay_ms (1000);
		}
	}
}
//------------------------------------------------------------------------------

