www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Automatische Baudratenerkennung mit 8052


Autor: Ralf (Gast)
Datum:

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

Autor: Robert Teufel (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim MCS Basic wird das ganze durch Ausmessen einen Space Zeichens
bewerkstelligt und daraus dann der Timer2 eingestellt.
Gruß Thomas

Autor: Ralf (Gast)
Datum:

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

Autor: Ralf (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

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.