So lesen Sie serielle Daten vom Oszilloskop

21

Ich habe einen Mikrocontroller (PICAXE 20X2) und einen Potenziometer. Ich habe das Mikro so programmiert, dass es jede Änderung des Potenziometers an die serielle Schnittstelle des PCs sendet. Offensichtlich handelt es sich um einen 8-Bit-ADC. Das Interessante für mich ist nun, diese seriellen Daten auf dem Oszilloskop dekodieren zu können.

Hier sind zwei Bilder, das erste ist, wenn das Mikro "0" an den PC sendet, und das nächste ist, wenn es "255" sendet. Die Daten werden mit 9600 buad übertragen und ich kann sie am PC-Terminal empfangen.

Erstes Bild Bildbeschreibung hier eingeben

Zweites Bild Bildbeschreibung hier eingeben

Meine Frage ist also, habe ich die richtigen Daten für mein Oszilloskop erfasst und zweitens, wie man diese Impulse lesen und in ein Hex- oder ASCII-Format decodieren kann. Ich meine, wie man diese ansteigenden und abfallenden Impulse (0/1) liest.

Vielen Dank.

Sean87
quelle
3
Die seriellen Leitungen sind im logischen '1'-Zustand inaktiv. Beachten Sie also, dass Sie 1 unten und 0 oben haben. Ich weiß, dass die Leute sich schon darauf eingestellt haben. Mein Kommentar dient dem Zweck, die zukünftige Erfassung von seriellen Daten zu steuern. Sie können Dinge untersuchen, so dass der Ruhezustand hoch ist.
JustJeff

Antworten:

14

Als erstes bemerkte auch Olin: Die Pegel sind die Umkehrung dessen, was ein Mikrocontroller normalerweise ausgibt:

Bildbeschreibung hier eingeben

Keine Sorge, wir werden sehen, dass wir es auch so lesen können. Wir müssen uns nur daran erinnern, dass ein Startbit ein 1Stoppbit ist 0.

μμμ1μ0

0x001μ
0xFFμ

Schätzungen:

0b11001111 = 0xCF
0b11110010 = 0xF2

0b11001101 = 0xCD
0b11001010 = 0xCA
0b11001010 = 0xCA
0b11110010 = 0xF2

edit
Olin hat absolut recht, das ist so etwas wie ASCII. Tatsächlich ist es das 1er-Komplement von ASCII.

0xCF ~ 0x30 = '0'
0xCE ~ 0x31 = '1'
0xCD ~ 0x32 = '2'
0xCC ~ 0x33 = '3'
0xCB ~ 0x34 = '4'
0xCA ~ 0x35 = '5'

0xF2 ~ 0x0D = [CR]

Dies bestätigt, dass meine Interpretation der Screenshots korrekt ist.


edit 2 (wie ich die Daten interpretiere, auf vielfachen Wunsch :-))
Warnung: Dies ist eine lange Geschichte, da es sich um eine Abschrift dessen handelt, was in meinem Kopf passiert, wenn ich versuche, so etwas zu entschlüsseln. Lesen Sie es nur, wenn Sie lernen möchten, wie Sie es angehen können.

Beispiel: Das zweite Byte im ersten Screenshot, beginnend mit den 2 schmalen Impulsen. Ich beginne absichtlich mit dem zweiten Byte, da es mehr Kanten als im ersten Byte gibt, so dass es einfacher ist, es richtig zu machen. Jeder der schmalen Impulse ist ungefähr 1/10 einer Division, so dass jeder 1 Bit hoch sein kann, wobei ein niedriges Bit dazwischen liegt. Ich sehe auch nichts Engeres als dieses, also denke ich, dass es ein einzelnes bisschen ist. Das ist unsere Referenz.
Dann, nachdem 101es eine längere Zeit auf niedrigem Niveau gibt. Sieht ungefähr doppelt so breit aus wie die vorherigen, das könnte also sein 00. Die hohe Fangemeinde ist also nochmal doppelt so breit, also wird das sein 1111. Wir haben jetzt 9 Bits: ein Startbit ( 1) plus 8 Datenbits. Das nächste Bit wird also das Stoppbit sein, aber weil es es ist0es ist nicht sofort sichtbar. Wir haben also alles zusammengestellt 1010011110, einschließlich Start- und Stoppbit. Wenn das Stoppbit nicht Null wäre, hätte ich irgendwo eine schlechte Annahme gemacht!
Denken Sie daran, dass ein UART zuerst das niedrigstwertige Bit (LSB) sendet, sodass wir die 8 Datenbits umkehren müssen: 11110010= 0xF2.

