Forum: FPGA, VHDL & Co. LCD Display scrollt leider


von Hans-Werner (Gast)


Lesenswert?

Nachdem die Ansteuerung des LCD Displays des Spartan 3AN Starter Kits 
nun funktioniert kämpfe ich noch mit dem Problem das dieses scrollt.
Ich setze bei der Konfiguration das Entry mode Set Command.
1
  when eleven_a =>  
2
                              lcd_enable <= '1';
3
                              lcd_rs <= '0';
4
                              lcd_rw <= '0';
5
                              lcd_data <= "00000110";
6
                              delay <= 2000;
7
                              configuration_state <= eleven_b;
Die einzelnen Zeichen werden innerhalb einer Schleife ausgegeben. Da das 
Autoinkrement gesetzt ist werden die Zeichen von links nach rechts 
ausgegeben. Nach jedem Schleifendurchlauf für die Ausgabe der Uhrzeit 
wird die Position mit dem DD Ram Set Command immer wieder neu gesetzt. 
Die einzelnen Zeichen sollten also überschrieben werden. Ein Scrollen 
sollte nicht stattfinden.
1
when fifteen_a =>  -- Set DD RAM Address = 00
2
                              lcd_enable <= '1';
3
                              lcd_rs <= '0';
4
                              lcd_rw <= '0';
5
                              lcd_data(7) <= '1';
6
                              lcd_data(6 downto 0) <= "0000000";
7
                              delay <= 2000;
8
                              output_state <= fifteen_b;
Was mache ich falsch ? Wie kann ich dem Display das Scrollen abgewöhnen 
?

von Hans-Werner (Gast)


Lesenswert?

Vielleicht habe ich mich mißverständlich ausgedrückt.
Die Zeichen werden fortlaufend von links nach rechts ausgegeben.
Eine Neupositionierung um die bereits ausgegebenen Zeichen zu 
überschreiben ist nicht möglich. Inzwischen habe ich ein zusätzliches 
Clear Display Command eingefügt welches laut User Guide zum Spartan 3 AN 
Starter Kit den Cursor wieder in die linke obere Ecke setzen soll.
Leider werden weiterhin die Zeichen fortlaufend ausgegeben.
Habe ich das "Set DD RAM Address" Kommando falsch verstanden ?
Dient dieses nicht zur Positionierung der Ausgabe ?

von Sigint 112 (sigint)


Lesenswert?

Hallo Hans-Werner,
  theoretisch sollte es so funktionieren. Vielleicht handelt es sich 
aber nicht um ein HD44780 - Display sondern um einen anderen Controller. 
Versuch es mal mit dem Befehl "Cursor auf Startposition" :
http://www.mikrocontroller.net/articles/HD44780

Gruß,
  SIGINT

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

GGf wartest du auch nciht lange genugn display clear sol eins der seeehr 
langsamen Kommandos sein.

von Ralf J. (rujatt)


Lesenswert?

Was du beschreibst klingt ungewöhnlich.
Ich denke das du probleme mit dem Timing hast.
Normalerweise arbeiten die Displays mit 250 khz, wenn dies so ist, und 
das display ein
HD 44780 kompatibler typ ist sind die Ausführungszeiten Set DD RAM und 
alle anderen
bei 40ys ausser Display Clear der braucht fast 2ms.
Prüfe das du nicht zu schnell bist.
Ausserdem hat das Display ein Busy Flag das man abfragen kann ob das 
Display bereit
ist Befehle und Daten entgegen zu nehmen.

von Hans-Werner (Gast)


Lesenswert?

Hallo SigInt,

noch zum Verständnis. Legt der Cursor auch die Posititon der Ausgabe 
fest oder kann die Cursorposition unabhängig von der Position der 
Ausgabe gesteuert werden ? Wenn ich nun nicht auf der Anfangsposition 
etwas ausgeben will sondern an einer anderen Position, dann muß ich ja 
zusätzlich einen Positionierungsbefehl absetzen ?!
Verstehe immer nur Bahnhof.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Der "Cursor" legt wie beim PC fest an welcher Stelle das nächste Zeichen 
erscheinen wird. Also Cursor auf 0,0 und du schreibst an den Anfang, 
Cursor auf 5,0 und du schreibst an diese Postion. Je nach 
Inistialisierung wird der Cursor bei jemdem schreiben 
incrementiert/decrementiert oder bleibt auf der Stelle wo er gesezt 
wurde. Hast du dir obigen Link schon angeschaut? Insebsondere die 
Beispiel für Assembler und C sind manchmal hilfreich.

