Du hast UBBRH vergessen:
UBRRH = (uint8_t) (UBRR_BAUD>>8);
UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);

Schau mal meine sources an. die wurden speziell auf ATmega16 und atmega32 verwendet. die haben shcon unmengen an bytes geschickt.

wenn dein controller kein zeichen empfangt, kann er auch nichts senden. sendn ist am anfang einfacher als empfangen.

while (!(UCSRA & (1 << UDRE)))
{;}
UDR = '#';

sollte machen dass du auch ein # empfangs wenn du nichts empfangst.