#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#define F_CPU 16000000UL
#include <util/delay.h>

#define BAUD 9600
#define UBRR F_CPU/16/BAUD-1

#define CR	0x0D
#define LF	0x0A
//--------------------------------------------------------------------
//Inicializacia serial port
void USART_Init (unsigned int ubrr)	
{
	// 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;
}
//---------------------------------------------------------------------
//Obsluha externeho prerusenia INT0
ISR (INT0_vect) {
	USART_Transmit (CR); USART_Transmit (LF);
	USART_Transmit ('I');		 
	USART_Transmit ('n');
	USART_Transmit ('t');
	USART_Transmit ('0');
	USART_Transmit (' ');
	EIFR |= 1<<INTF0;
}
//------------------------------------------------------------------------------
int main (void) {

	char	i=0;

	wdt_enable(WDTO_2S);		//povolenie WDT 2sec
	DDRB |= (1<<DDB5);			//nastavenie vyvodu LED na vystup 
	USART_Init (UBRR);			//inicializacia UART
	
	PORTD |= 1<<PORTD2;			// Enable PD2 pull-up resistor
	EICRA |= 1<<ISC01;			// Trigger INT0 on failing edge
    EIFR |= 1<<INTF0;	      	// vymaže príznak prerušenia INT0
	EIMSK |= 1<<INT0;			// Enable INT0
	sei();						//Enable Global Interrupt	
	
	USART_Transmit (CR); USART_Transmit (LF);
	USART_Transmit (' '); USART_Transmit ('Z'); USART_Transmit ('M'); USART_Transmit ('T');
	USART_Transmit (CR); USART_Transmit (LF);
		
	while(1) { 
		wdt_reset();
		USART_Transmit ('0'+i); USART_Transmit (' ');	//vysle index
		if (i < 9) i++;
		else i=0;
		PORTB |= (1<<PORTB5); USART_Transmit ('S');		//vysle S
		_delay_ms (100);
		PORTB &= ~(1<<PORTB5); USART_Transmit ('N');	//vysle N
		_delay_ms (200);
		PORTB |= (1<<PORTB5); USART_Transmit ('S');
		_delay_ms (300);
		PORTB &= ~(1<<PORTB5); USART_Transmit ('N'); 
		_delay_ms (400);
		USART_Transmit (CR); USART_Transmit (LF);       //novy riadok
		
	}
}
//------------------------------------------------------------------------------

