@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.
Lesezeichen