mikrocontroller.net

Forum: FPGA, VHDL & Co. UART-Informationen auswerten


Autor: VHDL-Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich benütze einen UART, der mir einen Empfangenen Byte mit einem
Byte_Empfangen Signal signalisiert. Daraufhin kann ich dieses Byte
abholen und den UART neu initialisieren mit Init_UART. Wie kann man auf
praktische Weise jeweils 3 Byte hintereinander auslesen, diese zu 24-Bit
zusammensetzen nach größe auswerten und vier verschiedene
Ausgangssignale erstellen?

Ich versuche die 3 byte in ein Register zu schreiben, und diese dann
auszuwerten. D.h. wenn die Empfangenen Byte größer als Zahl1 sind soll
Ausgangssignal_1 auf High gehen. Wenn die Empfangenen Bytes größer als
Zahl2 sind soll Ausgangssignal_2 auf High gehen u.s.w.

Der UART wird ständig abgehört und das Register immer wieder mit 3
neuen bytes aufgefüllt.

Bei der praktischen Umsetzung habe ich Schwierigkeiten, nach jedem
dritten Byte, die ich auslese den Registerinhalt komplett zu löschen.

Anfängerproblem :(

Auf eure Ratschläge und Tips würde ich mich sehr freuen.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe so was ähnliches in einer Statemachine realisiert. Nach 3
empfangenen Bytes einfache ein DataReadyFlg setzen, die Daten abholen.
Und Statemachine rücksetzen....

Sebastian

Autor: VHDL-Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
der UART liest nur 8 Bit

Autor: VHDL-Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Sebastian,

könntest du vielleicht den Code deiner Statemachine posten? Würde mir
bei Lösung meines Problems bestimmt helfen.
Thanks!

Autor: VHDL-Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
kann mir hier vielleicht jemand weiterhelfen einen VHDL Code zu
schreiben, der einen Zähler realisieren soll.
Der Zähler soll angeregt von einem Eingangssignal von 1..3 zählen, bei
3 ein externes Signal ausgeben und wieder auf 1 zurückgehen. Gezählt
soll das Eingangssignal, wenn es sich ändert L-->H
Der Zähler soll sich selbst resetten, wenn es bis 3 hochgezählt hat.


Ich scheitere an den Versuchen, dies zu schreiben, so simpel dies auch
erscheinen mag :(

Autor: VHDL-Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was stimmt in diesem Code nicht?


ENTITY zaehler IS
  PORT
  (
    Eingangssignal:  IN STD_LOGIC;
    Ausgangssignal:  OUT std_logic
  );
END zaehler;


ARCHITECTURE Verhalten OF zaehler IS
signal A: integer range 0 to 2;
BEGIN

  PROCESS (Eingangssignal)
  BEGIN
    IF (Eingangssignal'event AND Eingangssignal = '1') THEN

     case A is

        when 0 =>   Ausgangssignal  <=   '0';
                      A <= 1;

        when 1 =>   Ausgangssignal  <=   '0';
                    A <= 2;

        when 2 =>   Ausgangssignal  <=   '1';
                    A <= 0;

    end case;

    END IF;

  END PROCESS;

END Verhalten;

Autor: Xenu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Was stimmt in diesem Code nicht?

VHDL-mäßig prinzipiell korrekt. Was genau funktioniert denn nicht?
Wenn "Eingangssignal" kombinatorisch generiert wird, kannst Du
Probleme bekommen, weil das Signal dann durch Gatterlaufzeiten erzeugte
Störimpulse ("Glitches") besitzen kann. Das heisst dann wieder das Du
Flanken hasst, wo Du vielleicht keine erwartest.
Wie wird "Eingangssignal" erzeugt?

Autor: VHDL-Beginner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Eingangssignal kommt aus einem UART-Modul. DIeser geht auf High,
wenn der UART ein neu empfangenes Byte zur Verfügung hat.

Mit dem oberen Code möchte ich aus dem UART 3 Bytes hintereinander
abholen können um diese weiter auszuwerten.

Autor: MikeH (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich hätte eine Frage:

Ist es so in Ordnung, dass man hier keinen Initialisierungswert für A
benützen muss, d.h. zu Anfang des Programmes A:=0 setzen muss?

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.