PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART Problem 115200 Baud



Peter_M
25.04.2007, 16:03
Hallo

Ich habe ein seltsames UART Problem. Wenn Daten von meinen Atmega8 ( 16 MHZ) mit 115200 Baud an den PC sende, werden einige Bytes nicht richtig empfangen. Bei 4400 gesendeten Bytes werden ungefähr 15 Bytes nicht richtig übermittelt. Interessanterweise tritt der Fehler nur auf wenn die Bytes zwischen 127 bis 255 liegen, unter 127 wird alles richtig übertragen. Die Übertragungsgeschwindigkeit (115200) kann ich nicht senken da ich die Bandbreite dringen brauche.

Bei meinen Testprogramm wird von 0 bis 1024 gezählt und die Zahl gesendet (HIGH und LOW Byte)

Im Terminal.exe am PC bekomme folgendes typisches Bild ( die Zahl 127 kippt am häufigsten zu 255 !!!)


0 110 0 111 0 112 0 113 0 114 0 115 0 116
0 117 0 118 0 119 0 120 0 121 0 122 0 123
0 124 0 125 0 126 0 255 0 128 0 129 0 130
0 131 0 132 0 133 0 134 0 135 0 136 0 137
0 138 0 139 0 140 0 141 0 142 0 143 0 144


Habt ihr eine Idee was das Problem sein könnte?

Mein Code:

$regfile = "m8def.dat"
$crystal = 16000000
$baud = 115200

$framesize = 32
$swstack = 32
$hwstack = 64


Config Lcdmode = Port
Config Lcd = 16 * 2
Config Lcdbus = 4


Dim A As Byte
Dim Counter As Integer

Dim Messwert_counter As Integer
Dim Signal_test As Integer
Dim Messdaten(2) As Byte
Dim Low_byte As Byte , High_byte As Byte

Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.5 , Db6 = Portd.7 , Db7 = Portd.6 , E = Portd.3 , Rs = Portd.2

Initlcd

Cls
Locate 1 , 1
Lcd "Test"
Locate 2 , 1
Lcd "Baud 115200"
Wait 2


Signal_test = 0


For Messwert_counter = 1 To 2000


Low_byte = Low(signal_test)
High_byte = High(signal_test)
Messdaten(1) = High_byte
Messdaten(2) = Low_byte

Printbin Messdaten(1);

Waitms 100
Incr Signal_test
If Signal_test > 1024 Then Signal_test = 0



Next Messwert_counter

End

uwegw
25.04.2007, 16:13
Bei 16Mhz und 115200Baud weicht die tatsächliche Baudrate um 7,84% ab. Bei dieser Kombination kann die Quarzfrequenz technisch bedingt nicht genau auf die benötigte Baudraten-Frequenz runtergeteilt werden. Daher werden einzelne Bits faksch erkannt, weil Sender und Empfänger ncith synchron takten.

Abhilfe: einen anderen Quarz verwenden. Es gibt spezielle Quarze mit auf den ersten Blick "krummen" Frequenzen wie 14,746Mhz. Ihre Frequenz passt genau zum Vorteiler des UARTs, und es tritt keine Abweichung mehr auf.

Peter_M
25.04.2007, 16:44
Danke für den Tipp

Werde mir gleich so einen Quarz besorgen.

Sind höhere Baudraten wie 115200 mit Bascom realisierbar? Wo liegen die Grenze die mit Bascom mit Atmega (16 MHZ) realisierbar sind?

Ich möchte mit dem Atmega einen Datenlogger bauen, da wäre eine höhere Übertragungsgeschwindigkeit von Vorteil. Auf der PC Seite müßte man dann einen USB RS232 Adapter (1 MPS) verwenden.


Danke für alle Tips

Peter

Gento
25.04.2007, 19:08
Es gab hier mal eine Datei mit DMX 250000 Baud.

Dort waren aber große Teile in ASM.

Gento

Dnerb
25.04.2007, 20:50
Hi Leute,

keine Ahnung ob man in Bascom direkt höhere Baudraten als 115200 angeben kann.

Aber das ganze Problem löst sich schnell mit dem Blick ins Datenblatt der ATmegas auf. Dort gibt es Tabellen wieviel Baud bei welchem Quarz mit wieviel % Abweichung machbar sind.

Einfach alles wie gehabt machen und dann das entsprechende Register von Hand setzen.

Ich Programmiere gerade etwas und der Defaultwert ist 19200. Ich kann per Befehl an die Schaltung die Baudrate ändern, das mache ich direkt mit zugriff auf das Register. Klappt Problemlos.

Und von der Codegröße her nur ein paar Byte.

Gruß Dnerb