Forum: Mikrocontroller und Digitale Elektronik UART: Bitmuster erkennen


von Zo R. (hsch1978)


Lesenswert?

Hallo,

für die Detektion eines Startframes ( 1 Startframe hat 1 byte), möchte 
ich die Bitfolge 00 (EVEN Bit + STOP Bit) ermitteln. Wie kann sowas auf 
einem Mikrocontroller umgesetzt werden? Für das Einlesen eines Pins habe 
ich bereits eine Funktion.

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

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

von Zo R. (hsch1978)


Lesenswert?

Warum kommt jetzt diese Frage?

von Zo R. (hsch1978)


Lesenswert?

USART : Universal Synchronous/Asynchronous Receiver Transmitter

von Peter (pittyj)


Lesenswert?

Ich nehme immer die Hardware Funktion des Microcontrollers. Der erledigt 
das für mich.
Die meisten Hersteller liefern auch eine Bibliothek mit API oder 
ähnliches mit.

von Zo R. (hsch1978)


Lesenswert?

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.

von Sebastian R. (sebastian_r569)


Lesenswert?

Du hast also bereits einen Mikrocontroller und du hast auch bereits 
Code.

Uuuund ein NDA verbietet es dir, uns nähere Details bekannt zu geben?

von Wilhelm M. (wimalopaan)


Lesenswert?

He S. schrieb:
> Warum kommt jetzt diese Frage?

Weil Du

He S. schrieb:
> Für das Einlesen eines Pins habe
> ich bereits eine Funktion.

geschrieben hast.

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Zo R. (hsch1978)


Lesenswert?

1
int main(void)
2
{
3
  uint8_t rxPin;
4
  rxPin = 0;
5
6
  while (1)
7
  {
8
    rxPin = Gpio_ReadPin();
9
10
    if(rxPin != 0)
11
    {
12
      __NOP();
13
    }
14
}

von Zo R. (hsch1978)


Lesenswert?

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

von Harald K. (kirnbichler)


Lesenswert?

Und wozu soll das gut sein? Eine UART macht so etwas in Hardware. Die 
kann selbst auf ein Startbit warten.

Beitrag #7516839 wurde vom Autor gelöscht.
von Helmut -. (dc3yc)


Lesenswert?

Liest und verstehst du eigentlich, was dir die Vorschreiber mitteilen? 
Beantworte doch mal die Fragen!

von Zo R. (hsch1978)


Lesenswert?

Die USART habe so bereit sin Betrieb:

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.

von Zo R. (hsch1978)


Lesenswert?

ich zeige hier keine Schaltpläne.

von Sebastian R. (sebastian_r569)


Lesenswert?

He S. schrieb:
> Eigentlich bräuchte ich eine Messeinheit, die mir ein bit detektieren
> kann.

Dein (noch immer streng geheimer) Mikrocontroller kann das ziemlich 
sicher komplett in Hardware. Dafür hat er ziemlich sicher ein 
U(S)ART-Modul.

Über deinen Code-Schnipsel möchte ich lieber nicht sprechen.

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Bruno V. (bruno_v)


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.

von Wilhelm M. (wimalopaan)


Lesenswert?

Die STMs haben eigentlich genügend HW-USARTs.

Und falls Du einen Soft-Usart bauen wills, na, dann brauchst Du noch 
einen der Timer (sinnvollerweise).

Und falls HW-Usart oder SW-Uart dann laufen, brauchst Du wohl einen 
Zustandsautomat, um Dein (unbekanntes) Protokoll zu verarbeiten.

: Bearbeitet durch User
von Peter D. (peda)


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.

von Peter (pittyj)


Lesenswert?

Alles geheim und unbekannt. Dazu ein riesiger Quellcode, den sogar meine 
Katze hinbekommt.
Scheint jetzt auch Montagstrolle zu geben.

von Rolf M. (rmagnus)


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.

von Bernd M. (berndmm)


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.

von Bruno V. (bruno_v)


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)

von Michael (Firma: HW Entwicklung) (mkn)


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.

von Bauform B. (bauformb)


Lesenswert?

Bernd M. schrieb:
> 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.

Ein STM32-UART kann auch das per Hardware (IDLE-Interrupt), teilweise 
sogar mit einstellbarer Fensterbreite (RTO-Interrupt).

von Peter (pittyj)


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.

von Frank K. (fchk)


Lesenswert?

Nein, das die Fortsetzung von diesem Thread:
Beitrag "UART RX Interrupt"

Er hat da ein völlig vergurktes Hardwarekonzept mit optischer 
UART-Übertragung, die er zum Laufen bringen will/soll/muss. Dass sein 
Ansatz schon im Kern Unsinn ist, wurde ihm schon mehrfach gesagt, aber 
er ist beratungsrenitent.

fchk

von Norbert (der_norbert)


Lesenswert?

Peter schrieb:
> Vielleicht ist das ja eine Art Hausaufgabe.

Nach dem ersten Code-Schnipsel war doch eines klar:

Warum bis zum nächsten Freitag warten?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.