Archiv verlassen und diese Seite im Standarddesign anzeigen : Baudratenerkennung mit Bascom?
Alex20q90
07.08.2007, 14:44
Hallo,
ich habe hier ein Problem. Angenommen ich habe einen AVR (z.b. Mega8) und nutze den internen RC-Oszillator welcher bekanntlich nicht gerade präzise ist. Nun nehme ich einen zweiten Mega8 auch mit einem internen RC.
So und nun hab ich ein Problem. Datenübertragung via Rxd/TxD kann ich nun vergessen. Ich nutz die Software-UART mit Open "COM:19200,8,N,1" For Output As #1 . Beim Empfänger muss ich dann sowas wie 18225,8,N,1 eingeben das er es erkennt. Die Werte sind nur Beispiele!
Gibt es eine Möglichkeit des Autobauding? Mit der Software-UART ist es ja auch Möglich einen Speed von z.b. 2355 anzugeben, und ich möchte meinen Slave auf den Speed sich anpassen lassen. Wie mach ich das am besten?
Grüße
Alex
Ich habe leider keine Antwort auf deine eigentliche Frage, aber wenn du schon weisst, dass die Taktfrequenz deiner controller wegen Verwendung der internen Oscillatoren recht ungenau ist, finde ich eine Baudrate von 19200 ziemlich hoch angesetzt. Hast du es mal mit niedrigeren Werten versucht?
peterfido
07.08.2007, 19:14
Für die Kontaktaufnahme würde ich einen uC städnig einen bekannten String senden lassen. z.B. "VerstehstDu?" Jetzt auf dem anderen alle möglichen Baudraten durchgehen, bis er "VerstehstDu?" erkennt. Dabei muss natürlich berücksichtigt werden, dass der String gerade mittendrin ist. Wenn also ein "stDu?Versteh" ankommt, stimmt die Baudrate auch. Wenn er dann die Baudrate gefunden hat, ein "JoVerstehe!" senden, damit dieser weiß: "Communication Etablished"> weitermachen.
Alex20q90
07.08.2007, 19:23
Für die Kontaktaufnahme würde ich einen uC städnig einen bekannten String senden lassen. z.B. "VerstehstDu?" Jetzt auf dem anderen alle möglichen Baudraten durchgehen, bis er "VerstehstDu?" erkennt. Dabei muss natürlich berücksichtigt werden, dass der String gerade mittendrin ist. Wenn also ein "stDu?Versteh" ankommt, stimmt die Baudrate auch. Wenn er dann die Baudrate gefunden hat, ein "JoVerstehe!" senden, damit dieser weiß: "Communication Etablished"> weitermachen.
Hmm, die Idee ist eigendlich garnicht schlecht! Würde aber bedeuten das ich zum Synchronisieren immer einen bekannten String senden muss. Wenn ich aber nur 2 Bytes habe (1.Byte für die Adresse z.b. Lichtschalter, 2.Byte Helligkeit) wirds schwierig. Wie funktioniert das Autobauding eigendlich bei Modems?
Ich hab schon überlegt die Signallänge (start,Stopbit) auszuwerten und auf die Baudrate zurückzurechnen. Abere ich hab noch kein Plan.
peterfido
07.08.2007, 20:06
Naja bei nur 2 Bytes würde ich einfach die Geschwindigkeit runterschrauben, dann stört die Abweichung nicht mehr.
Alex20q90
07.08.2007, 20:16
Naja bei nur 2 Bytes würde ich einfach die Geschwindigkeit runterschrauben, dann stört die Abweichung nicht mehr.
Schon klar, aber wass wenn ich den Speed nicht kenn?
Wie funktioniert das Autobauding eigendlich bei Modems?
Keine Ahnung, wie das bei Modems funktioniert. Bei Modems gibt es mit 1200, 2400, 4800, 9600, 19200 und 38400 wesentlich weniger Möglichkeiten, als wenn du auch mit allen "krummen" Werten dazwischen arbeiten willst.
Ich weiss auch nicht, ob eine Baudratenerkennung überhaupt ans Ziel führt. Das dürfte nur funktionieren, wenn die internen Oszilatoren deiner Controller einen konstanten Fehler haben. Wenn deren Frequenz während der Übertragung schwankt, dürfte es nicht viel bringen vor der Übertragung die maximale Baudrate zu ermitteln.
Naja bei nur 2 Bytes würde ich einfach die Geschwindigkeit runterschrauben, dann stört die Abweichung nicht mehr.
Schon klar, aber wass wenn ich den Speed nicht kenn?
Ich vermute mal peterfido meinte damit, dass du mit einer bekannten Baudrate arbeiten sollst, die aber so weit heruntersetzt, dass die Ungenauigkeit der Oszilatoren nicht stört.
Die Ungenauigkeit der Oszilatoren wirkt sich bei 1200 Baud wesentlich weniger aus als bei 19200.
2 Byte von vornerein mit 1200 Baud zu übertragen dürfte wesentlich schneller gehen, als vor jeder Übertragung erst irgendeine Baudratenerkennung durchzuführen.
roboterheld
08.08.2007, 10:54
Angenommen ich habe einen AVR (z.b. Mega8) und nutze den internen RC-Oszillator welcher bekanntlich nicht gerade präzise ist. Nun nehme ich einen zweiten Mega8 auch mit einem internen RC.
sag mal spielst du hier eine trockene übung oder was?
du schreibst oben "Angenommen...", also hast du diese sache überhaupt noch garnicht getestet in der praxis.
mfg
Alex20q90
08.08.2007, 18:17
Ok, ich merke ohne "echte" Beispiele klappt das nicht so ganz.
Ich habe hier ein paar Bus-Schalter (OEM-Kein Hersteller). Diese senden in einer mir nicht bekannten Datenrate. Bekannt ist das es Seriell ist (8,N,1) uC ist ein ATMega8 ohne Quarz.
Die Daten scheinen zwischen 2400Bit/s zu laufen kann aber auch 9600 sein. Da die uC bei 9600 garnicht 9600 machen (wegen dem RC) wird da irgendwo ne Hausnummer an Speed sein. Da die Schalter (und der Empfänger) aber funzen muss es doch ein Autobauding geben. Wie das mit BASCOM zu realisieren ist, würde mich interessieren.
Grüße
Alex
Baudratenerkennung klappt meiner Meinung nach nur im festen Testdialog.
Wenn nur zwei Bytes übertragen werden kann die Sache doch nicht so schwer sein.
Grundsätzlich würde ich Deiner Lausch CPU einen Externen Quarz verpassen.
Es reicht wenn einer 'krumm' läuft.
Da wohl die Sendende CPU keine Uhr zum 'Krüpten' der Baudrate hat , sollte der Input 'wenn' die Baudrate geändert wird in den 2 Bytes liegen.
Ich würde folgend vorgehen:
Mit dem Scope die Flanken betrachten , ob sich die '0'+'1' dramatisch ändert.
Zwei CPU's lauschen lassen am RS232 Port ,mit zwei angepasten Baudraten.
Dann sollte ein Schema erkennbar sein.
Viel Glück dabei.
Gento
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.