Uh, das stimmt aber einiges nicht....
Das UCSRC-Register brauchst Du gar nicht anzupacken. Das steht in der Grundeinstellung schon auf Asynchron 8N1

Dein schlimmster Fehler ist es, das Senden über einen Interrupt machen zu wollen.
Deine uart_tx() kann so nicht funktionieren.

SREG |= (0 << 7);
Diese Zeile macht gar nix. Du veroderst das Global Interrupt Enable Bit mit 0 - völlig nutzlos. Wieso willst Du hier das Bit überhaupt anpacken?

Die Interruptroutine, in der Du das UDR-Register beschreibst, wird erst dann ausgeführt, wenn ein Byte gesendet wurde. Du beißt Dir hier also in den eigenen Schwanz. Der Interrut ist nicht dazu gedacht, eine Senderoutine aufzubauen, sondern um eine Reaktion auf ein gesendetes Byte zu generieren.

Kurz und bündig: Um Deine Sendung zum laufen zu bringen, müsste Deine uart_tx() einfach so aussehen:
Code:
void uart_tx(uint8_t c) {
    UDR0 = c ;
}
Und lass die Interrupts ausgeschaltet - zum Senden brauchst Du die nicht.

askazo