@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:
Zum Problem kann ich leider nicht wirklich viel beitragen.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; }
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.







Zitieren

Lesezeichen