Forum: Mikrocontroller und Digitale Elektronik Nur 8 Zeichen auf LCD Displaytech 161A darstellbar. Defekt?


von Malte (Gast)


Lesenswert?

Guten Morgen,

kurze frage bzgl. Displaytech 161A von Reichelt.

Bei meinem LCD werden nur die ersten 8 Zeichen dargestellt. Einen 
'Sprung' nach Ausgabe des 8. Zeichens zur RAM-Adresse 40h (9. Zeichen) 
führt ebenfalls zu keinem Ergebnis. Den Cursor auf eine niedere Adresse 
(00h - 07h) zu setzen gelingt hingegen.
Meine Vermutung: Die 2. logische Zeile ist defekt. Dreht man nach dem 
Einschalten den Kontrast nach oben, so sind auch nur die ersten 8 
schwarzen Kästchen zu sehen.
Vielleicht hat ja einer ein baugleiches Display irgendwo verbaut und 
kann diese Beobachtung bestätigen. Dann liegt der Fehler wohl bei der 
Initialisierung.

Ein Timing-Problem schliesse ich aus, da auch bei einem Enable-Clk von 
1Hz dieses Problem weiterhin besteht.

Initialisierung geht wie folgt vonstatten:
1
Power ON (VDD=4.5V ; VDD-V0=4.2V*)
2
|
3
|
4
FunctionSet (4x)
5
LCD_Data<="00110000";
6
LCD_RS<='0';
7
LCD_RW<='0';
8
|
9
|
10
DisplayOff
11
LCD_Data<="00001011";
12
|
13
|
14
Clear
15
LCD_Data<="00000001";
16
|
17
|
18
EntryMode
19
LCD_Data<="00000110";
20
|
21
|
22
DisplayOn
23
LCD_Data<="00001111";
24
|
25
|
26
ZeichenSenden
27
LCD_Data<=.....
28
LCD_RS<='1';
* entspricht nicht dem Datenblatt, liefert aber optimales Ergebnis bei 
VDD=4.5V

Link zum Datenblatt:
http://www.compart.pl/Portals/0/pdf/lcd/displaytech/161a%20series-v11.pdf

Vielleicht hat ja jemand eine Idee. Ich bedanke mich im Voraus.

von Timex90 (Gast)


Lesenswert?

Malte schrieb:
> Die 2. logische Zeile ist defekt. Dreht man nach dem
> Einschalten den Kontrast nach oben, so sind auch nur die ersten 8
> schwarzen Kästchen zu sehen.

Also das ist auf jedenfall normal weil der LCD triber ja nicht weiß das 
du die zweite zeile auch noch verwenden willst. meine LCD's machen das 
auch immer so.

Hm..

mainloop:
  rcall  wait
  ldi  r16,'t'
  rcall  lcdData
  ldi  r16,'e'
  rcall  lcdData
  ldi  r16,'s'
  rcall  lcdData
  ldi  r16,'t'
  rcall  lcdData

  rcall  lcdLine2

  ldi  r16,'h'
  rcall  lcdData
  ldi  r16,'u'
  rcall  lcdData
  ldi  r16,'h'
  rcall  lcdData
  ldi  r16,'o'
  rcall  lcdData
  ldi  r16,'t'
  rcall  lcdData
  ldi  r16,'z'
  rcall  lcdData


  rcall  lcdHome

  rjmp  mainloop

;----------------------------------------------------------------------- 
----
wait:  push  r24
  ldi  r24,0x13
w1:  subi  r24,0x01
  rcall  wait20ms
  brcc  w1
  pop  r24
  ret
;----------------------------------------------------------------------- 
----
wait5ms:  ldi  r16,255
  ldi  r17,26
w5ms:  dec  r16
  brne  w5ms
  dec  r17
  brne  w5ms
  ret
;----------------------------------------------------------------------- 
----
wait20ms:  ldi  r16,255
  ldi  r17,104
w20ms:  dec  r16
  brne  w20ms
  dec  r17
  brne  w20ms
  ret
;----------------------------------------------------------------------- 
----
lcdInit:  sbi  ioDDRD,2  ; LCD RS = OUT
  sbi  ioDDRD,3  ; LCD E  = OUT
  sbi  ioDDRD,4  ; LCD D4 = OUT
  sbi  ioDDRD,5  ; LCD D5 = OUT
  sbi  ioDDRD,6  ; LCD D6 = OUT
  sbi  ioDDRD,7  ; LCD D7 = OUT
  cbi  ioPORTD,2  ; LDC RS = Low

  ldi  r18,20
powerUp:  rcall  wait5ms
  dec  r18
  brne  powerUp


  ldi  r16,0b00110000
  out  ioPORTD,r16
  rcall  lcdEnable
  rcall  wait5ms
  ldi  r16,0b00110000
  out  ioPORTD,r16
  rcall  lcdEnable
  rcall  wait5ms
  ldi  r18,100
