- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 5 von 5

Thema: UART Problem 115200 Baud

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    10.05.2006
    Beiträge
    18

    UART Problem 115200 Baud

    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.02.2005
    Ort
    Hamburg
    Alter
    37
    Beiträge
    4.255
    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.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    10.05.2006
    Beiträge
    18

    Höhere Baudraten wie 115200

    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

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    17.09.2005
    Beiträge
    276
    Es gab hier mal eine Datei mit DMX 250000 Baud.

    Dort waren aber große Teile in ASM.

    Gento

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    29.01.2005
    Alter
    51
    Beiträge
    294
    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
    Das Gegenteil von "gut" ist "gut gemeint"!

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen