Проблема оказалась в изначальной инициализации, в памяти регистров UCSR0A-C оказывается мусор, я же предполагал, что там нули.
Исправил код и все заработало
#include <avr/io.h>
#define FOSC 16000000 // Clock Speed
#define BAUD 9600
#define MYUBRR FOSC/16/BAUD-1
void USART_Init( unsigned int ubrr)
{
/*Set baud rate */
UCSR0A = 0;
UCSR0B = 0;
UCSR0C = 0;
UBRR0H = (unsigned char)(ubrr>>8);
UBRR0L = (unsigned char)ubrr;
/*Enable receiver and transmitter */
UCSR0B = 1<<TXEN0;
/* Set frame format: 8data, 1stop bit */
UCSR0C = 3<<UCSZ00;
}
void USART_Transmit( char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<<UDRE0)) )
;
/* Put data into buffer, sends the data */
UDR0 = data;
}
void main( void )
{
USART_Init(MYUBRR);
while(1){
USART_Transmit('a');
}
}