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
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
@ 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
@Hans: Beim XMega kannst du ja noch einen BSCALE Wert berechnen und damit die Baudrate genauer einstellen. Gucke mal ins Datenblatt S. 237.
ich habe einen externen oszillator schon auf dem board. ist das vielleicht ein baudquarz? damit betreibe ich die taktfrquenz vom controller.
@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.
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.
also, ich habe mir das bsel mit dem bscale mal ausgerechnet, ich weiß allerdings nciht genau ob das stimmt. siehe anhang
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
ok, mit pll von 3 und der steigerung auf 24 mhz funktioniert e bis jetzt mal.
Hm eigentlich müsste doch BSEL = 107 und BCSALE = -5 bei 8MHz Peripherietakt gehen...
ja stimmt, danke. das geht auch. wie genau hast du es denn ausgerechnet? denn bei mir kommt da nie etwas gescheites raus.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.