#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <string.h>
#include <stdio.h>

#define BAUD 9600
#define UBRR F_CPU/16/BAUD-1

char	buffer[50], znak;

//--------------------------------------------------------------------
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_Text (char *text) {
	unsigned char	i;
	for (i=0; i<strlen(text); i++) {
		while(!(UCSR0A & (1 << UDRE0)));
		UDR0 = text[i];
	}
}
//-------------------------------------------------------------------------------
ISR (INT0_vect) {			//Obsluha externeho prerusenia INT0
	EIMSK &= ~(1<<INT0);	//Disable	INT0
	USART_Transmit_Text ("\n\rINT0 Disabled");
}
//------------------------------------------------------------------------------
void INT0_Init (void) {
	PORTD |= 1<<PORTD2;				// Enable PD2 pull-up resistor
	EICRA |= 1<<ISC01;				// Trigger INT0 on failing edge
	EIFR |= 1<<INTF0;				// Clear External INT0 Flag
	EIMSK |= 1<<INT0;				// Enable INT0
}
//------------------------------------------------------------------------------
int main (void) {

	wdt_enable(WDTO_2S);			//zmena WDT na 2sec
	DDRB |= (1<<DDB5) | (1<<DDB0);	//nastavenie vyvodov LED a LED1 na vystup
	USART_Init (UBRR);
	INT0_Init ();
	USART_Transmit_Text("\n\rTEST Komunikacie cez Tx a Rx");
	USART_Transmit_Text("\n\rR - Reset MCU");
	USART_Transmit_Text("\n\rZ - Led1 On");
	USART_Transmit_Text("\n\rV - Led1 OFF");
	USART_Transmit_Text("\n\rE - INT0 Enabled");
	sei();
	
	while(1) { 
		wdt_reset();
		if ((UCSR0A & (1<<RXC0))) {
			znak = UDR0;
			sprintf(buffer, "\n\r0x%02X %c  ", znak, znak);
			USART_Transmit_Text(buffer);
			switch (znak) {
				case 'R':	USART_Transmit_Text("Softverovy reset\n"); 
							wdt_enable(WDTO_15MS);
							while (1);
				case 'Z':	USART_Transmit_Text("LED1 On\n"); PORTB |= (1<<PORTB0); break;
				case 'V':	USART_Transmit_Text("LED1 OFF\n"); PORTB &= ~(1<<PORTB0); break;
				case 'E':	USART_Transmit_Text("INT0 Enabled\n");
							EIFR |= 1<<INTF0; EIMSK |= 1<<INT0; break;	
			}
		}
		PORTB |= (1<<PORTB5); _delay_ms (50);
		PORTB &= ~(1<<PORTB5); _delay_ms (500);
		PORTB |= (1<<PORTB5); _delay_ms (50);
		PORTB &= ~(1<<PORTB5); _delay_ms (1000);
	}
}
//------------------------------------------------------------------------------

