Forum: FPGA, VHDL & Co. Drehgeber (Richtungserkennung)


von Robert T. (robert0815)


Lesenswert?

Hallo,

in dem Artikel http://www.mikrocontroller.net/articles/Drehgeber gibt es 
ja einen schönen Drehgeber. Dort wird für die Richtungserkennung der 
Port CE benutzt. Nach welchem Muster wird dieser mit 1 oder 0 belegt?

von Jan M. (mueschel)


Lesenswert?

Nicht ganz: CE ("clock enable") ist 1, wenn ein Schritt stattgefunden 
hat, die Richtung wird durch up_down angegeben.

von Robert T. (robert0815)


Lesenswert?

Ahh vielen Dank. Da war ich wohl durch die Beschreibung etwas verwirrt.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Dort wird für die Richtungserkennung der Port CE benutzt.
Das ist offenbar der Count-Enable. Für die Richtung ist up_down 
zuständig.

> Nach welchem Muster wird dieser mit 1 oder 0 belegt?
Wenn gezählt werden soll, ist dieses CE für 1 Taktzyklus (von clk) 
aktiv.

von Christian R. (supachris)


Lesenswert?

Genau so ist es: CE ist einen Takt lang 1 wenn gültiger(!) Schritt war, 
up_down gibt die Richtung an. Ich hab den hier genau so im Einsatz in 
einem Virtex 4, mit Zählern dahinter und kleiner Entprellung am Eingang, 
funktioniert astrein.

von Robert T. (robert0815)


Lesenswert?

Ich programmiere gerade ein Projekt in dem ich Sensoren (erstmal einen 
später mehr) auslese und dadurch dann die Richtung festelle).

D.h. ich kann mit CE und updown einen Zähler hoch oder runter zählen 
lassen, oder?
1
if (updown = '1' AND ce = '1') then
2
counter <= counter + 1;

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> D.h. ich kann mit CE und updown einen Zähler hoch oder runter zählen
> lassen, oder?
Nein, du brauchst noch den Takt (CLK):
1
process (clk) begin
2
  if(rising_edge(clk)) then
3
    if (ce='1') then     -- zählen?
4
      if (updown = '1')  -- hoch oder runter?
5
      then   counter <= counter + 1; 
6
      else   counter <= counter - 1; 
7
      end if;
8
    end if;
9
  end if;
10
end process;

von Robert T. (robert0815)


Lesenswert?

Vielen Dank. Jetzt bekomme ich nur noch eine Fehlermeldung:

Error (10309): VHDL Interface Declaration error in E_sensor.vhd(96): 
interface object "left_right" of mode out cannot be read. Change object 
mode to buffer.

left_right ist mein updown. Und eigentlich sieht es genauso aus wie aus 
dem Beispiel. Aber im Zähl Process gibt es dann diesen Fehler. 
left_right jetzt als Buffer definieren ist wohl nicht der richtige Weg, 
oder?


Nachtrag:

Ich habe left_right jetzt einfach als Signal definiert. Ich glaube so 
könnte es funktionieren. Ob das eine gute oder schlechte Lösung ist kann 
ich nicht beurteilen.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> interface object "left_right" of mode out cannot be read.
Du verwendest das Signal offenbar lokal und willst es über einen 
entity-Port ausgeben.

> left_right jetzt als Buffer definieren ist wohl nicht der richtige Weg
Gut erkannt ;-)

> Ich habe left_right jetzt einfach als Signal definiert.
Das ist richtig so.
Für die Ausgabe über den Port mußt du das dann nochmal extra zuweisen.

von Robert T. (robert0815)


Lesenswert?

Ahh ok...also geht man erst über ein Signal (wenn man es noch 
verarbeiten will) und dann auf den Port (wenn das benötigt wird).

Vielen Dank soweit.

P.S. Deine Seite werde ich jetzt auch erstmal regelmässig lesen @Lothar 
Miller.

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.