Hallo

also zu deinem Code:

UCSRC = (3<<UCSZ0);

Ich weiß nicht ob das so geht...

Ich würde es vielleicht so versuchen:

UCSRC = (1<<UCSZ1) | (1<<UCSZ1);

Und warum verwendest du 2 Stoppbits? Einfach nur so, oder bringt das irgendwie Vorteile?

Und hier nochmal mein erster Code, den ich mal irgendwann im Internet gefunden hab. Auf meinem Atmega16 funktioniert er, vielleicht kannst du damit deine Schaltung testen.

Code:
#include <avr/io.h>
#include <inttypes.h>

// Sollte schon im Makefile definiert sein.
// In dem Fall hier einfach löschen.
#define F_CPU       16000000UL

#define BAUD        9200UL
#define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)

// USART initialisieren
void uart_init(void)
{
    // Baudrate einstellen (Normaler Modus)
    UBRRH = (uint8_t) (UBRR_BAUD>>8);
    UBRRL = (uint8_t) (UBRR_BAUD & 0x0ff);

    // Aktivieren von receiver und transmitter
    UCSRB = (1<<RXEN)|(1<<TXEN);

    // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
    UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}

int main(void)
{
    uint8_t buffer;

    // USART initialisieren
    uart_init();

    while (1)
    {
        // Warten bis Daten empfangen wurden
        while ( !(UCSRA & (1<<RXC)) )
            ;

        // Empfangsregister auslesen
        buffer = UDR;

        // Warten bis der Sendepuffer frei ist
        while ( !( UCSRA & (1<<UDRE)) )
            ;

        // Daten in den Puffer schreiben und damit senden
        UDR = buffer;
    }
}
mfG