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
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.
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.
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?
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.
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.
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 | }
|
Eigentlich bräuchte ich eine Messeinheit, die mir ein bit detektieren kann.
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.
Liest und verstehst du eigentlich, was dir die Vorschreiber mitteilen? Beantworte doch mal die Fragen!
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.
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.
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.
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.
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
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.
Alles geheim und unbekannt. Dazu ein riesiger Quellcode, den sogar meine Katze hinbekommt. Scheint jetzt auch Montagstrolle zu geben.
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.
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.
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)
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.
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).
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.