mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Merkwürdiger Uart Empfang


Autor: Steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Michael S. (mst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Proz?

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

Gruß Micha,

Autor: Steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es is ein Atmega8 mit externem Resonator.

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

Autor: Michael S. (mst)
Datum:

Bewertung
0 lesenswert
nicht 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,

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael S. (mst)
Datum:

Bewertung
0 lesenswert
nicht 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,

Autor: Steve (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Michael S. (mst)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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%!

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steve (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.