PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : uart übertragung 1. bit immer 1



tanger
07.03.2008, 22:00
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:



#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

radbruch
07.03.2008, 23:17
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.Das ist Unsinn, der Fehler wäre prozentual bei allen Baudraten gleich 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:

Hubert.G
08.03.2008, 09:51
Bei 9600 und 1MHz Takt hast du 7% Fehlerabweichung, mehr als 2% sollte es auf keinen Fall sein.
Versuche es einmal mit 4800, da sollte der Fehler nur 0,2% sein. Das steht im Datenblatt unter USART Example of Baudrate Settings
Der interne Takt ist relativ ungenau, er schwankt abhängig von Betriebsspannung und Temperatur. Für eine vernünftige Datenübertragung ist ein Baudratenquarz unumgänglich, alles andere ist Glücksspiel.

radbruch
08.03.2008, 10:00
Das steht im Datenblatt unter USART Example of Baudrate Settings
Die Tabelle hab' ich ja noch gar nicht gesehen. Danke.

tanger
08.03.2008, 11:08
Vielen Dank mit einer geringeren Baut läuft es ... ich werde mir dann wohl noch ein Quarz hohlen...
Gruß
Martin