Wir kennen jetzt die Breite eines Einzelbits, eines Doppelbits und einer 4-Bit-Sequenz und schauen uns das erste Byte an. Die erste hohe Periode (der breite Impuls) ist etwas breiter als die 1111im zweiten Byte, so dass sie 5 Bits breit ist. Die darauf folgende niedrige und die hohe Periode sind jeweils so breit wie das Doppelbit im anderen Byte, also erhalten wir 111110011. Wieder 9 Bits, also sollte das nächste ein niedriges Bit sein, das Stoppbit. Das ist in Ordnung. Wenn unsere Einschätzung korrekt ist, können wir die Datenbits wieder umkehren: 11001111= 0xCF.

Dann haben wir einen Hinweis von Olin bekommen. Die erste Kommunikation ist 2 Byte lang und 2 Byte kürzer als die zweite. Und "0" ist auch 2 Bytes kürzer als "255". Es ist also wahrscheinlich so etwas wie ASCII, wenn auch nicht genau. Ich stelle auch fest, dass das zweite und dritte Byte der "255" gleich sind. Großartig, das wird die doppelte "5" sein. Uns geht es gut! (Sie müssen sich von Zeit zu Zeit selbst ermutigen.) Nach dem Entschlüsseln der "0", "2" und "5" stelle ich fest, dass zwischen den Codes für die ersten beiden ein Unterschied von 2 und zwischen dem letzten ein Unterschied von 3 besteht zwei. Und schließlich bemerke ich, dass dies 0xC_das Komplement von ist 0x3_, das das Muster für Ziffern in ASCII ist.

stevenvh
quelle
Vielen Dank für Tipps, ich werde versuchen, die richtige Wellenform zu erfassen und meine Frage zu aktualisieren.
Sean87
Danke. Würde es Ihnen etwas ausmachen, das Bild so zu markieren, wie Sie diese Daten finden?
Sean87
1
@ Sean87 - Es ist eine lange Geschichte geworden, ich habe sie zu meiner Antwort hinzugefügt. Es zeigt, wie ich das mache, andere folgen möglicherweise anderen Pfaden. Mach dir keine Sorgen, wenn du denkst, du hättest nicht die Hälfte davon gesehen; Das meiste ist nur Erfahrung und Vorstellungskraft. Es gibt keine spezielle Intelligenz.
stevenvh
Sehr nette Antworten und Fragen, aber ich frage mich, warum Sie gesagt haben, dass das Oszilloskop die Umkehrung von dem anzeigt, was tatsächlich ist. Ich weiß, dass die Leerlauflinie fast immer hoch ist, aber soll das Oszilloskop nicht ein genaues Bild der Realität aufnehmen? Es sei denn, der Benutzer hat einen Parameter in den Einstellungen des Oszilloskops geändert.
Nikos
7

Etwas passt nicht zusammen. Ihre Signale scheinen von Spitze zu Spitze 3,3 V zu betragen, was bedeutet, dass sie direkt aus dem Mikro kommen. Die UART-Pegel der Mikrocontroller sind jedoch (fast) immer hoch und niedrig aktiv. Ihre Signale sind davon invertiert, was keinen Sinn ergibt.

Um diese Daten schließlich in einen PC zu übertragen, müssen sie in RS-232-Pegel konvertiert werden. Dies ist, was ein PC-COM-Port erwartet. RS-232 ist im Leerlauf niedrig und aktiv hoch, aber niedrig ist unter -5V und hoch ist über + 5V. Glücklicherweise gibt es dafür Chips, die es einfach machen, zwischen typischen UART-Signalen mit Mikrocontroller-Logikpegel und RS-232 zu konvertieren. Diese Chips enthalten Ladungspumpen, um die RS-232-Spannungen von Ihrem 3,3-V-Netzteil zu erzeugen. Manchmal werden diese Chips allgemein als "MAX232" bezeichnet, da dies eine Teilenummer für einen frühen und beliebten Chip dieses Typs war. Sie benötigen eine andere Variante, da Sie anscheinend 3,3 V und nicht 5 V verwenden. Wir stellen ein Produkt her, das im Grunde genommen einer dieser Chips auf einer Platine mit Steckverbindern ist. Gehen Sie zu http://www.embedinc.com/products/rslink2Schauen Sie sich den Schaltplan an, um ein Beispiel für den Anschluss eines solchen Chips zu sehen.

Eine andere Sache, die sich nicht summiert, ist, dass beide Sequenzen mehr als ein Byte zu sein scheinen, obwohl Sie sagen, dass Sie nur 0 und 255 senden. Diese Art von seriellen Daten wird mit einem Startbit gesendet, dann mit den 8 Datenbits. dann ein Stoppbit. Das Startbit hat immer die entgegengesetzte Polarität zum Leitungsleerlaufpegel. In den meisten Beschreibungen wird der Leitungsleerlaufpegel als "Leerzeichen" und das Gegenteil als "Marke" bezeichnet. Das Startbit ist also immer an der Marke. Der Zweck des Startbits besteht darin, die verbleibenden Bits zeitlich zu synchronisieren. Da beide Seiten wissen, wie lang ein Bit ist, ist die einzige Frage, wann der Anfang eines Bytes ist. Das Startbit liefert diese Information. Der Empfänger startet im Wesentlichen einen Takt an der Vorderflanke des Startbits und verwendet diesen, um zu wissen, wann die Datenbits kommen werden.

Die Datenbits werden in der niedrigstwertigen Reihenfolge gesendet, wobei die Markierung 1 und das Leerzeichen 0 sind. Ein Stoppbit auf der Leerzeichenebene wird hinzugefügt, damit der Start des nächsten Startbits eine neue Flanke ist, und um etwas Zeit zu lassen zwischen Bytes. Dies ermöglicht einen kleinen Fehler zwischen Sender und Empfänger. Wäre der Empfänger auch nur ein bisschen langsamer als der Sender, würde er sonst den Start des nächsten Startbits verpassen. Der Empfänger setzt jedes neue Startbit zurück und startet seine Uhr neu, damit sich keine Zeitfehler ansammeln.

An all dem sollte man also erkennen können, dass der erste Trace mindestens zwei Bytes sendet und der letzte wie vielleicht 5 aussieht.

Es wäre hilfreich, wenn Sie die Zeitskala der Spuren erweitern würden. Auf diese Weise können Sie messen, was ein bisschen Zeit wirklich ist. Auf diese Weise können Sie überprüfen, ob Sie wirklich 9600 Baud (104 µs / Bit) haben, und einzelne Bits eines Captures dekodieren. Derzeit gibt es nicht genügend Auflösung, um festzustellen, wo sich die Bits befinden, und decodieren daher tatsächlich, was gesendet wird.

Hinzugefügt:

Mir ist gerade eingefallen, dass Ihr System die Daten möglicherweise in ASCII anstelle von Binär sendet. Dies ist im Allgemeinen nicht der Fall, da die Konvertierung in ASCII in dem kleinen System weniger Ressourcen beansprucht, die Bandbreite nicht ausreicht und die Konvertierung auf dem PC einfach ist, wenn Sie die Daten einem Benutzer anzeigen möchten. Wenn Ihre Übertragungen jedoch ASCII-Zeichen sind, erklärt dies, warum die Sequenzen mehr als ein Byte umfassen, warum die zweite länger ist ("255" enthält mehr Zeichen als "0") und warum beide offenbar im selben Byte enden. Das letzte Byte ist wahrscheinlich eine Art Zeilenendezeichen, das normalerweise ein Wagenrücklauf oder ein Zeilenvorschub ist.

Wie auch immer, erweitern Sie die Zeitskala und wir können genau dekodieren, was gesendet wird.

