#include <avr/io.h>
#define F_CPU 16000000UL
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <string.h>

#define CR	0x0D
#define LF	0x0A

#define BAUD 9600
#define UBRR F_CPU/16/BAUD-1

char	buffer[100];
//--------------------------------------------------------------------
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 j;
	for (j=0; j<strlen(text); j++) USART_Transmit (text[j]);
}
//------------------------------------------------------------------------------
ISR (INT0_vect) {
	unsigned char	i = 0, j, a_char;
	    
	EIMSK &= ~(1<<INT0);			//Dissable INT0
	PORTB |= (1<<PORTB5);		    //LED_ON
	USART_Transmit_text("ASCII tabulka\n\r");
	for (i=0; i<56; i++) {
		wdt_reset();
		for(j=0; j<4; j++) {
            a_char =  0x20+i*4+j;
			sprintf (buffer, "%03d 0x%02X %c | ", a_char, a_char, a_char);
			USART_Transmit_text(buffer);
		}
		USART_Transmit (LF); USART_Transmit (CR);
		if (i==23) {USART_Transmit (LF); USART_Transmit (CR);}
	}
	PORTB &= ~(1<<PORTB5);		    //LED_OFF;
	EIFR |= 1<<INTF0;				//Clear flag INT0
	EIMSK |= 1<<INT0;			    //Enable INT0
}
//------------------------------------------------------------------------------
int main (void) {
		
	wdt_enable(WDTO_500MS);		//Enable WDT 0.5sec
	DDRB |= (1<<DDB5);			//nastavenie vyvodu PORTB5 na vystup 
	PORTD |= 1<<PORTD2;			//Enable PD2 pull-up resistor
	EICRA |= 1<<ISC01;			//Trigger INT0 on failing edge
	EIMSK |= 1<<INT0;			//Enable INT0
	EIFR |= 1<<INTF0;
	sei();						//Enable Global Interrupt
	USART_Init (UBRR);			//inicializacia UART
	
	USART_Transmit_text("UART_Txb.c\n\rVygeneruj prerusenie INT0\n\r");
	while(1) { 
		wdt_reset();			
	}
}
//------------------------------------------------------------------------------

