www.mikrocontroller.net

Forum: FPGA, VHDL & Co. LC Display Initialisierung (VHDL)


Autor: Klmn Oprst (destroyer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo erstmal,

ich muss eine "bibliothek" in vhdl schreiben, womit man LC Display 
ansteuern kann.

Mein LCD hat einen KS0070B controller.

Bei der Initialisierung muss man paar mal hintereinander bestimmte 
bitfolgen senden und zwischen durch warten....

das problem ist, dass ich keine ahnung habe wie ich die verzögerungen 
realisieren soll.... (hab mit addierer versucht, jedoch war das nicht so 
toll).

Irgendwie muss ich versuchen den ablauf so zu steuern, dass alles 
sequentiell abgearbeitet wird, mit verzögerungen.

hat jemand idee wie man sowas machen könnt. ??

Autor: Jens B. (sio2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
picoblaze nutzen ;)

Verzögerung=> zaehler

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klmn Oprst schrieb:
> Hallo erstmal,
Tach auch...

> hat jemand idee wie man sowas machen könnt. ??
Die Stichworte, die du brauchst heißen State-Machine (Zustandsautomat) 
und Counter (Zähler). Sieh dich hier im VHDL-Forum mal um, da war vor 
etwa 2 Monaten mal ein Code für ein LCD da...

Autor: Klmn Oprst (destroyer)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke... nach dem ich das thema eröffnet habe , hatte ich auch die 
idee...

Kann man das irgendwie optimieren ?
--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 test IS
  PORT(
    clk, reset :  in std_logic;
    init_fertig : out std_logic;
    init_out : out std_logic_vector(9 downto 0));
END test;

ARCHITECTURE struct of test 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 : std_logic_vector(10 downto 0):="00000000000";
--für delay...
signal count : std_logic_vector(10 downto 0):=(others=>'0');

--braucht man nicht unbedingt, ist für ausgang an LCD
signal sig_init_out : std_logic_vector(9 downto 0):="0000110000";

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 <= (others=>'0');
    else
      if (clk'event and clk='1' and init_suc='0') then
          if (count = delay_time) then
            count <= (others=>'0');
            delay_flag <= '1';
          else
            count <= unsigned(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 <= "0000110000";
      delay_time <= "00000000000";
    else
      if (delay_flag = '1') then
        case delay_nr is
          when "0000" =>   sig_init_out <= "0000110000";
                  delay_time <= "10000000001"; --4.1ms
          when "0001" =>   sig_init_out <= "0000110000";
                  delay_time <= "00000011001"; --100us
          when "0010" =>   sig_init_out <= "0000110000";
                  delay_time <= "00000011001"; --100us hier muss man nicht warten, sicherheit
          when "0011" =>   sig_init_out <= "0000111000";-- 8bit 2 liens, 5x7 per dot
                  delay_time <= "00000001010"; --42us
          when "0100" =>   sig_init_out <= "0000001000";-- display off
                  delay_time <= "00000001010"; --42us
          when "0101" =>   sig_init_out <= "0000001000";-- display clear
                  delay_time <= "00110011010"; --1.64ms
          when "0110" =>   sig_init_out <= "0000000110";-- entry mode set, increase, display not shifted
                  delay_time <= "00000001010"; --42us
          --hier init fertig, aber ich schalte mal display an :-)
          when "0111" =>   sig_init_out <= "0000001111";-- display on, curser on, blink on
                  delay_time <= "00000001010"; --42us  
          when "1000" =>  init_suc <= '1';  
          when others => null;
        end case;
        delay_nr := unsigned(delay_nr)+1;
      end if;
    end if;
  end process;
  
end struct;

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beitrag "[VHDL] 16x2 LCD Textcontroller / HD44780"
Sicherlich an der ein oder anderen Stelle Optimierungsbedürftig, dafür 
einfach anzupassen für verschiedene Display Typen...

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.