mikrocontroller.net

Forum: Compiler & IDEs xmega mit 115200 baudrate


Autor: Hans Müller (anno)
Datum:

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

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

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

Autor: Falk Brunner (falk)
Datum:

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

Autor: A. N. (netbandit)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Hans:

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

Autor: Hans Müller (anno)
Datum:

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

damit betreibe ich die taktfrquenz vom controller.

Autor: A. N. (netbandit)
Datum:

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

Autor: Hans Müller (anno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ne da habe ich noch nicht geschaut.

muss ich morgen mal machen.

Autor: Simon K. (simon) Benutzerseite
Datum:

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

Autor: Hans Müller (anno)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
also,

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

siehe anhang

Autor: Helmut Ru (heru01)
Datum:

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

Autor: Hans Müller (anno)
Datum:

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

Autor: A. N. (netbandit)
Datum:

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

Autor: Hans Müller (anno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja stimmt, danke. das geht auch.

wie genau hast du es denn ausgerechnet?

denn bei mir kommt da nie etwas gescheites raus.

Autor: A. N. (netbandit)
Datum:
Angehängte Dateien:

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

Autor: Hans Müller (anno)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
super klasse, danke für die hilfe.

Autor: kai5 (Gast)
Datum:

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

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.