von Thomas S. (tstoll)


Lesenswert?

Hallo Hans-Werner,

habe mir ebenfalls ein Spartan 3an als Beginner zugelegt - und wäre sehr 
daran interessiert, ob Du das Problem schon gelöst hast.
Denn ich stehe derzeit vor einem ähnlichen Problem.

Funktioniert Deine Anzeige nun?

Grüße,
Thomas

von Hans-Werner (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Thomas,

habe an einem anderen Problem geknobelt.
Ich habe mir das VHDL-Programm für die Ausgabe der 
Mandelbrotmenge(Apfelmännchen) aus dem Internet heruntergeladen und mit 
dem Autor Kontakt aufgenommen. Bei dem Board ist nur die Schwarz-Weiss 
Version dabei; ich hätte die Ausgabe gerne in Farbe. Ich möchte das 
Programm verstehen und modifizieren. Der zeitliche Ablauf ist nicht 
ohne.
Im Anhang meine Tick-Tack noch mit der durchlaufenden Anzeige. Falls du 
die Lösung findest bitte zurück an mich. Als Erweiterung könnte man noch 
einen DCF-Empfänger anschliessen und auch das Datum ausgeben. Es fehlen 
noch Funktionen wie Uhrzeit stellen, Alarm stellen. Die Funktion 
conv_Ascii habe ich nur eingefügt aber noch nicht benutzt. Den 
Taktteiler kann man vereinfachen. Für die LCD-Ausgabe sollte man noch 
einen Prozess schreiben der eine Zeichenkette ausgeben kann.
1
# Definition des Clocks
2
NET "clock" LOC = "E12" | IOSTANDARD = LVCMOS33; # Systemclock des Boards
3
NET "clock" TNM_NET = clock;
4
TIMESPEC TS_clock = PERIOD "clock" 20 ns HIGH 50%;
5
# Ansteuerung der LEDs (LEDs von links nach rechts)
6
NET "led<7>" LOC = "W21" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; 
7
NET "led<6>" LOC = "Y22" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; 
8
NET "led<5>" LOC = "V20" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; 
9
NET "led<4>" LOC = "V19" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; 
10
NET "led<3>" LOC = "U19" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; 
11
NET "led<2>" LOC = "U20" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; 
12
NET "led<1>" LOC = "T19" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; 
13
NET "led<0>" LOC = "R20" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8; 
14
# Ansteuerung des LCD Displays
15
NET "lcd_enable"    LOC = "AB4" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;
16
NET "lcd_rs"      LOC = "Y14" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;
17
NET "lcd_rw"       LOC = "W13" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;
18
19
NET "lcd_data<7>"   LOC = "Y15" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;
20
NET "lcd_data<6>"   LOC = "AB16" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;
21
NET "lcd_data<5>"   LOC = "Y16" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;
22
NET "lcd_data<4>"   LOC = "AA12" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;
23
NET "lcd_data<3>"   LOC = "AB12" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;
24
NET "lcd_data<2>"   LOC = "AB17" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;
25
NET "lcd_data<1>"   LOC = "AB18" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;
26
NET "lcd_data<0>"   LOC = "Y13" | IOSTANDARD = LVCMOS33 | SLEW = SLOW | DRIVE = 8;

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Ich weiß nicht ob es noch aktuell ist, aber ich hab mal einen kleine und 
kompakten Controller für das Spartan3 baord erstellt und der 
funktioniert ohne scrollen: Beitrag "[VHDL] 16x2 LCD Textcontroller / HD44780"

Hatte zwischenzeitlich auch ein "Scrollproblem" das lag aber daran das 
der Enable Impuls nicht richtig erzeugt wurde, bei deinem Code hab ich 
jezt so schnell aufgrund des Umfanges aber auch nicht den Fehler 
entdecken können.

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.