Forum: Compiler & IDEs xmega mit 115200 baudrate


von Hans M. (anno)


Lesenswert?

Hallo zusammen,

ich wollte mal fragen wie ihr bei einem ATXMEGA die baudrate von 115200 
einstellt.

mein cpu frequenz begrägt 8Mhz.

Ich berechne mir einen wert für das BAUDCTRLA register, für den uart auf 
port d.

CPU_Frequenz / (16 * Baudrate)) - 1)

Ich will also eine Baudrate von 115200 erreichen.

Daher sollte mein Wert 3 oder 4 betragen, den ich in das Register 
BAUDCTRLA schreiben will.

Doch komischer weise bekomme ich bei dieser Baudrate nur datenmüll 
zurück.

Es funktioniert hingegen bis zu einer baudrate von 38400.

was kann ich da machen?

gruß anno

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Das funktioniert nicht. Mit 8MHz kommst du mit U2X=1 auf einen Fehler 
von 3.5%. Der Fehler sollte nicht größer sein als 0.2%

   http://www.gjlay.de/helferlein/avr-uart-rechner.html

Nimm also einen Baud-Quarz oder geh mit der Baudrate runter bzw. auf 
einen geraden Wert falls die Gegenstelle das kann.

Johann

von Falk B. (falk)


Lesenswert?

@  Johann L. (gjlayde) Benutzerseite

>von 3.5%. Der Fehler sollte nicht größer sein als 0.2%

Nanana, 1% ist schon noch OK. Siehe Baudratenquarz.

MFG
Falk

von A. N. (netbandit)


Lesenswert?

@Hans:

Beim XMega kannst du ja noch einen BSCALE Wert berechnen und damit die 
Baudrate genauer einstellen. Gucke mal ins Datenblatt S. 237.

von Hans M. (anno)


Lesenswert?

ich habe einen externen oszillator schon auf dem board. ist das 
vielleicht ein baudquarz?

damit betreibe ich die taktfrquenz vom controller.

von A. N. (netbandit)


Lesenswert?

@Hans:
Baudquarze erkennt man daran, dass sie eine sehr eigenartig gebrochene 
Frequenz haben. Also z.B. 11,xxx MHz anstatt 12,00 Mhz.

Hast du mal geguckt ob du das mit dem BScale Register vielleicht umgehen 
kannst? Ich meine genau dafür ist dieses Register da, um auch ohne 
Baudquarz höhere Baudraten erreichen zu können.

von Hans M. (anno)


Lesenswert?

ne da habe ich noch nicht geschaut.

muss ich morgen mal machen.

von Simon K. (simon) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Das funktioniert nicht. Mit 8MHz kommst du mit U2X=1 auf einen Fehler
> von 3.5%. Der Fehler sollte nicht größer sein als 0.2%

Quatsch. Beim xmega kann man mit internem Oszillator, der auch auf einer 
geraden Frequenz läuft so ziemlich jede Baudrate mit vertretbarem Fehler 
erzeugen, da der xmega einen Fractional Baud Rate Divider hat. Mehr dazu 
siehe a) Datenblatt b) Atmel AppNote.

von Hans M. (anno)


Angehängte Dateien:

Lesenswert?

also,

ich habe mir das bsel mit dem bscale mal ausgerechnet, ich weiß 
allerdings nciht genau ob das stimmt.

siehe anhang

von Helmut R. (heru01)


Lesenswert?

Hallo Hans,

wenn Du ein Oszi zur Hand hast und auf internen Takt stellst, dann 
solltest Du das 1x überprüft haben... Bei mir war Led-Toggeln sehr 
aufschlussreich; da kam heraus dass der µC mit der falschen Frequenz 
läuft. Ansonsten: einfach auf internen Takt einstellen - das reicht für 
jede RS232 Kommunikation.

Gruß
Helmut

von Hans M. (anno)


Lesenswert?

ok, mit pll von 3 und der steigerung auf 24 mhz funktioniert e bis jetzt 
mal.

von A. N. (netbandit)


Lesenswert?

Hm eigentlich müsste doch BSEL = 107 und BCSALE = -5 bei 8MHz 
Peripherietakt gehen...

von Hans M. (anno)


Lesenswert?

ja stimmt, danke. das geht auch.

wie genau hast du es denn ausgerechnet?

denn bei mir kommt da nie etwas gescheites raus.

von A. N. (netbandit)


Angehängte Dateien:

Lesenswert?

ich hab deine Excel Datei genommen und etwas angepasst. Nun kann man 
direkt den Fehler raus lesen und dann nimmt man halt zwei werte wo der 
Fehler möglichst gering ist.

von Hans M. (anno)


Lesenswert?

super klasse, danke für die hilfe.

von kai5 (Gast)


Lesenswert?

Hallo zusammen,

ich hatte ein ähnliches Problem wie der OP, ich wollte einen XMEGA64A1 
mit dem internen 32 MHz Oszillator takten und UART mit 115200 Baud 
verwenden. Zum setzen des Taktes habe ich das Beispiel von Atmel benutzt 
(mit der Bibliothek clksys_driver.h).

Dabei hatte ich übersehen, dass der UART eben nicht den CPU-Takt als 
Quelle verwendet, sonder den Peripherietakt. Dieser wird mittels PSBCDIV 
vom CPU-Takt abgeleitet.

Vielleicht hilft das ja mal jemandem mit einem ähnlichen Problem :)

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.