PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LCD Display 4x20 an Digital Ports



Reth
27.07.2006, 13:05
Hallo,


ich habe wiedereinmal ein kleines Problem mit meiner C-Control(M-Unit 2.0). Es ist folgendes: Für eine Anwendung möchte ich ein 4x20 Punktmatrix Display mit dem KS0066 ansteuern. Das ganze soll über die Digitalports laufen, wie dass bereits angeschlossene Display auf dem Application Board. Nun habe ich das 4x20 parallel zu dem bereits vorhandenen Display auf die gleichen Leitungen angeschlossen (RS: Port 14, RW: Port 13, E: Port 15, DB7 - DB 4: Port 12 bis Port 9, Versorgung klappt alles) nun verwende ich ein Programm welches mir einfach in einer Schleife etwas in die Zeilen schreiben soll, auf dem integrierten Display sieht man alles nur dass 4x20 zeigt nichts an. Nach dem Internet ist der KS0066 kompatibel zum HD74880 und so denke ich mir sollte die Ansteuerung mit dem Basic ++ Programm eigentlich funktionieren.


define i as byte
i = 0

WITH LCD
.INIT
do
.CLEAR
.POS 1,1
.PRINT "Hallo"
.POS 2,1
.PRINT "HALLO"
.POS 3,1
.PRINT "HALLO HALLO"
.POS 4,1
.PRINT "HALLO HALLO HALLO"
loop until i = 1

END WITH

Ich habe mit dem Osziloskope nachgesehen, es kommen Signale zum Display, allerdings zeigt sich einfach nichts, hat jemand eventuell eine Idee wie ich mein Problem beheben könnte?

Danke schon im Vorraus für eventuelle Antworten.

FriLu
27.07.2006, 15:30
Hallo,
leider ist das LCD auf dem App-Bord fest verdrahtet, so das ein 2.tes LCD (parallel angeschlossen) so ohne weiteres nicht funzt.
Dazu braucht jedes LCD einen eigenen Enable.
Um die Betriebssytem-Routinen nutzen zu können, ist >Basteln< notwendig.(das System benutzt Port 15).
ALSO: Leitung von Port 15 zum App-Bord-LCD unterbrechen, einen (elektronischen) Umschalter bauen und anschliessen. Hab' den Link leider nicht, hier im Forum stand aber schon mal was dazu.
Zum beispiel mit UND-Gattern: Port 16(Licht) UND Port 15(Enable) -> enable 1.tes LCD;
Port 16 invertiert(also gegenphasiges Signal) UND Port 15 -> enable 2.tes LCD.

MfG Lutz

Reth
27.07.2006, 15:45
Okay, danke für die Antwort ^^ ich habe es schon irgendwie befürchtet (also so etwas in der Art)

DIE HARD
27.07.2006, 19:44
Hallo,


ich habe wiedereinmal ein kleines Problem mit meiner C-Control(M-Unit 2.0). Es ist folgendes: Für eine Anwendung möchte ich ein 4x20 Punktmatrix Display mit dem KS0066 ansteuern. Das ganze soll über die Digitalports laufen, wie dass bereits angeschlossene Display auf dem Application Board. Nun habe ich das 4x20 parallel zu dem bereits vorhandenen Display auf die gleichen Leitungen angeschlossen (RS: Port 14, RW: Port 13, E: Port 15, DB7 - DB 4: Port 12 bis Port 9, Versorgung klappt alles) nun verwende ich ein Programm welches mir einfach in einer Schleife etwas in die Zeilen schreiben soll, auf dem integrierten Display sieht man alles nur dass 4x20 zeigt nichts an. Nach dem Internet ist der KS0066 kompatibel zum HD74880 und so denke ich mir sollte die Ansteuerung mit dem Basic ++ Programm eigentlich funktionieren.


Eigentlich könnte es so wie du schreibst funktionieren, allerdings muss der
Kontrast zum LCD jeweils separat zugeführt werden.
Was das KS066 betrifft, kann ich zur Kompatibilität nichts sagen, aber dafür
zum KS0073, was aber womöglich auch für das KS066 gilt.
Durch die andere Initialisierung geht aber das zweizeilige evtl. nicht
mehr. -> Ausprobieren
-----------------------------------------------------------------
LCD mit KS0073 (nahezu HD44780 kompatibel)
-----------------------------------------------------------------
LCDs mit dem KS0073 Controller (z.B. DIP204-4) benötigen im
4-Zeilen Modus eine zusätzliche Initialisierung und haben ausserdem
eine andere Zuordnung von Adresse zu Zeile.

define LCDPORT byteport[2]
define OUTBYTE byte[1]
define LCDDATA byte[2]

