UART: Bitmuster erkennen

Moderator Persönliche Seite #7516823
Lesenswert?

He S. schrieb:

für die Detektion eines Startframes ( 1 Startframe hat 1 byte), möchte ich die Bitfolge 00 (EVEN Bit + STOP Bit) ermitteln.

Welche Baudrate? Wieviele Bits hat der gesamte Frame?

Wie kann sowas auf einem Mikrocontroller umgesetzt werden?

Um welchen Mikrocontroller handelt es sich?

Wenn der Mikrocontroller einen U(S)ART hat:

  • RX Pin an unbekanntes Gerät anschließen
  • Baudrate einstellen
  • Anzahl Bits einstellen
  • Parity Even einstellen
  • Stop Bit einstellen
  • Mittels U(S)ART-Funktion die Zeichen an RX einlesen.

Für das Einlesen eines Pins habe ich bereits eine Funktion.

Welche? Ist die für das oben geschilderte Prozedere geeignet? Welche Ergebnisse hat Du mit dieser Funktion erreicht? Bitte zeigen, bei längerem Code als Anhang bitte.

Beitrag #7516839 wurde von einem Moderator gelöscht.
Moderator Persönliche Seite #7516885
Lesenswert?

He S. schrieb:

Gpio_ReadPin

Der Name der Funktion, die dafür übrigens total ungeeignet ist, lässt auf einen STM32 schließen. Welchen benutzt Du?

In Deinem Programm fehlt die Initialisierung der Schnittstelle.

He S. schrieb:

Die USART habe so bereit sin Betrieb:

Nein, hast Du nicht. Ich sehe keine Initialisierung der Schnittstelle in Deiner main-Funktion.

He S. schrieb:

ich zeige hier keine Schaltpläne.

Kluge Idee. Das erhöht die Chancen auf verwertbare Antworten ungemein.

#7516944
Lesenswert?

He S. schrieb:

Eigentlich bräuchte ich eine Messeinheit, die mir ein bit detektieren kann.

He S. schrieb:

Die USART habe so bereit sin Betrieb:

He S. schrieb:

Ich habe in Problem mit dem Empfang vom Startframe. Ich habe in kurzes Zeitfenster in der der UART Nachricht empfangen werden können. Wenn aktiv, dann passiert es sehr oft, dass das Startframe oder Startbyte nicht korrekt empfangen wird.

Wenn Dein Uart läuft, warum nutzt Du den dann nicht.

Deine Begriffe und Dein Code sehen so aus, als wolltest Du den Start eines Bytes erkennen, also quasi nur die 1/0 (fallende) Flanke.

Dein Start-Byte (00) sieh am Portpin so aus: Dauerhaft 1 und nur für 9 Bit-Zyklen (78µs @ 115200 Baud oder 937µs @ 9600 Baud) 0.

1
______________________           ______________________ 
2
                      \_________/
3
                         78µs

Warum willst Du da irgendwas selber bauen? Das ist ziemliche Bastelei und erfordert seeehr viel Erfahrung.

#7516990
Lesenswert?

He S. schrieb:

Ich habe in kurzes Zeitfenster in der der UART Nachricht empfangen werden können. Wenn aktiv, dann passiert es sehr oft, dass das Startframe oder Startbyte nicht korrekt empfangen wird.

Dann hast Du ein Timingproblem in Deinem Programmablauf. Z.B. die UART wird zu spät enabled oder deren Puffer läuft über. Typisch wird die UART nach dem Reset einmalig enabled und bleibt es auch. Im UART-Interrupt werden dann alle Bytes in einen FIFO geschrieben und die Mainloop wertet sie aus. Zusätzlich kann man auch Parity-Error und Framing-Error auswerten.

#7517400
Lesenswert?

Wilhelm M. schrieb:

Weißt Du, was ein U(S)ART ist?

He S. schrieb:

Warum kommt jetzt diese Frage?

Weil es nicht den Eindruck macht, dass du das so genau weißt. Du sagst, dass du einen USART im Betrieb hast, fragst aber danach, wie man das, was eigentlich dessen Aufgabe ist, stattdessen selber macht.

He S. schrieb:

Eigentlich bräuchte ich eine Messeinheit, die mir ein bit detektieren kann.

#7517635
Lesenswert?

Eine Bitfolge detektiert man, indem man den Eingangspegel 0,5 Bitzeiten, 1,5 Bitzeiten, 2,5 Bitzeiten usw. nach eine Flanke abfragt. Zwei 0-Bits in Folge garantieren allerdings noch lange nicht, dass es sich dabei um ein EVEN und ein STOP-Bit handelt, so was kommt in einem Datenstrom häufig vor. Besser ist, man wartet auf eine Pause von mindestens 11 Bitzeiten, in denen keine Flanke auftritt, dann ist die nächste Flanke garantiert der Beginn eines START-Bits.

#7517646
Lesenswert?

Bernd M. schrieb:

Zwei 0-Bits in Folge garantieren allerdings noch lange nicht, dass es sich dabei um ein EVEN und ein STOP-Bit handelt

Mir scheint, Du verwechselst da was.

Das Parity-Bit ("Even") ist statistisch genauso oft 0 wie 1. Und das Stoppbit immer 1.

Ja, der einzige Bezugspunkt ist die erste fallende Flanke (der Beginn des Startbits), alles andere wird so wie Du es beschreibst von nur dieser ausgehend ausgewertet. komplett statisch. Man kann nur noch prüfen, ob das nominelle Parity- und Stoppbit den richtigen Pegel haben. Man kann die Bits nicht "erkennen". (Wäre natürlich möglich, auf weitere Flanken neu zu synchronisieren, passiert aber nicht, da 00 oder ff im Datenstrom vorkommen können)

Gast #7517697
Lesenswert?

He S. schrieb:

Wenn aktiv, dann passiert es sehr oft, dass das Startframe oder Startbyte nicht korrekt empfangen wird.

Du liest zu irgendeinem zufälligen Moment den Logikpegel auf dem rx pin. Und wie genau hattest Du vor aus dieser willkürlichen Nanosekunde irgendeinen Informationsgehalt über Parity- und Stoppbit zu gewinnen?

Und was soll der Hickhack mit dem Zeitfenster? Verwende den HW Uart, lasse den dauerhaft auf Empfang. Der informiert Dich per IRQ oder Status Flag darüber das ein neues Zeichen da ist ohne die MCU auch nur im geringsten zu beschäftigen. Werte Frame Error Flag und Parity aus und fertig ist der Lack.

#7517725
Lesenswert?

Vielleicht ist das ja eine Art Hausaufgabe. So nach dem Motto, mach es selbst und benutze nicht den Uart. Um zu verstehen, wie so ein Uart läuft und auf welche Details man achten muss. Und deshalb wird jeder Uart-Post ignoriert, weil er nur den GPIO benutzen darf.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren