Servus! Ich arbeite gerade daran, vier 7 Segmentanzeigen anzusteuern. Die Anzeigen können nicht unabhänging voneinander angesteuert werden, was bedeutet ich schalte immer eine Anzeige an und lass dann die Segmente aufleuchten. Dies wird dann für alle vier Anzeigen wiederholt. Die anzuzeigenden Zahlen werden von einem Modul generiert, welches einen 12 bit binärwert in ein 16 bit BCD umwandelt. Dieser ist zurzeit konstant, das heisst die anzuzeigenden Werte ändern sich nicht. Nun zu meinem Problem: Die anzeige soll mir "4095" anzeigen, jedoch zeigt sie nur "verschwommenes" an. Manche Segmente leuchten heller als andere, man sieht also keine klare Zahl, sondern ein Mischmasch (und die Anzeigen flackern nicht). Mit ein bischen Phantasie sieht man 4095 dastehen, aber eben nur mit ein bischen phantasie.... Was könnte ich falsch gemacht haben? Vielen Dank!
Stephan S. schrieb: > Was könnte ich falsch gemacht haben? Hmmmm ... vielleicht mal ein Schaltbild posten ? Irgendwie würde ich als erstes mal nach Kurzschlüssen suchen.
<Glaskugel> Das hört sich doch sehr nach einem Fehler beim Multiplexen an... Diesen Artikel http://www.mikrocontroller.net/articles/LED-Matrix gelesen und beachtet? </Glaskugel>
Hier ist der Schaltplan. Die Anzeigen sind fest auf dem Nexys2 Board verdrahtet. Kann man dann trotzdem einen Kurzen erzeugen?
Gib uns doch mal bitte den entsprechenden Code den du geschrieben hast :-/
das nexys ist ein fpga eval board. ich gehe mal davon aus, dass es kein hardware-defekt ist da mir sonst kein defekt einfällt, muss es ein softwarefehler sein. Ohne den Quelltext wird dir niemand helfen können.
Könnte sein, dass du den Multiplexer mit viel zu hoher Frequenz betreibst, d.h. die nächste Ziffer anlegst bevor der Transistor für die vorhergehende Ziffer abgeschaltet hat.
1)nimm eine Wiederholfrequenz von 100Hz. 2)Es gibt sicher Samplecode für den Bereich, den würde ich einfach nehmen. 3)Das Nachleuchten bei den Segmenten hat oft mit den Schaltzeiten der Transistoren zu tun, wie bereits erwähnt. JJ
Zusammenfassung und meine Meinung: Der Fehler liegt nicht in der Hardware. Poste doch mal deinen Code...
so, hier mal der code: --this module cycles through the 4 segments and assignes the output for --the 7segment library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all; use IEEE.numeric_std.all; -- Uncomment the following library declaration if using -- arithmetic functions with Signed or Unsigned values --use IEEE.NUMERIC_STD.ALL; -- Uncomment the following library declaration if instantiating -- any Xilinx primitives in this code. --library UNISIM; --use UNISIM.VComponents.all; entity seven_segment_selecter is port( segment_output: out std_logic_vector(6 downto 0); segment_select: out std_logic_vector(3 downto 0); clk: in std_logic; segment7a : in std_logic_vector(6 downto 0); segment7b : in std_logic_vector(6 downto 0); segment7c : in std_logic_vector(6 downto 0); segment7d : in std_logic_vector(6 downto 0)); end seven_segment_selecter; architecture Behavioral of seven_segment_selecter is signal count : integer :=0; begin --process that counts from 1 to 8 selecting: process(clk, count) begin if(clk'event and clk='1') then count <=count+1; end if; if(count = 8) then count <=0; end if; end process; --process that selects/cycles the outputs depending on "count" output: process(clk, count, segment7a, segment7b, segment7c, segment7d) begin if(count=0) then segment_select<="1110"; segment_output<=segment7a; end if; if (count=1) then segment_select<="1110"; segment_output<="1111111"; end if; if (count=2) then segment_select<="1101"; segment_output<=segment7b; end if; if (count=3) then segment_select<="1101"; segment_output<="1111111"; end if; if(count=4) then segment_select<="1011"; segment_output<=segment7c; end if; if (count=5) then segment_select<="1011"; segment_output<="1111111"; end if; if (count=6) then segment_select<="0111"; segment_output<=segment7d; end if; if (count=7) then segment_select<="0111"; segment_output<="1111111"; end if; end process; end Behavioral; zur erklärung: als input bekommt das modul für jede Anzeige die zu beleuchtenden Segmente. (segmetn7a bis d). die clock wird vom system übernommen (50MHz) im ersten prozess lass ich nen counter hochzählen, durch den dann im zweiten prozess die einzelnen Anzeigen durchgeschaltet werden.
Stephan S. schrieb: > die clock wird vom system übernommen (50MHz) Viiiiiiieeeeeeeelllll zu schnell! Da müssten die Transen in 20ns umschalten können. Das klappt niemals. Irgendwo stand da was von 100Hz. Das reicht locker! Du brauchst also noch einen Vorteiler vor deinen Zähler.
1 | begin
|
2 | if(clk'event and clk='1') then |
3 | count <=count+1; |
4 | end if; |
5 | if(count = 8) then |
6 | count <=0; |
7 | end if; |
8 | end process; |
Ein asynchroner Reset in einem Spartan 3... :-o Und dann noch die Schreibweise, das ist aber mal ein recht extremer Beschreibungsstil. Ein Tipp: such mal hier im Forum nach "Xilinx und die Resets" und weltweit nach dem WP272...
ok, das mit der Frequnez hab ich jetzt geändert. Danke! jetzt habe ich aber ein anderes Problem: es leuchten nur die erste und die letzte Anzeige! sieht irgendwer da in meinem code einen fehler? Vielen Dank!
Und was wird auf diesen Stellen angezeigt? Passt das? Ändert sich.was, wenn du die Stellen im VHDL Code änderst? Und vor allem: Was meint die Simulation zu diesem Problem?
Ich habe das Problem gelöst, ich hatte einen Fehler im Counter und frequencydivider. Vielen Dank für eure Hilfe!
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.