Olin Lathrop
quelle
1
Das Stoppbit (und es ist dem Startbit entgegengesetzt) ​​erzwingt auch eine Flanke beim Start einer neuen Übertragung.
Stevenvh
@steven: Ja, mir ist aufgefallen, dass ich das weggelassen habe, als ich meine Antwort noch einmal gelesen und in einer Bearbeitung hinzugefügt habe, wahrscheinlich zur selben Zeit, als Sie Ihren Kommentar geschrieben haben.
Olin Lathrop
4
Obwohl das Senden von ASCII "ineffizient" ist, kann es dennoch eine sehr gute Wahl sein. Die meisten meiner eingebetteten Systeme senden nicht nur ASCII, sondern empfangen auch ASCII-Befehle, sodass Sie manuell experimentieren können, indem Sie von einem Terminalprogramm aus eine Unterhaltung mit ihnen führen. Der SCPI-Standard (eine Art Verbesserung von GPIB, erweitert auf andere elektrische Schnittstellen) ist eine sehr formale Methode, die in diesem Sinne funktioniert.
Chris Stratton
4
Gehen zu stark widersprechen. Ascii benötigt so wenig Code, dass er sogar Bare Metal auf einem kleinen 8-Bitter ausführt. Sicher, Sie können ein benutzerdefiniertes Programm schreiben, aber was passiert in 10 Jahren, wenn das verloren geht und eine virtuelle Maschine es ausführen müsste, selbst wenn es gefunden werden könnte? Und sicher, jeder Programmierer, der sein Geld wert ist, kann ein Binärterminal hacken, um etwas zurückzuentwickeln. Aber für Menschen lesbare Schnittstellen sind den geringen Aufwand in den meisten, aber am stärksten speicherbeschränkten und leistungskritischen Systemen wert. Wenn Sie über den Speicher verfügen, können Sie die Debug-Ausgabe mit einem Ein / Aus-Schalter einbetten.
Chris Stratton
2
Ich sollte erwähnen, dass ich mit den ASCII-Schnittstellen angefangen habe, da dies eine Kundenanforderung war ... aber ich habe sie behalten, weil sie nützlich sind. Ich könnte eine Idee als Befehl in die Firmware einfügen und sie dann an einer beliebigen Stelle in der Einrichtung testen.Ohne jedes Mal ein Update für den Konfigurations-Client bereitstellen zu müssen, wenn ich eine experimentelle Firmware-Version mit Extras zur Untersuchung eines Problems veröffentlichte, das in einem komplizierten System auftrat, bei dem es sich nur um ein Modul handelte. Am Telefon mit einem Kunden konnte ich sie ein Terminal starten lassen und sie mit unveröffentlichten Werkstestfunktionen durchlaufen lassen.
Chris Stratton
1

Sie müssen die vollständigen Details kennen: die Geschwindigkeit, wenn es ein Startbit gibt, die Anzahl der Datenbits, wenn es ein Stoppbit gibt und wenn es ein Paritätsbit gibt. Dies sollte davon abhängen, wie der UART im Mikrocontroller konfiguriert ist.

Wenn das Rigol-Oszilloskop keine serielle Dekodierungsoption hat (bei vielen DSOs ist dies der Fall), können Sie zur Unterstützung der Dekodierung X-Cursor verwenden. Platzieren Sie den ersten Cursor an der Vorderkante der Daten und bewegen Sie den zweiten Cursor durch den Bitstrom. Das Delta zwischen den Cursorn kann verwendet werden, um durch einfache Arithmetik zu bestimmen, über welches 'Bit' Sie gerade schweben. Offensichtlich Start / Stopp / Paritätsbits ignorieren.

Adam Lawrence
quelle
Es gibt immer ein Startbit und immer mindestens ein Stoppbit. Es kann zusätzliche Stoppbits geben, diese sind jedoch nicht von der Totzeit zwischen Bytes zu unterscheiden. Alte mechanische Decoder benötigten manchmal zwei Stoppbits, damit der Mechanismus zurückgesetzt werden konnte. Heutzutage gibt es fast immer 8 Datenbits und kein Paritätsbit, aber wie Sie sagen, das kann variieren.
Olin Lathrop