So lesen Sie serielle Daten vom Oszilloskop

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

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

Erstes Bild Geben Sie hier die Bildbeschreibung ein

Zweites Bild Geben Sie hier die Bildbeschreibung ein

Meine Frage ist also, habe ich die richtigen Daten auf meinem Oszilloskop erfasst und zweitens, wie man diese Impulse lesen und in ein Hex- oder ASCII-Format decodieren kann. Ich meine, wie man diese steigenden und fallenden Impulse (0/1) liest.

Danke.

serielle Leitungen im Leerlauf im logischen '1'-Zustand, also seien Sie sich bewusst, dass Sie hier 1 unten und 0 oben haben. Ich weiß, dass sich die Leute bereits darauf festgelegt haben. Mein Kommentar dient dem Zweck, zukünftige Scope-Grabs von seriellen Daten zu leiten; Sie können die Dinge so prüfen, dass der Ruhezustand hoch ist.

Antworten (3)

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

Geben Sie hier die Bildbeschreibung ein

Keine Sorge, wir werden sehen, dass wir es auch so lesen können. Wir müssen uns nur daran erinnern, dass auf dem Oszilloskop ein Startbit a 1und das Stoppbit sein wird 0.

Als nächstes haben Sie die falsche Zeitbasis, um dies richtig zu lesen. 9600 Bit pro Sekunde (geeignetere Einheiten als Baud, obwohl letzteres per se nicht falsch ist) ist 104 μ s pro Bit, was in Ihrer aktuellen Einstellung 1/10 einer Division entspricht. Zoomen Sie hinein und setzen Sie einen vertikalen Cursor auf die erste Kante. Das ist der Beginn Ihres Startbits. Bewegen Sie den zweiten Cursor zu jeder der nächsten Kanten. Die Differenz zwischen den Cursorn sollte ein Vielfaches von 104 sein μ s. Jeweils 104 μ s ist ein Bit, zuerst das Startbit ( 1), dann 8 Datenbits, Gesamtzeit 832 μ s und ein Stoppbit ( 0).

Es sieht nicht so aus, als ob die Bildschirmdaten mit den gesendeten übereinstimmen 0x00. Sie sollten ein schmales 1Bit (das Startbit) sehen, gefolgt von einem längeren niedrigen Pegel (936 μ s, 8 Null-Datenbits + ein Stoppbit).
Gleiches gilt für das 0xFF, was Sie senden. Sie sollten ein langes hohes Niveau sehen (wieder 936 μ s, diesmal das Startbit + 8 Datenbits). Das sollte also fast 1 Division mit Ihrer aktuellen Einstellung sein, aber das ist nicht das, was ich sehe.
Es sieht eher so aus, als würden Sie im ersten Screenshot zwei Bytes senden und im zweiten vier, wobei das 2. und 3. den gleichen Wert haben.

Schätzungen:

0b11001111 = 0xCF
0b11110010 = 0xF2

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

edit
Olin hat vollkommen recht, das ist sowas 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 richtig ist.


Bearbeiten 2 (wie ich die Daten interpretiere, auf vielfachen Wunsch :-))
Warnung: Dies ist eine lange Geschichte, da es eine Niederschrift dessen ist, was in meinem Kopf passiert, wenn ich versuche, so etwas zu entschlüsseln. Lesen Sie es nur, wenn Sie einen Weg lernen möchten, es anzugehen.

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

Wir kennen jetzt die Breite eines Einzelbits, eines Doppelbits und einer 4-Bit-Folge und schauen uns das erste Byte an. Die erste High-Periode (der breite Impuls) ist etwas breiter als die 1111im zweiten Byte, so dass sie 5 Bit breit ist. Die darauf folgende Low- und High-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, also wenn unsere Schätzung richtig ist, können wir die Datenbits wieder umkehren: 11001111= 0xCF.

Dann bekamen wir einen Hinweis von Olin. Die erste Kommunikation ist 2 Byte lang, 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. Toll, das wird die doppelte "5". Uns geht es gut! (Sie müssen sich von Zeit zu Zeit Mut machen.) Nachdem ich die "0", "2" und "5" entschlüsselt habe, bemerke ich, dass zwischen den Codes für die ersten beiden ein Unterschied von 2 und zwischen den letzten ein Unterschied von 3 besteht zwei. Und schließlich bemerke ich, dass dies 0xC_das Komplement von 0x3_ist, das das Muster für Ziffern in ASCII ist.

Vielen Dank für Tipps, ich werde versuchen, die richtige Wellenform zu erfassen und meine Frage zu aktualisieren.
Danke. Würde es Ihnen etwas ausmachen, das Bild so zu markieren, wie Sie diese Daten finden?
@ Sean87 - Es ist eine lange Geschichte geworden, ich habe sie meiner Antwort hinzugefügt. Es veranschaulicht meine Art, dies zu tun, andere mögen andere Wege gehen. Machen Sie sich keine Sorgen, wenn Sie denken, Sie hätten nicht die Hälfte davon gesehen; Das meiste davon ist nur Erfahrung und Vorstellungskraft. Es ist keine besondere Intelligenz beteiligt.
Sehr schöne Antworten und Frage, aber ich frage mich, warum Sie gesagt haben, dass das Oszilloskop das Gegenteil von dem zeigt, was tatsächlich ist. Ich weiß, dass die Leerlaufleitung fast immer hoch ist, aber soll das Oszilloskop nicht ein genaues Bild der Realität erfassen? Außer wenn der Benutzer einen Parameter der Oszilloskopeinstellungen geändert hat.

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

Um diese Daten letztendlich in einen PC zu bekommen, müssen sie auf RS-232-Pegel konvertiert werden. Das erwartet ein PC-COM-Port. RS-232 ist im Leerlauf niedrig und aktiv hoch, aber niedrig liegt unter -5 V und hoch über +5 V. Glücklicherweise gibt es dafür Chips, die es einfach machen, zwischen UART-Signalen mit typischem Mikrocontroller-Logikpegel und RS-232 umzuwandeln. Diese Chips enthalten Ladungspumpen, um die RS-232-Spannungen aus Ihrer 3,3-V-Stromversorgung 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-Strom verwenden, nicht 5 V. Wir stellen ein Produkt her, das im Grunde einer dieser Chips auf einer Platine mit Anschlüssen ist. Gehen Sie zu http://www.embedinc.com/products/rslink2und schauen Sie sich den Schaltplan an, um ein Beispiel zu sehen, wie man einen solchen Chip anschließt.

Eine andere Sache, die nicht zusammenpasst, 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 die 8 Datenbits, dann ein Stoppbit. Das Startbit hat immer die entgegengesetzte Polarität zum Leitungsruhepegel. In den meisten Beschreibungen wird der Leitungsruhepegel als "Leerzeichen" und das Gegenteil als "Markierung" bezeichnet. Das Startbit ist also immer auf Marke. Der Zweck des Startbits besteht darin, die verbleibenden Bits zeitlich zu synchronisieren. Da beide Seiten wissen, wie lang ein Bit ist, stellt sich nur die Frage, wann ein Byte beginnt. Das Startbit liefert diese Information. Der Empfänger startet im Wesentlichen eine Uhr an der Vorderflanke des Startbits und verwendet diese, um zu wissen, wann die Datenbits kommen werden.

Die Datenbits werden von der kleinsten zur höchstwertigen Reihenfolge gesendet, wobei Markierung 1 und Leerzeichen 0 ist. Ein Stoppbit auf der Leerzeichenebene wird hinzugefügt, damit der Beginn des nächsten Startbits eine neue Flanke ist, und um etwas Zeit zu lassen zwischen Byte. Dies ermöglicht einen kleinen Fehler zwischen Sender und Empfänger. Wenn der Empfänger auch nur geringfügig langsamer als der Sender wäre, würde er sonst den Beginn des nächsten Startbits verpassen. Der Empfänger setzt seine Uhr bei jedem neuen Startbit zurück und startet sie neu, um Zeitfehler nicht zu akkumulieren.

Aus all dem sollten Sie also erkennen können, dass die erste Spur mindestens zwei Bytes zu senden scheint und die letzte wie vielleicht 5 aussieht.

Es wäre hilfreich, wenn Sie die Zeitskala der Spuren erweitern würden. So konnte man 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 einer Aufnahme decodieren. So wie es jetzt ist, gibt es nicht genug Auflösung, um zu sehen, wo sich die Bits befinden, und daher tatsächlich zu decodieren, was gesendet wird.

Hinzugefügt:

Mir ist gerade aufgefallen, dass Ihr System die Daten möglicherweise in ASCII statt in binär sendet. So wird es im Allgemeinen nicht gemacht, da die Konvertierung in ASCII in dem kleinen System mehr der begrenzten Ressourcen beansprucht, die Bandbreite schlecht nutzt und es einfach ist, die Konvertierung auf dem PC durchzuführen, wenn Sie die Daten einem Benutzer anzeigen möchten. Wenn Ihre Übertragungen jedoch ASCII-Zeichen sind, würde dies erklären, warum die Sequenzen mehr als ein Byte umfassen, warum die zweite länger ist ("255" sind mehr Zeichen als "0") und warum beide im selben Byte zu enden scheinen. 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 entschlüsseln, was gesendet wird.

