Merkwürdiger Uart Empfang

Gast #450572
Lesenswert?

Hi, folgende Merkwürdigkeit ist mir aufgefallen:

Wenn ich die Eingestellte Baudrate 115200 benutze, und mir die Ausgaben 
auf Br@ys Terminalprogramm anzeigen lassen will, dann kommen nur wirre 
Zeichen über die Schnittstelle. Wenn ich im Terminal als Rate 128000 
einstelle, dann funktionierts ohne Probs. Warum aber mit dem falschen 
Wert und nicht mit dem Richtigen?

Hier ist meine #def und die Uart init.


#define BAUD 115200UL
#define UBRR_BAUD ((F_CPU)/(16*(BAUD))-1)

void uart_init(void)
{
UCSRB |= (1<<TXEN) | (1<<RXEN) | (1<<RXCIE);
UCSRC |= (1<<URSEL) | (3<<UCSZ0);

UBRRH = (char) (UBRR_BAUD>>8);
UBRRL = (char) UBRR_BAUD;
}
#450584
Lesenswert?

Resonatoren werden im schlimmsten Fall auch mit +/- 1% angegeben, 
trozdem sollte es nicht von 115k2 auf 128k drifen...

Was für eine Resonatorfrequenz benutzt du? Ist in F_CPU evtl. noch ein 
falscher Wert drin?
schonmal die Werte zu Fuss berechnet und in die Register geladen?
Hast du ein Oszi? Evtl. mal die Impulszeit der Bits messen. 8,68us 
(115k2) zu 7,812us (128k) sollte man eigentlich sehen...

Gruß Micha,
#450594
Lesenswert?

ähm, hüstel det geht aber net!

Laut Datenblatt bei 8MHz und 115k2 macht das 8,5% abweichung... 115k2 * 
1,085  = 124,992kbaud...

Baudratenquarz benutzen, Übertragungsgeschwindigkeit runter, oder 
wenigstens U2X = 1 setzten, dann sinds aber immer noch -3,5% !!!

Gruß Micha,
Gast #450598
Lesenswert?

Jo, laut Datenblatt von Atmel (doc2486.pdf S. 161) hast du bei 8 MHz und 
UBRR=3 eine +8,5% Fehlanpassung. Mit U2X=1 Einstellung und UBRR=8 
könntest du die Fehlanpassung auf -3,5% senken. Noch besser würde es mit 
einem "Baudratenquarz" von z.B. 7,3728 MHz klappen - Fehlanpassung 0,0%!
Persönliche Seite #450618
Lesenswert?

Was soll denn das für eine serielle Schnittstelle im PC sein?
Die üblichen Onboard-Standardschnittstellen verwenden (als IP-Core) 
einen mit 1.8432 MHz angesteuerten 16C550 und können deswegen maximal 
mit 115200 Baud (1.8432 MHz / 16) betrieben werden.

Daß man im "Terminalprogramm" irgendwelche Werte einstellen kann, hat 
keinerlei Bedeutung, da nicht der verwendete Devicetreiber nach 
möglichen Baudraten abgefragt wird.

Werden nicht erzeugbare Baudraten eingestellt, wird der nächstbeste Wert 
verwendet; und der ist bei 16C550 & Konsorten das Resultat einer 
ganzzahligen Division von 115200 - die nächstkleinere Baudrate ist also 
57600 (/2), gefolgt von 38400 (/3) etc.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren