@pebi Na toll, was bringt es denn, wenn du nen Code copy&paste'test, der aufgabenspezifisch ist, und mit dem hier geschliderten Problem kaum was zu tun hat?

Und da die von dir immer soooo gewünschte Ordentlichkeit durch's einfache copy&paste'n verloren gegangen ist und die ganzen wegkommentierten Variablen, etc. das Ganze auch nicht gerade durchblickbarer machen, pack ich hier mal den funktionierenden Codeschnippsel den ich damals daraufhin entwickelt hatte:

Code:
#define F_CPU 8000000
#define USART_BAUD_RATE 9600
#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16l)-1)

#define READ  1
#define WRITE 2

void usart_init(int Enable, int Interupts)   // USART init'n zB mit usart_init(READ + WRITE, READ);
 { 
	if (Enable & READ)     UCSRB = (1<<RXEN); 
	if (Enable & WRITE)    UCSRB |= (1<<TXEN); 

    if (Interupts & READ)  UCSRB |= (1<<RXCIE); 
	if (Interupts & WRITE) UCSRB |= (1<<TXCIE); 
	
    UBRRL = (unsigned char) USART_BAUD_SELECT; 
 } 
 

void usart_writeChar(unsigned char c) // Zeichen mit dem USART senden
 {
	while (!(UCSRA & (1<<UDRE))) {}
	UDR = c;
 }


void usart_writeString(unsigned char *string) // String mit dem USART senden
 {
    while (!(UCSRA & (1<<UDRE))) {}
	while ( *string)
		usart_writeChar(*string++);
 }


void usart_crlf(void) // CarriageReturn + LineFeed = Neue Zeile
 {
	usart_writeChar(0x0D);  // CR #13
	usart_writeChar(0x0A); //  LF #10
 }


unsigned char usart_readChar(void) // Interrupt-unabhängig ein Zeichen lesen
 {
    while(!(UCSRA & (1<<RXC))) {}
    return UDR;
 }
Zum Problem kann ich leider nicht wirklich viel beitragen.
Nebenbei, aber das wird das Problem net lösen:
Der errechnete Wert, der in UBBR gespeichert wird, ist in fast allen Fällen so klein, dass man nur das UBBRL braucht.