Hallo,
nachdem ich mein miniCon537 ans laufen bekommen habe versuche ich ein
LC-Display anzusteuern. Kleinere Programme wie Lauflicht,A/D Wandler
starten und lesen funktionier wunderbar.Nur das mit dem Display will
nicht ganz funktionieren.
Initalisierung funktioniert mit allen Einstellungen. Ich schaffe es auch
in die erste Zeile,erste Spalte das gewünschte Zeichen zu schreiben.
Soweit so gut. Will ich aber die Adresse ändern um das Zeichen in die 2.
Spalte zu schreiben,dann wird es trotzdem an die selbe Stelle
geschrieben.Habe schon verschiedene LC´s ausprobiert mit dem selben
Controller. Selbst ein neues noch verschweißtes habe ich
ausprobiert.Immer das selbe.
Habe dann mal die Adresse per Hand immer geändert und 1 hochgezählt und
wieder neu gestartet.Hier das Ergebnis:
Adresse: Position:
#00H 1,1
#01H 1,1
#02H 1,1
#03H 1,1
#04H 1,1
#05H 1,2
#06H 1,1
#07H ---
#08H ---
#09H ---
#0AH ---
Ein sehr seltsames Verhalten.
Vielleicht ist irgendwo ein Fehler aber ich finde ihn nicht. Habe schon
alles andere nicht wichtige erstmal wieder entfernt.Da es auf jedem
Display mit dem selben Controller so ist, kann es nur an der
Programmierung liegen. Hardwaremäßige Fehler können eig. auch
ausgeschlossen werden da ja die Initalisierung und die erste Adresse
funktionieren.
Hier der Code dazu geschrieben mit µVision 4 in Assembler:
blutegel schrieb:> set_cursor:>> LCALL Busy> CLR RS> CLR RW> SETB E> MOV Datenport,R2 ;Cursor an Adresse setzen> LCALL ms164> CLR E> MOV Datenport,#00h ;Datenport wieder löschen> RET>> lcd_schreiben:> Lcall Busy> SETB RS> SETB E> MOV Datenport,R3 ;Daten schreiben> LCALL ms164> CLR E> Lcall ms164> CLR RS> MOV Datenport,#00H ;Datenport wieder löschen> RET
Versuch es mal mit einer anderen Reihenfolge der Ausgabe:
- RS, R/W und Datenport setzen
- erst dann Enable auf High
- nach kurzer Zeit (s. Datenblatt von LCD) Enable wieder auf Low
- das "Datenport wieder löschen" kannst du dir sparen
Hi,
erstmal danke für die Antwort. Leider funktioniert das nicht hatte ich
auch schon ausprobiert.Auch das mit den Zeiten bringt nichts.
Hier mal das Datenblatt:
http://cdn-reichelt.de/documents/datenblatt/A500/LCD162CBL%23EAS.pdf
Ich hatte erst die angegebenen 40µS aber damit kommt gar nichts auf
Display.
Ich habe mir über ein Terminal Programm(Hterm) angesehen was in den Code
Speicher geschrieben wird. Das Programm wiord richtig übertragen die
Adressen und Werte stehen korrekt dort drin. Hardware mäßig passt auch
alles.Die Controllerkarte und das Display stecken in einem 19" Gehäuse
und sind mit einer hinteren Platine über Messerleisten verbunden. Gibt
es vielleicht Probleme auf den Leitungen bzw. Störungen und wenn ja wie
kann ich das herrausfinden und beheben?
blutengel schrieb:> lcd_init:
Wenn das ein zum HD44780 kompatibles Display sein soll, ist die
Initialisierung daneben. Function Set ist z.B. 00110000b für den 8-bit
Mode und muss 3 mal mit bestimmten Pausen wiederholt werden. Das ist
aber im Datenblatt zum HD44780 nachzulesen.
Das könnte man mal ausprobieren. Leider steht im Dateblatt zum Display
nichts davon. Habe auch mal die Enable Leitung tickern lassen(siehe
Bild). 5V kommen an aber sehr sauber ist das Signal nicht. Kann das was
bedeuten?
Hallo,
die "Mutter" aller "Chip"- Datenblätter ist dieses hier für den HD44780:
https://www.sparkfun.com/datasheets/LCD/HD44780.pdf
Dein reales LCD hat bestimmt einen anderern (Nachfolger) verbaut. Diesen
solltest Du kennen, Dir das Datenblatt heraussuchen und mit dem Standard
HD44780 vergleichen !
Ich programmiere mein LCD4 Interface nach dem HD44780 und gestalte die
Zeitabhängigkeiten variabel, so dass bei der Konfiguration abweichungen
vom Timing zum HD44780 übergeben werden können.
Man beachte auch die Temperatur und die RC Oszillatorfrequenz im
Datenblatt.
blutengel schrieb:> Adresse: Position:> #00H 1,1> #01H 1,1> #02H 1,1> #03H 1,1
Bei der Position stimmt was nicht - mag mit dem Wochentag zuammen hängen
...
Vermutlich kennt jeder Dein "miniCon537" (außer mir) und weiß, was Du da
machst.
Praktisch wäre es, wenn Du (falls ungleich Troll) etwas mehr ddazu
erzählst ...
Karl M. schrieb:> die "Mutter" aller "Chip"- Datenblätter ist dieses hier für den HD44780
Man braucht nur hier im Forum auf HD44780 zu klicken und landet auf dem
DB.
Das miniCon ist ein 80c537 Entwicklungsboard. Was hier aber nicht
besonders wichtig ist meiner Meinung nach. Es ist genau so zu
programmieren wie fast jeder andere Controller aus der 8051er Familie.
blutengel schrieb:> Was hier aber nicht> besonders wichtig ist meiner Meinung nach. Es ist genau so zu> programmieren wie fast jeder andere Controller aus der 8051er Familie.
Ja, dann mach einfach mal ...
Noch eine andere Frage. Was sagt ihr zu dem Signal auf dem Oszi? In dem
High Anteil scheint eine kleine Störung zu sein. Könnte das schon etwas
bei der Übertragung beeinflussen?
blutengel schrieb:> Könnte das schon etwas> bei der Übertragung beeinflussen?
Nö, das ist völlig unkritisch. Anbei mal meine 44780 Init für 8052, ich
mach aber 4 Bit:
1
; LCD assignments for a standard HD44780 Display
2
; LCD is operated in 4-bit mode , using P1.0 up to P1.3 connected to DB4 to DB7 resp.
3
LCDRS BIT P1.7
4
LCDRW BIT P1.6
5
LCDE BIT P1.5
6
feature EQU 02Ch ; init byte for the LC-Display
7
; init the LCD . Hard job, this Hitachi controller....
8
; uses A,R6
9
initlcd: CLR LCDE
10
CLR LCDRW
11
CLR LCDRS
12
MOV R6,#03h
13
init1: MOV A,#50h ;wait long
14
LCALL swait ; give time
15
MOV A,#30h ;LCD feature set
16
LCALL LCDNIBL
17
DJNZ R6,init1
18
MOV A,#10h ;wait long
19
LCALL swait ; give time
20
MOV A,#feature ;LCD feature set
21
LCALL LCDNIBL
22
MOV A,#feature ;LCD feature set
23
LCALL LCDWRITE
24
MOV A,#08h ;LCD off, cursor blinking off and cursor off
25
LCALL LCDWRITE
26
MOV A,#06h ;Increment, no shift
27
LCALL LCDWRITE
28
MOV A,#01h ;LCD clear
29
LCALL LCDWRITE
30
MOV A,#10h ;wait long
31
LCALL swait ; give time
32
MOV A,#0Ch ;LCD on, cursor blinking and cursor off
33
LCALL LCDWRITE
34
MOV A,#02h ;LCD addr
35
LCALL LCDWRITE
36
MOV A,#08h ;wait long
37
LCALL swait ; give time
38
RET
39
; output The ACC in 4 bit nibbles to the LCD
40
; need to check busy flag
41
LCDWRITE: PUSH ACC
42
LCALL chkbsy ; lets wait for the busy flag
43
POP ACC
44
LCDW2: CLR LCDRS
45
CLR LCDRW
46
PUSH ACC ;save lowernibble
47
SWAP A ; rotate higher nibble into position
48
LCALL LCDW1
49
POP ACC
50
LCALL LCDW1
51
RET
52
LCDNIBL:
53
CLR LCDRS
54
CLR LCDRW
55
SWAP A ; rotate higher nibble into position
56
LCALL LCDW1
57
RET
58
59
; write character data to DDRAM
60
LCDASC: PUSH ACC
61
LCALL chkbsy ; lets wait for the busy flag
62
POP ACC
63
SETB LCDRS ; we want to write data
64
CLR LCDRW
65
PUSH ACC ;save lowernibble
66
SWAP A ; rotate higher nibble into position
67
LCALL LCDW1
68
POP ACC
69
LCALL LCDW1
70
RET
71
; write pattern data to CGRAM without translation table
Endlich läuft alles. Ich habe jetzt das Function Set 3x drin und die
Warteteiten alle größer 1ms. Ausserdem steht im Datenblatt etwas was ich
total übersehen habe.Und zwar beim setzen der Adresse möchte diese
Controller wohl immer das DB7 auf High ist. Ohne dieses Bit auf High zu
setzen ist keine vernüftige Adressierung möglich. Sehr setsam eig.Für
einen HD44780 kompatiblen Controller doch eher unüblich oder. Im orginal
Datenblatt steht es nicht drin das DB7 immer High sein muss.
blutengel schrieb:> Sehr setsam eig.Für> einen HD44780 kompatiblen Controller doch eher unüblich oder
Nö, absolut normal. Das original Datenblatt von Hitachi beschreibt das
Kommando Set DDRAM Adress genau so (Seite 24):