print "#ON_LCD#";"#INIT#";
LCDDATA=&h24:gosub LCD_WRITECMD:pause 2
LCDDATA=&h09:gosub LCD_WRITECMD:pause 2
LCDDATA=&h20:gosub LCD_WRITECMD:pause 2
print"#L101#";"Z1";
print"#L133#";"Z2";
print"#L165#";"Z3";
print"#L233#";"Z4";
#lp
goto lp

'--------- ------WRITE HI NIBBLE LCD COMMAND ------------
#LCD_WRITECMD
OUTBYTE=(LCDDATA shr 4)
LCDPORT=OUTBYTE or &B01000000:LCDPORT=OUTBYTE and &B10111111
'--------------- WRITE LO NIBBLE ------------------------
OUTBYTE=(LCDDATA and &H0F)
LCDPORT=OUTBYTE or &B01000000:LCDPORT=OUTBYTE and &B10111111
return

Reth
28.07.2006, 09:54
Gut, ich habe das nun ausprbiert, aber das Display macht nichts :/ kann es sein dass ich die Anschlüsse falsch habe für dieses Programm (Anschlüsse sind wie oben erwähnt) der KS0066 is soweit ich weiss Kompatibel mit dem KS0073. Also, wie muss man das Display für diese Programm anschliessen?

DIE HARD
28.07.2006, 11:38
Gut, ich habe das nun ausprbiert, aber das Display macht nichts :/ kann es sein dass ich die Anschlüsse falsch habe für dieses Programm (Anschlüsse sind wie oben erwähnt) der KS0066 is soweit ich weiss Kompatibel mit dem KS0073. Also, wie muss man das Display für diese Programm anschliessen?


So wie du es beschreibst, sollte es korrekt angeschlossen sein.

FriLu
28.07.2006, 12:50
Hallo,
das mit dem Kontrast hatte ich vergessen :frown: (zu warm). Auf meinem App-Bord habe ich das LCD steckbar gemacht, das von C ist ja nicht so toll...
Also, der KS 0073 regelt den Kontrast gg. Vdd (5V), die meisten "normalen" gg. masse. // heisst: schleifer steht nahe Betriebsspannung beim KS0073
Beim Einschalten der Spannung muss!! -ohne Initialisierung- eine Reihe schwarzer Balken zu sehen sein, dreh mal am Kontrastpoti, da muss sich was tun. wenn nicht-> falsch/fehlerhaft angeschlossen oder defekt.
Bis bald... Lutz

Reth
28.07.2006, 14:06
Ja das mit der Versorgung klappt alles einwandfrei(Modul supply 5V, LCD Supply Ground und Beleuchtung einfach 5V), nur ich bekomme nichts (Schriftmässig) auf das Display, ich habe jetzt auch schon versucht das ganze binär anzusteuern, nach den Schema im Datenblatt, aber da tut sich auch nichts, ich werde es einmal bei einem anderen Aufbau versuchen in dem kein anderes Display ist ^^

PICture
28.07.2006, 16:27
Hallo Reth!

Schu mal, bitte, ins Datenblatt Deines Displays. Es könnte sein, dass es negative Kontrastspannung braucht.

MfG :)

FriLu
28.07.2006, 16:49
Hallo,
also ich habe mein App-Bord reaktiviert (benutze sonst eigene LP) aber leider nur ein 4x20 LCD blau/weiss mit Kontroller KS0073 gefunden.
mit dem nachstehenden Prog, ich weiss leider die Quelle nicht mehr,
mit Workbench1.18 und Basic++2006 in Kontroller geladen funktioniert die Anzeige.

DEFINE DB0 as Port[9]
DEFINE DB1 as PORT[10]
DEFINE DB2 as PORT[11]
DEFINE DB3 as PORT[12]
DEFINE RW as PORT[13]
DEFINE RS as PORT[14]
DEFINE EN as PORT[15]

define bit_RW as bit[1] ' Zwischenspeicher für RW-Status
define bit_RS as bit[2] ' Zwischenspeicher für RS-Status
define bit_Cursor as bit[3] ' gibt an, ob Cursor sichtbar = on
define bit_Blink as bit[4] ' gibt an, ob Cursor blinken soll = on
define bit_5 as bit[5]
define bit_6 as bit[6]
define bit_7 as bit[7]

