Forum: Mikrocontroller und Digitale Elektronik Merkwürdiger Uart Empfang


von Steve (Gast)


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;
}

von Michael S. (mst)


Lesenswert?

Welcher Proz?

Benutzt du zufällig den internen Osc? Der ist beliebig ungenau...

Gruß Micha,

von Steve (Gast)


Lesenswert?

Es is ein Atmega8 mit externem Resonator.

Komisch ist nur dass es mit der falschen Einstellung geht... mit der 
Richtigen aber nicht.

von Michael S. (mst)


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,

von unsichtbarer WM-Rahul (Gast)


Lesenswert?

>(char)

sollte eher (unsigned char) heissen.
Vermutlich ist dein Resonator nicht so genau in seiner Frequenz. 
Probier's doch mal mit einem Quarz(-oszillator).

von Steve (Gast)


Lesenswert?

Der lauft bei 8 Mhz, mit dem Oszi gemessen ergibt auch ziemlich genau 8.
Ich mess später mal die Impulszeiten und überprüfe die Register.

von Steve (Gast)


Lesenswert?

Hab mal die Register manuell beschrieben:

UBRRH = 0;
UBRRL = 3;  // weil F_CPU/16*BAUDRATE - 1 = 3,3


geht aber immer noned mit der richtigen Einstellugn.

von Michael S. (mst)


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,

von Steve (Gast)


Lesenswert?

So,

Impulszeiten sind: ca. 8,1 µs. Komisch, müssten doch 8,6 sein....

Vielleicht dann deswegen weil 8,1 näher an 7,812us (128k) liegt als 
8,68us
(115k)...


Verkehrte Welt!

von Michael S. (mst)


Lesenswert?

... 8,1us passt aber verdammt zu meinen berechneten abweichungs 
124,992kbaud, oder was meinst du? :-) g

Gruß Micha,

PS: 1 / 124,992kbaud = 8,0005us

von Stefan (Gast)


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%!

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Steve (Gast)


Lesenswert?

Also mit U2X = 1 und UBRR = 8 gehts auch nicht. Nicht bei 115k und auch 
nicht bei 128k.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.