#define F_CPU 16000000UL
#define UART_BAUDRATE 9600
#define MYUBRR (((F_CPU/16)/UART_BAUDRATE)-1)
static void _sei( void )
{
sei();
UCSR0B |= (1 << RXCIE0 );
}
/**
* Vetor de Interrupção USART RX
*/
ISR( USART_RX_vect )
{
unsigned char data;
/**
* Verifica se houve erro durante a recepção serial;
* FE0 = Frame Error;
* DOR0 = Data OverRun;
* UPE0 = USART Parity Error; //save context ISR
*/
data = UDR0;
if((UCSR0A & ((1 << FE0) | (1 << DOR0) | (1 << UPE0))) == 0)
{
}
}
void serial_init( void )
{
//Responsáveis pela configuração do baudrate;
UBRR0H = (uint8_t) (MYUBRR>>8);
UBRR0L = (uint8_t)(MYUBRR);
//Habilita a recepção serial e a transmissão serial;
//UCSZ02 = 0;
UCSR0B = (1<<RXEN0)|(1<<TXEN0);
//Configura a comunicação com caracters de 8 bits;
UCSR0C = (3<<UCSZ00);
}
void serial_chr( unsigned char data )
{
while(!(UCSR0A & (1<<UDRE0)));
//UCSR0A & (1<<5)
//UCSR0A & (0B00100000)
//!(0B00100000) //supondo buffer vazio
//Portanto, os comandos acima checam se
//o buffer de transmissão serial está livre
//ou ocupado. Somente é possível transmitir
//quando o buffer estiver livre
//Carrega o byte 'data' a ser transmitido no buffer TX;
//Quando a transmissão for encerrada o flag de status da serial
//volta a assumir 1 (livre);
UDR0 = data;
}
unsigned char serial_read( void )
{
while(!(UCSR0A & (1<<RXC0)));
return UDR0;
}
void setup() {
serial_init();
serial_chr('A');
}
void loop() {
// put your main code here, to run repeatedly:
serial_chr(serial_read());//eco
}