www.mikrocontroller.net

Forum: FPGA, VHDL & Co. RS232 Signal interpretieren mit Cyclone II Board


Autor: Chris P. (hazardii)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Gibt es eine Megafunction seitens ALTERA mit der ich Bitfolgen aus der 
RS232 Schnittstellen interpretieren/decodieren kann? Ich arbeite derweil 
in einem Blockschaltdiagramm.

Hintergrund:
Ich habe ein KEIL MCB-XC167, dass über RS232 ein Wort an mein FPGA 
sendet. Dieses Wort wird in Schieberegister geschrieben. Allerdings 
entspricht die Empfangene Bitfolge nicht dem erwarteten Zeichen, weder 
in ASCII noch über HEX nach ASCII konvertiert.

Ich weiß, dass das Programm auf dem µC die einzelnen Zeichen des Wortes 
als String überträgt. Meine Vermutung ist, dass ich das Wort auf dem 
FPGA interpretieren muss, nur wie?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris P. schrieb:
> Dieses Wort wird in Schieberegister geschrieben.
Wie siehr dieser Empfangsteil aus?
Wann wird mit welcher Preiodendauer geschoben?
Wann wird mit dem Schieben begonnen?

> Allerdings
> entspricht die Empfangene Bitfolge nicht dem erwarteten Zeichen
Falsche Baudrate?
Startbit nicht erkannt?

> dass über RS232 ein Wort an mein FPGA sendet.
Was für ein Wort?
Ein Wort wie z.B. "Wort"?
Oder ein Integer-Wort?
Wenn ja: wie breit? 16 oder 32 Bit?

> Ich weiß, dass das Programm auf dem µC die einzelnen Zeichen des Wortes
> als String überträgt.
Das ist nicht viel.
Es wird also z.B. die Zahl  1234
als die Zeichenkette '1', '2', '3', '4' übertragen?
Und dann? Wie erkennst du das Ende der Zeichenkette?
Kommt da ein CR-LF?
Hast du führende Nullen?

> Meine Vermutung ist, dass ich das Wort auf dem
> FPGA interpretieren muss,
Da hast du vermutlich recht.
> nur wie?
So, dass das herauskommt, was du willst.

BTW: Was für eine Sprache willst du denn überhaupt verwenden?

Autor: Chris P. (hazardii)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Dieses Wort wird in Schieberegister geschrieben.
> Wie siehr dieser Empfangsteil aus?
> Wann wird mit welcher Preiodendauer geschoben?
> Wann wird mit dem Schieben begonnen?

Über den REALTERM gebe ich den Befehl zum Senden. Mit Empfang des 
Startbits werden N Zeichen ins Schieberegister geschrieben (nur N 
Zeichen weil es sich hierbei noch um eine Testversion handelt).

Gesendet wird der String "111" CR-LF dann "100000" CR-LF usw. (das kann 
in REALTERM sehen).
Emfangen wird (in positive Logik umgewandelt):

1* 0111 0011 0*1* 0111 0011 0*1* 0111 0011 0*1* 0100 1111 0* ...

hierbei entspricht 1* dem Startbit und 0* dem Stopbit (meine Annahme), 
und natürlich ist das * von mir hinzugefügt...
Ich kann das CR-LF in der Folge nicht finden, vielleicht ist meine 
Interpretation der Zeichenfolge auch falsch?

Eingestellt ist: Baud 19200, 8N1, no flow control.

>> Allerdings
>> entspricht die Empfangene Bitfolge nicht dem erwarteten Zeichen
> Falsche Baudrate?
> Startbit nicht erkannt?

Baudrate korrekt, Startbit ebenfalls korrekt erkannt.

>> dass über RS232 ein Wort an mein FPGA sendet.
> Was für ein Wort?
> Ein Wort wie z.B. "Wort"?
> Oder ein Integer-Wort?
> Wenn ja: wie breit? 16 oder 32 Bit?

Sind halt ASCII Zeichen, siehe unten.

>> Ich weiß, dass das Programm auf dem µC die einzelnen Zeichen des Wortes
>> als String überträgt.
> Das ist nicht viel.
> Es wird also z.B. die Zahl  1234
> als die Zeichenkette '1', '2', '3', '4' übertragen?

Richtig.

> Hast du führende Nullen?

Ein Stopbit nach jedem Character.

>> Meine Vermutung ist, dass ich das Wort auf dem
>> FPGA interpretieren muss,
> Da hast du vermutlich recht.
>> nur wie?
> So, dass das herauskommt, was du willst.

;)

> BTW: Was für eine Sprache willst du denn überhaupt verwenden?

Läuft das jetzt drauf hinaus, dass ich mir den Interpreter selbst 
schreiben muss? Ich hatte gehofft das ich es mit einer Megafunction 
umgehen kann, weil es auf irgendeinem Standard basieren könnte. Am 
besten wärs es dann zu wissen, wie die Codierung am KEIL µC 
funktioniert, oder? Gibts da einen Standard? Muss ich zur Lösung des 
Problems auf C++ oder ähnliches zurückgreifen oder gibts alternative 
Lösungswege?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris P. schrieb:
> hierbei entspricht 1* dem Startbit und 0* dem Stopbit (meine Annahme),
Was verleitet dich zu dieser Annahme?

> Emfangen wird (in positive Logik umgewandelt):
In "normalen" 5V Pegeln ist der Ruhezustand auf der RS232-Leitung eine 
'1'. Das Startbit ist eine '0', dann kommen 8 Datenbits, und dann das 
Stoppbit als '1'.

