Forum: FPGA, VHDL & Co. 7 segment anzeige ist verschwommen


von Stephan S. (stephan_s)


Lesenswert?

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!

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

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.

von Patrick (Gast)


Lesenswert?

<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>

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

4095 == $fff

von Stephan S. (stephan_s)


Angehängte Dateien:

Lesenswert?

Hier ist der Schaltplan. Die Anzeigen sind fest auf dem Nexys2 Board 
verdrahtet. Kann man dann trotzdem einen Kurzen erzeugen?

von Geber (Gast)


Lesenswert?

Gib uns doch mal bitte den entsprechenden Code den du geschrieben hast 
:-/

von Klaus T. (gauchi)


Lesenswert?

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.

von Lattice User (Gast)


Lesenswert?

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.

von Jens (Gast)


Lesenswert?

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

von user (Gast)


Lesenswert?

also mach mal eine pause, beim umschalten

reihe LEDs an, aus, warten, nächste reihe AN

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


Lesenswert?

Zusammenfassung und meine Meinung:
Der Fehler liegt nicht in der Hardware. Poste doch mal deinen Code...

von Stephan S. (stephan_s)


Lesenswert?

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.

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


Lesenswert?

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...

von Stephan S. (stephan_s)


Lesenswert?

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!

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


Lesenswert?

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?

von stephan_s (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.