resetLCD:
  nop
  nop
  nop
  dec  r18
  brne  resetLCD
  ldi  r16,0b00110000
  out  ioPORTD,r16
  rcall  lcdEnable
  rcall  wait5ms


  ldi  r16,0b00100000
  out  ioPORTD,r16
  rcall  lcdEnable
  rcall  wait5ms
  ldi  r16,0b00101000
  rcall  lcdCmd
  rcall  lcdOff
  rcall  lcdClear
  ldi  r16,0x06
  rcall  lcdCmd
  rcall  lcdOn
  ret
;----------------------------------------------------------------------- 
----
lcdData:  ldi  r18,0b0000100
  rjmp  lcdOut
;----------------------------------------------------------------------- 
----
lcdCmd:  ldi  r18,0b0000000
lcdOut:  mov  r17,r16
  swap  r17
  andi  r16,0b11110000
  or  r16,r18
  andi  r17,0b11110000
  or  r17,r18
  out  ioPORTD,r16
  rcall  lcdEnable
  out  ioPORTD,r17
  rcall  lcdEnable
  rcall  wait5ms
  ret
;----------------------------------------------------------------------- 
----
lcdEnable:  sbi  ioPORTD,3
  nop
  nop
  nop
  cbi  ioPORTD,3
  ret
;----------------------------------------------------------------------- 
----
lcdClear:  ldi  r16,0b00000001
  rcall  lcdCmd
  rcall  wait5ms
  ret
;----------------------------------------------------------------------- 
----
lcdOff:  ldi  r16,0b00001000
  rcall  lcdCmd
  rcall  wait5ms
  ret
;----------------------------------------------------------------------- 
----
lcdOn:  ldi  r16,0x0E
  rcall  lcdCmd
  rcall  wait5ms
  ret
;----------------------------------------------------------------------- 
----
lcdHome:  ldi  r16,0b00000010
  rcall  lcdCmd
  rcall  wait5ms
  ret
;----------------------------------------------------------------------- 
----
lcdLine1:  ldi  r16,0b10000000
  rcall  lcdCmd
  rcall  wait5ms
  ret
;----------------------------------------------------------------------- 
----
lcdLine2:  ldi  r16,0b11000000
  rcall  lcdCmd
  rcall  wait5ms
  ret
;----------------------------------------------------------------------- 
----

lcdGoto:  ori  r16,0b10000000
  rcall  lcdCmd
  rcall  wait5ms
  ret
;----------------------------------------------------------------------- 
----

also dieser ASMc funzt auf jeden fall mit Line2

von Timex90 (Gast)


Lesenswert?

stopp sorry das ist ein code für HD44780 Displays muss den anderen mal 
suchen wo ich den hab .... die ansteuerung ist auf jedenfall 4bit
den rest auf GND....

von eProfi (Gast)


Lesenswert?

Schreibe einfach den ganzen Displayspeicher voll und schaue, ob / was 
die 2. Zeile anzeigt.

von Anja (Gast)


Lesenswert?

Malte schrieb:
> Meine Vermutung: Die 2. logische Zeile ist defekt. Dreht man nach dem
> Einschalten den Kontrast nach oben, so sind auch nur die ersten 8
> schwarzen Kästchen zu sehen.

Wenn nur 8 Kästchen zu sehen sind ist die 2. Zeile nicht initialisiert.
-> Umschalten in der Initialisierung auf 2-zeiligen Betrieb fehlt.

Gruß Anja

von MaWin (Gast)


Lesenswert?

LCD_RW<='0';
|
|
2zeilig
LCD_Data<="00111000";
|

von Mustermann (Gast)


Lesenswert?

Hey Malte,

dein Display ist ein 2-Zeilen Display.

Adresse $00 - $07 sind die ersten 8 Zeichen auf dem Display.
Adresse $40 - $47 sind die letzten 8 Zeichen auf dem Display.

Ist blöd aber geht nicht anders.

Gruß Mustermann

von Malte (Gast)


Lesenswert?

Zunächst einmal vielen Dank für die überwältigende Resonanz. In so 
kurzer Zeit hätte ich nicht mit so vielen konstruktiven Vorschlägen 
gerechnet.

Der Hinweis von Marwin führte zum Erfolg. Ich meinte eigentlich, die 
Initalisierung mit FunctionSet 0011100 (2. Zeile aktivieren) bereits 
erfolglos versucht zu haben, hatte dabei aber nicht bedacht, dass der 
Controller nach dem Einschalten mit insgesamt 4 FunctionSets 
initialisiert werden muss. Bit 2(F) und 3(N) werden erst beim finalen 
FunctionSet verarbeitet (siehe Datenblatt).

Nochmals Danke!

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.