define Zeile as byte ' globale Variable, die von LCD_POS() ausgewertet wird
define Spalte as byte ' globale Variable, die von LCD_POS() ausgewertet wird
define DATA as byte
define i as byte
define j as byte
' ---------------------------------------------
FUNCTION LCD_POS(Zeile as byte, Spalte as byte)
' Positioniert den Cursor, dannach kann ins LCD geschrieben werden.
' benutzt die Globalen Variablen bit_RW und bit_RS
bit_RW = RW ' den Status der Ports sichern
bit_RS = RS
RW = off ' Auf Befehlsmodus umschalten
RS = off ' Auf Schreibmodus umschalten
' nicht plausible Zeilenangaben abfangen
' IF (Zeile = 0 or Zeile > 4) THEN Zeile = 1
' nicht plausible Spaltenangaben abfangen
' IF (Spalte < 1 or Spalte > 20) THEN Spalte = 1
' Die Position ist nach Datenblatt KS0073:
' Zeile1 = 00h, Zeile 2 = 20h, Zeile 3 = 40h, Zeile 4 = 60h
' Die Variablen Zeile und Spalte werden missbraucht
Zeile = (Zeile -1) * 32 + (Spalte - 1) ' hier steht die LCD-Position
' siehe SET DDRAM Adress im Datenblatt (Seite 36)
' Daten schreiben, zuerst upper nibble, command bit 7 setzen
Spalte = ((Zeile shr 4) or 1000b) ' Bit 4 setzen, Bit 3 - 0 sind Teil der Position
' nibble auf Ports übertragen
BITSET(Spalte)
PULSE EN ' und senden
' lower nibble
' überflüssig, wird in BITSET behandelt: Spalte = (Zeile and 15) ' 1111
BITSET(Zeile)
PULSE EN
RS = bit_RS ' zurück in den ursprünglichen Zustand
RW = bit_RW '
END FUNCTION
' ---------------------------------------------
' setzt die Ports für die LCD-Ausgabe
FUNCTION BITSET(Muster as byte)
DB0 = MUSTER and 1
DB1 = MUSTER and 2
DB2 = Muster and 4
DB3 = Muster and 8
PAUSE 1
end function
' ----------------------------------------------
' schaltet einen blinkenden Cursor ein
FUNCTION DISPLAY_CURSOR()
'
bit_RS = RS ' Status sichern
bit_RW = RW
RS = off
RW = off
BITSET(0) ' upper nibble
PULSE EN
' CMD = 1/
' Display aus = 0, ein = 1
' Cursor aus = 0, ein = 1
' Blink aus = 0, ein = 1
BITSET ( ABS (bit_Cursor * 2 + bit_Blink - 12 ))
PULSE EN
RS = bit_RS ' RS restaurieren
RW = bit_RW ' RW restaurieren
end FUNCTION
' -------------------------------------------------
' ---------------------------------------------------
FUNCTION KS0073_INIT()
' Initialisierung des LCDs 4x20 mit Controller KS0073
LCD.INIT ' Standardinitialisierung
LCD.OFF ' sollte eigentlich gar nicht erforderlich sein
' RW = off ' immer off im Befehlsmodus
' RS = off ' immer off im Befehlsmodus
' 3x den 8-Bit-Modus mit Pause dazwischen aufrufen ------------------
BITSET(3) ' 0011
PULSE EN
pause 1
Pulse EN
pause 1
PULSE EN
' CMD: 4-Bit-Modus aufrufen ----------------------
BITSET(2) ' 00000010
PULSE EN
' von nun an sind upper und lower nibble getrennt zu senden
' CMD: Function Set - upper nibble
BITSET(2) ' 0010
PULSE EN
' lower nibble
' 2 Zeilen-Modus, RE-bit
BITSET(12) ' 1100
PULSE EN
' CMD: extended Function Set + RE ---------------------
' upper nibble
BITSET(0)
PULSE EN
' lower nibble
' Cmd, 5-dot-Font, normaler Cursor, 4-line-display
BITSET(9) '1001
PULSE EN
' ----------------------------------------------
' CMD: Function Set - upper nibble
BITSET(2) ' 0010
PULSE EN
' lower nibble
' 2 Zeilen-Modus, RE-bit-aus
BITSET(8) ' 1000 ' Eigentlich kein Smilie,Lutz
PULSE EN
' CMD: clear display -----------------------------------------
BITSET(0)
PULSE EN
BITSET(1) ' 0001
PULSE EN
' CMD: cursor display shift ------------------------------------------
' upper nibble
BITSET(1) ' 0001
PULSE EN
' lower nibble
' Cursor shift, R/L shift
BITSET(0)
PULSE EN
' CDM: display on/off control ------------------------------------------
' upper nibble
BITSET(0)
PULSE EN
' Cmd, Display ein, Cursor off, Blink off
BITSET(12) ' 1100
PULSE EN
END FUNCTION
' ---------------------------------------------------------------------
KS0073_init()
'----------------------------
#start
Pause 100
LCD.INIT switchonly
for i = 1 to 4
for j = 1 to 21 step 2
'pause 1
LCD_POS(i, j)
LCD.PRINT "*/"
next j
next i
pause 50
LCD.CLEAR
goto start
'----------------------------
attributes
end attributes

PS: Siehst du nach dem Einschalten -vor Init- 2 Reihen schwarze Balken?
wenn nicht, s.o.!
Lutz

Reth
28.07.2006, 18:37
Die 2 schwarzen Balken sehe ich nach dem Einschalten, aber mehr nicht mehr.

Danke, ich werd das Programm dann mal ausprobieren :)

FriLu
30.07.2006, 19:38
Hi,
Ich hab' ein "Datenblatt für LCD-Module" von Conrad mal rausgekramt, da steht drin, das der KS0066F00 !!baugleich!! mit HD44780 wäre und die Ansteuerung / Initialisierung identisch ist. Also muß eigentlich die Standard-Init funktionieren!
Der Unterschied zum KS0073 besteht ja im RE-Bit(Erweiterungsbit, was zusätzliche Funktionen ermöglicht), was bei der Init zum Umschalten in den 4-Zeilen-Modus gebraucht wird, andere Zeichen im CG-ROM sowie andere Zeilenanfangsadressen.
Das von mir reingestellte Prog für KS0073 dürfte dir also auch nicht weiterhelfen. Hast du die Chance, mal ein anderes LCD auszuprobieren(oder deins an einem anderen Controller) um HW-Fehler auszuschliessen?
Mit Ratlosen Grüssen
Lutz

Reth
31.07.2006, 08:54
Hmm das ist eine blöde Sache :/ ich hab nur diese Teile zur Verfügung, ein zusätzliches Display würde wieder kosten.. ojemine ...
Was sind HW-Fehler? ^^ Sry ich bin recht neu in diesen Gefilden...

FriLu
31.07.2006, 15:15
Tschuldigung, man kann mit den Abkürzungen auch übertreiben.
HW- Hardware. Also: HW-Fehler -> defektes Gerät.
MfG Lutz

PS: mir ist grad aufgefallen, du siehst die schwarzen Balken nach dem Einschalten; wenn die nach der Init weggehen, wäre das ja in Ordnung.
Übrigens, wie siehts mit der Spannungsversorgung aus, vlt. am Prog-anfang mal ne kleine pause einfügen.

Reth
02.08.2006, 12:30
Hmmm nach dem initialisieren verschwinden die Balken nicht :/ vorher ist allerdings etwas seltsames passiert: Ich habe das 4x20 an den Ports 1-8 und RS an 9, RW an 10 und E an 11 angeschlossen, die Beleuchtung des App. Board Displays wurde eingeschalten und es sind viele Zeichen auf das Display geschrieben worden....

Ich hab mittlerweile versucht die initialisierung Bitweise vorzunehmen, wie im Datenblatt beschrieben, code:


define RS as port[9]
define RW as port[10]
define E as port[11]

define DB0 as port[1]
define DB1 as port[2]
define DB2 as port[3]
define DB3 as port[4]
define DB4 as port[5]
define DB5 as port[6]
define DB6 as port[7]
define DB7 as port[8]

define i as byte

i = 0

'Initialisierung
'Function set
pause 10
RS = off
RW = off
E = on

DB0 = off
DB1 = off
DB2 = off
DB3 = off
DB4 = on
DB5 = off
DB6 = off
DB7 = off

'Initialisierung
'Display on/off control
pause 1
RS = off
RW = off
E = on

DB0 = on
DB1 = on
DB2 = on
DB3 = on
DB4 = off
DB5 = off
DB6 = off
DB7 = off

'Initialisierung
'Display clear
pause 1
RS = off
RW = off
E = on

DB0 = on
DB1 = off
DB2 = off
DB3 = off
DB4 = off
DB5 = off
DB6 = off
DB7 = off

'Initialisierung
'Entry mode set
pause 1
RS = off
RW = off
E = on

DB0 = on
DB1 = on
DB2 = on
DB3 = off
DB4 = off
DB5 = off
DB6 = off
DB7 = off

'Ins Display schreiben

do
E=on
pause 1
RS = on
RW = on

DB0 = off
DB1 = off
DB2 = on
DB3 = on
DB4 = off
DB5 = on
DB6 = off
DB7 = off

'Display shift, left

E=on
RS = off
RW = off

DB0 = on
DB1 = on
DB2 = on
DB3 = on
DB4 = on
DB5 = off
DB6 = off
DB7 = off

loop until i = 1


Funktioniert allerdings auch nicht :/

Bei deinem Programm wurde das Standard Display des App.Boards angesprochen, kann es sein dass dieses Display gar keinen HD74880 Controller hat?

Reth
02.08.2006, 14:22
Ich habs geschafft :D, das Problem war wohl entweder der Enable des App. Board Displays, oder die Pin Stecker die ich am Display angebracht habe waren zu improvisiert weswegen sie kurzschlüsse erzeugt haben ^^

Aber vielen dank für die Hilfe :)

FriLu
02.08.2006, 14:40
Also doch ein HW-Problem :cheesy: :cheesy: , allerdings anders als ich dachte;
Mangelnde Kontakte oder falsches Anschliessen kann kein Prog kompensieren. :roll:
na, dann viel spass, Lutz