Wenns denn sein muß könnte ich schon einen Beispielcode beisteuern. Ein funktionieren der C Code sollte besser sein als ein .hex file. Ich hätte z.B. ein einfaches UART Echo.
Sollte gehen, habe nur mein restliches Programm entfernt um den Code kurz zu halten. Gff die Datenrichtungen ein bischen anpassen, je nach Hardware.


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

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

// USART initialisieren
void uart_init(void)
{
    // Baudrate einstellen (Normaler Modus)
    UBRR0H = (uint8_t) (UBRR_BAUD>>8);
    UBRR0L = (uint8_t) (UBRR_BAUD & 0x0ff);
    // Aktivieren von receiver und transmitter
    UCSR0B = (1<<RXEN0)|(1<<TXEN0);
    // Einstellen des Datenformats: 8 Datenbits, 2 Stoppbit
    UCSR0C = (1<<UCSZ01)|(1<<UCSZ00)|(1<<USBS0);
}

void init_2(void)
{
   DDRB = 63  ;   // LED Driver outputs
   DDRD = 254 ;   // outputs except RXD  
   DDRC = 3+32   ;   // PC0,PC1,PC5 outputs (LED Kathodes)
   sei();
}

int main(void)
{
    uint8_t buffer;

    init_2();         // in/out initialisieren, interupts freigeben
    uart_init();      // USART initialisieren
 
    while ( !( UCSR0A & (1<<UDRE0)) ) ; // Warten bis der Sendepuffer frei ist
    UDR0 = 'A';
    while ( !( UCSR0A & (1<<UDRE0)) ) ; // Warten bis der Sendepuffer frei ist
    UDR0 = 'B';

    while (1)
    {
        // Warten bis Daten empfangen wurden
        while ( !(UCSR0A & (1<<RXC0)) )       ;

        // Empfangsregister auslesen
        buffer = UDR0;

        // Warten bis der Sendepuffer frei ist
        while ( !( UCSR0A & (1<<UDRE0)) )            ;

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