> Startbit ebenfalls korrekt erkannt.
Sicher?

Chris P. schrieb:
> Ich habe ein KEIL MCB-XC167, dass über RS232 ein Wort an mein FPGA
> sendet.
Wie kommt denn hier das ALTERA FPGA ins Spiel?

Chris P. schrieb:
> Läuft das jetzt drauf hinaus, dass ich mir den Interpreter selbst
> schreiben muss? Ich hatte gehofft das ich es mit einer Megafunction
> umgehen kann, weil es auf irgendeinem Standard basieren könnte.
Du mußt ja irgendeine Funktion ins FPGA bekommen. Das tut von sich aus 
gar nichts.
Geneigte Zeitgenossen verwenden zur Hardwarebeschreibung VHDL, Verilog, 
Matlab, oder sonst was, was letztlich Daten für ein FPGA erzeugt...

Autor: Chris P. (hazardii)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Response Lothar.

>> hierbei entspricht 1* dem Startbit und 0* dem Stopbit (meine Annahme),
> Was verleitet dich zu dieser Annahme?

Okay, sorry hab mich da schlecht ausgedrückt. Diese Nomenklatur hab ich 
so definiert um zu zeigen wie ich die Bitfolge verstehe.

>> Emfangen wird (in positive Logik umgewandelt):
> In "normalen" 5V Pegeln ist der Ruhezustand auf der RS232-Leitung eine
> '1'. Das Startbit ist eine '0', dann kommen 8 Datenbits, und dann das
> Stoppbit als '1'.

Genau, auf der RS232-Leitung werden die Daten in negativer Logik 
übermittelt. D.h. am µC kann ich mit dem Oszilloskop folgendes Messen:

0* 1000 1100 1*0* 1000 1100 1*0* 1000 1100 1*0* 1011 0000 1*....

Hier hast Du das Startbit(0*), wie du schreibst, logisch low und das 
Stopbit (1*) logisch high. Wenn ich den UART_RXD_Pin des FPGAs an einen 
Ausgangspin lege, kann ich das Wort mit dem Oszilloskop in positiver 
Logik auslesen. D.h., dass es auf dem FPGA Board umgewandelt werden 
muss.

>> Startbit ebenfalls korrekt erkannt.
> Sicher?

Ja, mit dem Oszi geprüft.

>> Ich habe ein KEIL MCB-XC167, dass über RS232 ein Wort an mein FPGA
>> sendet.
> Wie kommt denn hier das ALTERA FPGA ins Spiel?

Das FPGA Board ist mit Schaltung programmiert, die vor dem Ausführen 
konfiguriert werden muss. Der KEIL µC konfiguriert mir mit dem Wort, 
versendet über die RS232-Leitung, diese Schaltung ehe das FPGA Board 
anfängt zu arbeiten. Ich schätze diese Lösung ist umständlich, da die 
Aufgabe des Mikrokontrollers vom FPGA Bord ebenfalls übernommen werden 
könnte, aber das steht nicht zur Debatte weil ich das FPGA Board in 
diese Umgebung einbinden muss.

> Geneigte Zeitgenossen verwenden zur Hardwarebeschreibung VHDL, Verilog,
> Matlab, oder sonst was, was letztlich Daten für ein FPGA erzeugt...

Ok, das hört sich danach an als ob es wohl keine bequeme Fertiglösung 
von ALTERA gibt. Dann müsste ich es in VHDL lösen, aber ohne Ahnung wie 
der KEIL µC das codiert, bin ich wohl aufgeschmissen, oder?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris P. schrieb:
> Dann müsste ich es in VHDL lösen, aber ohne Ahnung wie
> der KEIL µC das codiert, bin ich wohl aufgeschmissen, oder?
Der Keil uC ist ein Infineon uC und da ist kein Geheimnis dahinter, denn 
du selber sagst ja:
>> Gesendet wird der String "111" CR-LF dann "100000" CR-LF usw.
>> (das kann in REALTERM sehen).

Ich verstehe ehrlich gesagt dein Problem nicht.
Wenn du die Zahl im Terminalprogramm ansehen kannst (und sogar ein CR-LF 
empfängst), dann ist für mich eigentlich klar, dass es bis an den 
FPGA-Pin funktioniert.

Oder aber du hast ein eklatantes Verständnisproblem und drehst dir 
umsonst einen Knoten ins Hirn. Denn ehrlich gesagt: die serielle 
Schnitte ist schon ziemlich unkompliziert zu implementieren...

Zeichne mal ein Blockdiagramm und mal da rein, was deiner Meinung nach 
wo raus und wo reingeht...
Denn:
> Allerdings entspricht die Empfangene Bitfolge nicht dem erwarteten
> Zeichen, weder in ASCII noch über HEX nach ASCII konvertiert.
Wenn du etwas erwartest, dann mußt du doch nur dort schauen, wo es nicht 
mehr stimmt...

Autor: Chris P. (hazardii)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Lothar,

danke für Deine Hilfe. Das Problem ist gelöst. Es war ein 
Verständnisproblem mit dem Ausdruck "negativer Logik" bei RS232. Ich 
muss das ankommende Signal auf dem FPGA invertieren (!) und die beachten 
die msb/lsb Reihenfolge beachten, eh klar. Das wars.

Gruß

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.