Hi, ich möchte eine automatische Baudratenerkennung bei 8,N,1 mit einem 8052-kompatiblen µC realisieren. Ich habe schon einige Links dazu gefunden, aber ich dachte ich frag trotzdem mal: 1. Welche Voraussetzungen müssen erfüllt sein? Ich denke, ein Systemquarz, mit dem sich die Baudraten einfach und genau generieren lassen, also 11,0592 bzw. 22,1184 MHz. Sonst fehlt ja nichts weiter, oder? 2. Auf welche Art die Erkennung durchführen? Einfachste Lösung ist mit einem festen Zeichen, vorzugsweise 'U', da man hier abwechselnd 0 und 1 hat, und damit die Einzelbit-Zeit messen kann (Ausnahme: Stopbit und erste 0 = 2x 0). Mir wäre allerdings lieber, die Erkennung unabhängig vom ersten gesendeten Zeichen durchführen zu können, aber das wird wohl (wenn überhaupt möglich) ziemlich schwierig. 3. Wenn mit einem festen Zeichen (also 'U') gearbeitet wird, wie kann ich erkennen, ob fälschlicherweise ein anderes Zeichen empfangen wurde? Geht eigentlich nur, wenn ich während den einzelnen Bits eine Zeitschleife mitlaufen lasse. Diese muss länger dauern, als die größtmögliche Bitzeit. Wenn die Schleife auf 0 läuft, ohne dass sich der Rx-Pin ändert, so wird nicht das Erwartete empfangen. Könnte so klappen, oder? Gruß Ralf
Hallo Ralf, wuerde ein anderes Zeichen als "U" empfehlen weil es besser ist die bitzeiten ueber mehrere bits zu messen und dann auszurechnen, kleinerer Fehler. Solltest du ein binares Interface haben, dann wuerde ich evtl. sogar eine Bin 0 senden, gibt dir maximale Genauigkeit beim Errechnen der Baudrate. Fuer den Quartz kommst darauf an wie schnell du kommunizieren willst. Manchmal soll derselbe Prozessor ja noch andere Zeiten realisieren, die viel besser mit 12 MHz oder so was machbar sind. Das geht auch, nur die 115200 sind dann mit den meistens nicht mehr moeglich. Falls dein Interface immer ein PC ist und die Taktrate auf deinem 51er bekannt ist, dann ist die einfachste Loesung eine Tabelle. Die Zeit eines oder mehrerer bits messen und dann vergelichen welcher Wert in der Tabelle am naechsten kommt. So ein Algorithmus wuerde auch funktionieren mit beliebigen Zeichen am Anfang wenn die Synchronisation nicht sehr zeitkritisch ist. Die minimalen Pulslaengen ueber mehrere Zeichen messen und dann darauf schliessen, dass die kuerzeste Zeit einer Bitlaenge entspricht. Geht am besten wenn der Prozessor einen Capture Eingang hat. Zeit messen, falls kleiner als bisher gespeicherter Wert, neuern Wert speichern, ansonsten ab in den Muell. Kleinster Wert nach mehreren Zeichen = Bitlaenge. Weiss natuerlich nicht was fuer ein Prozessor angedacht ist, welcher 51-er, kann dir nur sagen, dass mit den LPC900 von Philips da alles mit dem internen Oszillator moeglich ist, der laeuft auf 7.373 MHz und weil das ein core ist der den Befehl in 2 Zyklen abarbeitet ist er trotzdem deutlich schneller als ein Standard 51-er bei 11.059 oder 22.1184. Gruss, Robert
Beim MCS Basic wird das ganze durch Ausmessen einen Space Zeichens bewerkstelligt und daraus dann der Timer2 eingestellt. Gruß Thomas
Erstmal danke für die Antworten. @Robert: Du hast weitestgehend die Applikation getroffen (hab also doch vergessen, wichtige Sachen zu erwähnen): Wie du vermutet hast, die Gegenstelle ist zu 98% immer ein PC. Die Sache sollte in der Lage sein, 115200 noch zu erkennen. Ich verwende sowieso immer 22,1184 MHz-Quarze, eben weil ich z.T. mit 115200 arbeiten, das bekommt man mit Timer noch hin. Wegen den Zeiten, für die ein "gerader" Quarz besser wäre, da arbeite ich mit einem Timer-Interrupt, der einen Software-Vorteiler hat, das ist also auch kein Problem, auf gerade Zeiten zu kommen, ausser man braucht SEHR kurze Zeiten. Das ganze ist für einen Standard-8051er (bzw. 8052 --> AT89S52/53/8252). Irgendwann erfolgt vielleicht mal ein Sprung auf Silabs C8051F120. Okay, ein anderes Zeichen tut nicht weh, dann wär es halt schön, bereits nach dem ersten Zeichen die Baudrate erkennen zu können, egal, welches Zeichen das war. Absoluter Luxus wäre wahrscheinlich, wenn das erste Zeichen auch noch erkannt wird. @Thomas: Das ist auch nicht schlecht, bei einem Space hat man mit Start-Bit vier Nullen, eine Eins, und fünf Nullen. Das könnte auch gut klappen... Ralf
So, hab mir jetzt mal Gedanken gemacht. Dummerweise kamen mit den Gedanken gleich noch ein paar Fragen. Welche Baudraten lohnt es überhaupt zu erkennen, also was sind die häufigsten Baudraten? Ich denke, 9600, 19200, 57600 und 115200 Baud auf alle Fälle... Aber was ist mit 1200, 2400, 4800 und 38400 Baud? Werden die heutzutage überhaupt noch verwendet und wenn ja, wo? Und dann hab ich noch ein kleines Problem: Wenn ich den Ansatz verfolge, dass ich anhand beliebiger Zeichen das Zeichen an sich und die Baudrate erkennen möchte, dann habe ich das Problem, dass sich insgesamt neun Zeichen nicht einwandfrei erkennen lassen: 0x00, 0x01, 0x03, 0x07, 0x0F, 0x1F, 0x3F, 0x7F, 0xFF Das liegt daran, dass nur eine 0-Phase auftritt. Die folgenden Einsen könnten bereits als Stopbit interpretiert werden. Das bedeutet, dass zum Beispiel das Zeichen 0xFF bei 57600 Baud auch als 0x7F bei 115200 Baud interpretiert werden könnte. Hat da jemand einen Lösungsansatz dafür? Die einzige Lösung, die ich gefunden habe, ist dass man entweder: - die zuerst erkannte Baudrate akzeptiert - oder mehrere Erkennungsversuche startet. Liefern z.B. zwei von drei Versuchen das gleiche Ergebnis, so ist die Baudrate erkannt. Ralf
Ich benutze 0x0D (Entertaste) zur Erkennung. Ich messe 2 aufeinanderfolgende Low-Pulse aus und vergleiche sie dann, ob der 2. etwa 4* so lang war, wie der erste. Und dann nehme ich die 4* Zeit zur Berechnung der Baudrate, damit der Fehler möglichst gering ist. Das ist ziemlich sicher gegen Fehlerkennung und ich weiß dann auch genau, wann das nächste Zeichen beginnt. In meinem Bootloader sendet z.B. der PC ständig ein Kommando, welches mit Enter abgeschlossen ist, bis der MC antwortet. Damit funktioniert der Bootloader auch bei MCs mit RC-Oszillator. @Robert, "Manchmal soll derselbe Prozessor ja noch andere Zeiten realisieren, die viel besser mit 12 MHz oder so was machbar sind." Ich wüßte jetzt keine Anwendung, wo das der Fall wäre. Peter
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.