Hallo, ich habe LCD 2x16 mit FPGA verbunden. Ich möchte das Display mit folgende Code Initialisieren. allerdings die Initialsierung erfolgt nur nachdem ich reset drücke und es zeigt kein 0. könnte jemand mir sagen, warum erfolgt die intialiesierung nur nach reset und nicht nach dem Einschalten. Und warum wird keine 0 auf dem Display gezeigt Danke --Die feste zeiten hier beziehen sich auf CPLD quarz oszi LIBRARY ieee ; USE ieee.std_logic_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY lcd IS PORT( clk, reset : in std_logic; init_fertig : out std_logic; init_out : out std_logic_vector(6 downto 0)); --EN RS RW D7 D6 D5 D4 END lcd; ARCHITECTURE struct of lcd is --der flag wird auf 1 gesetzt wenn die zeit verstrichen wurde signal delay_flag : std_logic; --hier wird je nach anforderung die benötigte zeit vorgegeben signal delay_time : integer:= 0; --für delay... signal count : integer:= 0; --braucht man nicht unbedingt, ist für ausgang an LCD signal sig_init_out : std_logic_vector(6 downto 0):="0000010"; signal init_suc : std_logic:='0'; BEGIN init_out <= sig_init_out; init_fertig <= init_suc; process (clk,reset, init_suc) begin if (reset='0') then count <= 0; else if (clk'event and clk='1' and init_suc='0') then if (count = delay_time) then count <= 0; delay_flag <= '1'; else count <= count + 1; delay_flag <= '0'; end if; end if; end if; end process; process (delay_flag, reset) variable delay_nr : std_logic_vector(3 downto 0):=(others=>'0'); begin if (reset='0') then init_suc <= '0'; delay_nr := (others=>'0'); sig_init_out <= "0000010"; delay_time <= 0; else if (delay_flag = '1') then case delay_nr is when "0000" => sig_init_out <= "1000010"; delay_time <= 100000; --2ms when "0001" => sig_init_out <= "1000010"; -- delay_time <= 50000; --1ms 4-Bit Datenlänge, 2-zeiliges Display, 5x7 Font when "0010" => sig_init_out <= "1001000"; -- delay_time <= 50000; when "0011" => sig_init_out <= "1000000";-- delay_time <= 50000; --1ms Display ein, Cursor ein, Cursor blinken when "0100" => sig_init_out <= "1001111";-- delay_time <= 50000; --1ms when "0101" => sig_init_out <= "1000000";-- delay_time <= 50000; --1ms Display löschen, Cursor auf 1. Spalte von 1. Zeile when "0110" => sig_init_out <= "1000001";-- delay_time <= 50000; --1ms when "0111" => sig_init_out <= "1000000";-- delay_time <= 50000; --1ms Cursor Auto-Increment when "1000" => sig_init_out <= "1000110";-- delay_time <= 50000; --1ms when "1001" => sig_init_out <= "1100011";-- delay_time <= 50000; --1ms 0 auf Disply schreiben when "1010" => sig_init_out <= "1100000";-- delay_time <= 50000; --1ms when "1011" => init_suc <= '1'; when others => null; end case; delay_nr := unsigned(delay_nr)+1; end if; end if; end process; end struct;
Sabine Mühller schrieb: > warum erfolgt die intialiesierung nur nach > reset und nicht nach dem Einschalten. Weil das Display nach dem Power-Up noch Zeit (bis zu 100ms) braucht, um sich selbst zu finden...
Hallo Lothar, danke für deine Antwort, ich habe im Code paar Veränderungen durchgeführt. ich habe ein 120 ms Zeitverzögerung nch dem Einschalten eingefügt. Leider hat es nicht gebracht. --Die feste zeiten hier beziehen sich auf CPLD quarz oszi LIBRARY ieee ; USE ieee.std_logic_1164.all; use IEEE.STD_LOGIC_ARITH.ALL; use IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY lcd IS PORT( clk, reset : in std_logic; init_fertig : out std_logic; init_out : out std_logic_vector(6 downto 0)); --EN RS RW D7 D6 D5 D4 END lcd; ARCHITECTURE struct of lcd is --der flag wird auf 1 gesetzt wenn die zeit verstrichen wurde signal delay_flag : std_logic; --hier wird je nach anforderung die benötigte zeit vorgegeben signal delay_time : integer:= 0; --für delay... signal count : integer:= 0; --braucht man nicht unbedingt, ist für ausgang an LCD signal sig_init_out : std_logic_vector(6 downto 0):="0000011"; signal init_suc : std_logic:='0'; BEGIN init_out <= sig_init_out; init_fertig <= init_suc; process (clk,reset, init_suc) begin if (reset='0') then count <= 0; else if (clk'event and clk='1' and init_suc='0') then if (count = delay_time) then count <= 0; delay_flag <= '1'; else count <= count + 1; delay_flag <= '0'; end if; end if; end if; end process; process (delay_flag, reset) variable delay_nr : std_logic_vector(3 downto 0):=(others=>'0'); begin if (reset='0') then init_suc <= '0'; delay_nr := (others=>'0'); sig_init_out <= "0000011"; delay_time <= 0; else if (delay_flag = '1') then case delay_nr is when "0000" => delay_time <= 6000000; --120ms when "0001" => sig_init_out <= "1000011"; delay_time <= 300000; --6ms when "0010" => sig_init_out <= "1000010"; delay_time <= 5000; --100us Interface auf 4-Bit setzen when "0011" => sig_init_out <= "1000010"; -- delay_time <= 5000; --100us 4-Bit Datenlänge, 2-zeiliges Display, 5x7 Font when "0100" => sig_init_out <= "1001000"; -- delay_time <= 5000; when "0101" => sig_init_out <= "1000000";-- delay_time <= 50000; --100us Display aus when "0110" => sig_init_out <= "1001000";-- delay_time <= 50000; --100us when "0111" => sig_init_out <= "1000000";-- delay_time <= 50000; --100us Display löschen, when "1000" => sig_init_out <= "1000001";-- delay_time <= 50000; --100us when "1001" => sig_init_out <= "1000000";-- delay_time <= 50000; --100us Kursor nach rechts wandernd, kein Display shif when "1010" => sig_init_out <= "1000110";-- delay_time <= 50000; --100us when "1011" => sig_init_out <= "1000000";-- delay_time <= 50000; --100us Display ein when "1100" => sig_init_out <= "1001111";-- delay_time <= 50000; --100us when "1101" => init_suc <= '1'; when others => null; end case; delay_nr := unsigned(delay_nr)+1; end if; end if; end process; end struct;
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.