uart übertragung 1. bit immer 1
Hi,
wenn ich über meinen UART Daten übertrage ist das 1. Bit immer 1 ich schicke eine 0 hin 00000000 und bekomme 10000000 zurück und das bei allen zahlen.
Ich benutze einen AtMega16 mit internem 1MHZ die übetragung läuft über einen max232 Chip
Eigenschaften:
Baud 9600 kein parity 8 bit 1 stop
Programm:
Code:
#define F_CPU 1000000UL
#define BAUD 9600UL
#define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1)
void uart_init(void)
{
// Baudrate einstellen (Normaler Modus)
UBRRH = (unsigned char) (UBRR_BAUD>>8);
UBRRL = (unsigned char) (UBRR_BAUD & 0x0ff);
// Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
SIGNAL(SIG_UART_RECV)
{
unsigned char buffer;
// Daten aus dem Puffer lesen ...
buffer = UDR;
// ... warten bis der Sendepuffer leer ist ...
while ( !( UCSRA & (1<<UDRE)) )
;
// ... und gleich wieder zurück schicken
UDR = buffer;
}
Vielen Dank
Martin
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo
Da ich in der Parametrierung des UART oder im Programm keinen Fehler entdecken kann, tippe ich mal auf ein Problem mit den internen 1MHz und der Bauddrate. Wenn das nicht genau passt, wirkt es sich beim letzen Bit (Bit7) zuerst aus, es würde dann das Stopbit als Datenbit interpretiert. Testweise kannst du mal die Baudrate senken, auf 1200 vielleicht.[Edit]Das ist Unsinn, der Fehler wäre prozentual bei allen Baudraten gleich[/Edit] Oder mal Parity einschalten, dann müßte ein Unterschied zwischen geraden und ungeraden Zeichen sein.
Wenn das die Ursache wäre, könnte man vielleicht durch eine "krumme" Baudrate den Taktfehler korrigieren. Soweit ich weiß kann man den internen Takt auch kalibrieren, aber beides habe ich noch nicht versucht/gemacht.
Gruß
mic
Bitabfolge laut Datenblatt, nach dem MSB kommt direkt das Stopbit: