Forum: Mikrocontroller und Digitale Elektronik Adressierungsproblem mit LC-Display


von blutengel (Gast)


Lesenswert?

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:
1
$INCLUDE (reg517aw.inc)
2
3
4
5
6
7
DS 32  ;32 Bytes für Stack reservieren
8
cseg at 0000h
9
ljmp start
10
11
12
13
E      EQU  P4.7            ;Enable Signal für LCDisplay
14
RW      EQU  P4.6            ;Read/Write Signal LCDisplay
15
RS      EQU  P4.5            ;Register Select Signal LCDisplay
16
Datenport  EQU  P6                      ;Datenleitungen für LCDisplay
17
18
19
      
20
;............................................................................
21
start:
22
      MOV SP,#2FH   ;Stackbeginn bei 30H, oberhalb des
23
            ;Bitspeicherber. im unt. int. RAM 
24
25
26
      mov Datenport,00000000b     ;Datenport und Steuersignale löschen
27
      CLR E
28
      CLR RW
29
      CLR  RS
30
      LCALL lcd_init        ;Display initalisieren
31
    
32
33
34
    MOV R2,#01h    ;Adresse 1.Zeile,2,Spalte
35
    LCALL set_cursor
36
    MOV R3,#035h  ;Es soll die Zahl 5 angezeigt werden    
37
    LCALL lcd_schreiben  
38
39
  
40
41
JMP $  
42
;..................................................................................  
43
set_cursor:
44
45
      LCALL Busy
46
      CLR RS
47
      CLR RW
48
      SETB E
49
      MOV Datenport,R2  ;Cursor an Adresse setzen
50
      LCALL ms164
51
      CLR E
52
      MOV Datenport,#00h ;Datenport wieder löschen
53
RET
54
55
lcd_schreiben:
56
      Lcall Busy    
57
      SETB RS
58
      SETB E
59
      MOV Datenport,R3   ;Daten schreiben
60
      LCALL ms164
61
      CLR E
62
      Lcall ms164
63
      CLR RS
64
      MOV Datenport,#00H  ;Datenport wieder löschen
65
RET
66
Busy:
67
      mov  R7,#03fh  ;Zeitschleife, wenn Busy-Abfrage
68
      djnz  R7,$  ;Hardwaremäßig nicht möglich
69
              
70
RET
71
72
lcd_init:
73
74
      LCALL ms15
75
76
      
77
      SETB E
78
      MOV Datenport,#00111000B ;Funktionset
79
      LCALL ms004
80
      CLR E
81
82
      SETB E
83
      MOV Datenport,#00001100B ;Display on
84
      LCALL ms004
85
      CLR E
86
87
      SETB E
88
      MOV Datenport,#00000001B ; Clear Display
89
      LCALL ms164
90
      CLR E
91
92
      SETB E
93
      MOV Datenport,#00000110B ;Entry Mode
94
      LCALL ms004
95
      CLR E
96
97
      RET
98
;...................Warteschleifen
99
Warte: ;1s
100
101
    MOV R1,#0FFH
102
M2:    MOV R0,#0FFH
103
M1:    DJNZ R0,M1
104
    DJNZ R1,M2
105
106
    RET
107
108
ms15:  ;15ms
109
        push PSW
110
        push 0
111
        push 1
112
        mov 1,#114
113
ws0_labelB1:
114
        mov 0,#37
115
ws0_labelB0:
116
        nop
117
        nop
118
        nop
119
        nop
120
        nop
121
        djnz 0,ws0_labelB0
122
        djnz 1,ws0_labelB1
123
        pop 1
124
        pop 0
125
        pop PSW
126
        ret
127
128
ms164:;1,64ms
129
        push psw
130
        push 0
131
        mov  0,#232
132
ws0_labelA:
133
        nop
134
        nop
135
        nop
136
        nop
137
        nop
138
        djnz 0,ws0_labelA
139
        nop
140
        nop
141
        pop 0
142
        pop psw
143
        ret
144
ms004: ;40µs
145
        push psw
146
        push 0
147
        mov  0,#13
148
ws0_labelc:
149
        djnz 0,ws0_labelc
150
        pop 0
151
        pop psw
152
        ret
153
154
END

von John (Gast)


Lesenswert?

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

von blutengel (Gast)


Lesenswert?

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.

von blutengel (Gast)


Lesenswert?

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?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

: Bearbeitet durch User
von blutengel (Gast)


Angehängte Dateien:

Lesenswert?

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?

von Karl M. (Gast)


Lesenswert?

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.

von Dieter F. (Gast)


Lesenswert?

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 ...

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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.

: Bearbeitet durch User
von Karl M. (Gast)


Lesenswert?

Danke Matthias,

zeigt mein Browser so nicht an..

von blutengel (Gast)


Lesenswert?

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.

von Dieter F. (Gast)


Lesenswert?

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 ...

von blutengel (Gast)


Lesenswert?

8051er Controller sagen dir aber was?

von Dieter F. (Gast)


Lesenswert?

blutengel schrieb:
> 8051er Controller sagen dir aber was?

Ja, Dir auch?

von blutengel (Gast)


Lesenswert?

Dann verstehe ich dein Problem nicht. Alle anderen hatten wenigstens 
vernünftige Lösungsansätze.

von Dieter F. (Gast)


Lesenswert?

blutengel schrieb:
> Dann verstehe ich dein Problem nicht.

Ich habe kein Problem - Du etwa?

von blutengel (Gast)


Lesenswert?

Troll Alarm !!!!

von Dieter F. (Gast)


Lesenswert?

blutengel schrieb:
> Troll Alarm !!!!

Ja - Freitag halt.

von blutengel (Gast)


Lesenswert?

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?

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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
72
LCDDATA: PUSH   ACC
73
        LCALL   chkbsy    ; lets wait for the busy flag 
74
        POP     ACC
75
        SETB    LCDRS       ; we want to write data
76
        CLR     LCDRW       
77
        PUSH    ACC        ;save lowernibble
78
        SWAP    A           ; rotate higher nibble into position
79
        LCALL   LCDW1
80
        POP     ACC
81
        LCALL   LCDW1
82
        RET  
83
;Main Output routine to 4 bit LCD       
84
LCDW1:  
85
        MOV     savelcd,P1    ; Get Port
86
        ANL     savelcd,#0f0h
87
        ANL     A,#0Fh     ;mask out
88
        ORL     A,savelcd
89
        MOV     P1,A        ; write out to port
90
        NOP                   ; give time
91
        SETB    LCDE        ;Enable operation
92
        NOP                 ; give time
93
        NOP                 ; give time
94
        NOP                   ; give time
95
        NOP                   ; give time
96
        CLR     LCDE        ; announce end of first nibble
97
        NOP                 ; give time
98
        NOP                 ; give time
99
        RET
100
chkbsy: 
101
        LCALL   READLCD
102
        JB     ACC.7,chkbsy
103
        RET
104
105
;Returns LCDData in ACC
106
READLCD: ORL    P1,#0Fh    ;prepare input
107
        CLR     A 
108
        CLR     LCDRS       ; Read from REGS
109
        SETB    LCDRW       ;read operation
110
        SETB    LCDE        ; enable operation
111
        NOP
112
        NOP
113
        MOV     A,P1
114
        SWAP    A
115
        ANL     A,#0F0h     ;Mask data
116
        MOV     savelcd,A   ; store in between
117
        CLR     LCDE
118
        SETB    LCDE        ; enable operation
119
        NOP
120
        NOP
121
        MOV     A,P1
122
        CLR     LCDE
123
        ANL     A,#0Fh     ;Mask data
124
        ORL     A,savelcd
125
        RET
126
; WOZ'S WAIT ROUTINE
127
; extended version is ACC^3
128
swait:  CLR     C
129
DEL3:  PUSH     ACC
130
DEL1:   PUSH    ACC
131
DEL2:   SUBB    A,#01h
132
         NOP
133
        JNC     DEL2
134
        POP     ACC
135
        CLR     C
136
        SUBB    A,#01h
137
        JNC     DEL1
138
        POP     ACC
139
        CLR     C
140
        SUBB    A,#01h
141
        JNC     DEL3
142
        RET

: Bearbeitet durch User
von blutengel (Gast)


Lesenswert?

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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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):
1
RS     R/W      DB7     DB6  DB5  DB4  DB3  DB2  DB1  DB0 
2
0       0       1       ADD  ADD  ADD  ADD  ADD  ADD  ADD  Sets DDRAM address.

: Bearbeitet durch User
von blutengel (Gast)


Lesenswert?

Stimmt muss wohl in der Zeile verrutscht sein. Vielen Dank nochmal an 
alle.

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.