Das Stoppbit (und es ist das Gegenteil des Startbits) erzwingt auch eine Flanke am Beginn einer neuen Übertragung.
@steven: Ja, mir ist aufgefallen, dass ich das beim erneuten Lesen meiner Antwort ausgelassen und in einer Bearbeitung hinzugefügt habe, wahrscheinlich zur gleichen Zeit, als Sie Ihren Kommentar geschrieben haben.
Was sagen sie? Große Köpfe denken ähnlich? :-)
Obwohl das Senden von ASCII "ineffizient" ist, kann es dennoch eine sehr gute Wahl sein. Die meisten meiner eingebetteten Systeme senden nicht nur ASCII, sie empfangen auch ASCII-Befehle, wodurch es möglich ist, manuell zu experimentieren, indem man mit ihnen von einem Terminalprogramm aus "ein Gespräch führt". Der SCPI-Standard (eine Art Verbesserung von GPIB, erweitert auf andere elektrische Schnittstellen) ist eine sehr formale Methode, die in diese Richtung funktioniert.
@Chris: Juhu. ASCII ist ein Schmerz für ein kleines System. Vielleicht sind Ihre größeren eingebetteten Systeme, auf denen ein Betriebssystem ausgeführt wird, aber auf kleinen Mikros ist ASCII eine große Verschwendung und Unannehmlichkeit. Ja, ich verstehe, dass Sie mit Hyperterm oder ähnlichem direkt damit sprechen können, aber normalerweise erstellen wir ein Testprogramm, das auf dem PC ausgeführt wird und eine Befehlszeilenschnittstelle für das Low-Level-Binärprotokoll bereitstellt. Das schiebt die Umwandlung in flauschige Benutzereinheiten auf den PC, wo sie hingehört, insbesondere wenn Ihr kleines System irgendwann mit einem anderen kleinen System kommunizieren muss.
Ich werde stark widersprechen. Ascii benötigt so eine winzige Menge an Code, selbst wenn Bare Metal auf einem kleinen 8-Bit ausgeführt wird. Sicher, Sie können ein benutzerdefiniertes Programm schreiben, aber was passiert in 10 Jahren, wenn das verloren ist und es eine virtuelle Maschine brauchen würde, um es auszuführen, selbst wenn es gefunden werden könnte? Und sicher, jeder Programmierer, der sein Geld wert ist, kann ein binäres Terminal hacken, um etwas zurückzuentwickeln. Aber von Menschen lesbare Schnittstellen sind den geringen Overhead in den meisten, aber den am stärksten speicherbegrenzten und leistungskritischen Systemen wert. Und wenn Sie genug Speicher haben, können Sie die Debug-Ausgabe mit einem Ein/Aus einbetten.
Ich sollte erwähnen, dass ich mit den ASCII-Schnittstellen begonnen habe, weil es eine Kundenanforderung war ... aber ich habe sie behalten, weil sie so nützlich sind. Ich könnte eine Idee als Befehl in die Firmware einfügen und dann irgendwo in der Anlage testen. Ohne jedes Mal ein Update für den Konfigurationsclient bereitstellen zu müssen, wenn ich eine experimentelle Firmware-Version mit Extras veröffentlichte, um ein Problem zu untersuchen, das jemand in einem komplizierten System hatte, von dem es nur ein Modul war. Am Telefon mit einem Kunden könnte ich ihn ein Terminal starten lassen und ihn mit unveröffentlichten Werkstestfunktionen durchgehen lassen.
Wie ich aus dem PICAXE 20X2-Datenblatt verstanden habe, verwendet es eine weiche RS232-Kommunikation. Ich bin mir nicht sicher, wie es funktioniert, aber ich kann ASCII an den Chip senden und auch Daten kommen als ASCII heraus. Dieser Chip hat auch zwei serielle HARDWARE-Pins, die "hserout" und "hserin" sind. Ich denke, wenn ich sie verwenden will, muss ich so etwas wie MAX232 verwenden. Ich denke, wie die meisten von Ihnen sagten, erfasste mein Oszilloskop ASCII-Daten. Ich hatte noch keine Zeit, die vorgeschlagenen Timings auf dem Oszilloskop zu verwenden. Aber es ist nicht möglich, den ASCII-Code nur aus den obigen Bildern zu decodieren? Danke.

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

Wenn das Rigol-Oszilloskop keine serielle Dekodierungsoption hat (viele DSOs haben sie), können Sie X-Cursor verwenden, um die Dekodierung zu unterstützen. Platzieren Sie den ersten Cursor an der Vorderkante der Daten und bewegen Sie den zweiten Cursor durch den Bitstrom. Das Delta zwischen den Cursors kann verwendet werden, um durch einfache Arithmetik zu bestimmen, über welchem ​​'Bit' Sie gerade schweben. Ignorieren Sie natürlich Start-/Stopp-/Paritätsbits.

Es gibt immer ein Startbit und immer mindestens ein Stoppbit. Es kann zusätzliche Stoppbits geben, aber diese sind nicht von der Totzeit zwischen Bytes zu unterscheiden. Alte mechanische Decoder benötigten manchmal zwei Stoppbits, damit der Mechanismus Zeit zum Zurücksetzen hatte. Heutzutage gibt es fast immer 8 Datenbits und kein Paritätsbit, aber wie Sie sagen, das kann variieren.