Forum: Mikrocontroller und Digitale Elektronik Pollin LCD TC1602 funktioniert mit eigenem Code nicht


von Timo G. (timo1983)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
ich bin am Verzweifeln. Ich habe das Pollin-Eval-Board + Addon-Board und 
arbeite gerade das ASM-Tutorial durch und bin nun beim LCD-Display 
angelangt.
Nur irgendwie will mein Code nicht so recht funktionieren. Ich habe 
bereits das Tesprogramm durchlaufen lassen. Ohne Probleme, jedoch mein 
eigener Code und der Code von der Webseite (mit den angepassen Ports) 
funktioniert leider nicht. Das Display wird vermutlich initialisiert 
(Kontrast ändert sich), aber es erscheinen keine Zeichen.
Bin ich zu dumm, oder ist dieser LCD-Controller doch nicht kompatibel 
mit dem des Tutorials? Vielleicht ist im Code auch ein Fehler..
Ich versuche im 4-Bit Modus zu arbeiten:
PA4-7 -> DB4-7
R/W -> GND
PA1 -> Enable
PA2 -> RS

Ich hoffe ihr könnt mir helfen.

von Timo G. (timo1983)


Lesenswert?

Wie man sehen kann habe ich das Delay schon deutlich erhöht.
Ich weiß irgendwie nicht, wie ich weiter machen soll.
Es ist doch komisch, dass das Pollintestprogramm tadellos funktioniert, 
aber der Code der Webseite überhaupt nicht. Die Portanschlüsse habe ich 
zig mal kontrolliert. Es hätte dann ja auch nciht mit dem 
Pollintestprogramm klappen sollen, wenn ich zu blöd wäre, den Kontroller 
richtig anzuschließen.
Help, Danke!

von Timo G. (timo1983)


Lesenswert?

Kann mir keiner helfen??
Vllt. einen Tipp?
Danke im Voraus!!
Gruß

von Thomas F. (igel)


Angehängte Dateien:

Lesenswert?

; 4-Bit  2 Zeilen  5x8
  push lcd_reg
  ldi lcd_reg, 0b10000010
  rcall lcd_command
  ldi lcd_reg, 0b11000000
  rcall lcd_command
  ldi lcd_reg, 0b01000000
  rcall lcd_command
  pop lcd_reg

Das kommt mir seltsam vor. Bit7 ist für die RAM-Adresse zuständig und 
hat in der init nichts zu suchen.

Ich habe dir mal meine Lib für dieses Display angehängt. Läuft auf einem 
Atmega8 mit 1Mhz.

Thomas

von Timo G. (timo1983)


Lesenswert?

Tja, was soll ich sagen?
Mit deinem Code zeigt das Display leider garnichts an. Ich bin gestern 
soweit gekommen, dass ich mit eigenem Code zumindest wirre Zeichen 
anzeigen lassen konnte. Das Display verwendet einen SPLC780D-Controller 
ich habe mich am Datenblatt entlang gehangelt, werde aber aus einigen 
Sachen nicht so ganz schlau. Auf Seite 9 steht die Prozedur für einen 
4-Bit Modus, jedoch steht dort man müsse nur ein Nibble (0b0010) senden 
(Schritt 2). Auf Seite 11 steht man müsse 3 mal ein Nibble (0b0011) 
senden. Verwechsle ich das was mit dem internen Reset?

Vielen Dank für eure Hilfe.
Gruß
Timo

von Timo G. (timo1983)


Angehängte Dateien:

Lesenswert?

ENDLICH!!! Der 8-Bit-Modus funktioniert!!
Na, dann werde ich es jetzt nochmal mit dem 4-Bit-Modus probieren.
Dann solls wohl klappen.
Vllt. kann dem einen oder anderen meine Datei helfen.
Ist, wie man sieht, nur zum Testen da.

von Thomas F. (igel)


Lesenswert?

> Mit deinem Code zeigt das Display leider garnichts an.

Hast du den Port, Rs, RW und EN an deine Beschaltung angepasst?

von Timo G. (timo1983)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
also nun funktioniert auch der 4-Bit Modus. Warum es bei mir nicht 
funktioniert hat, lag wohl am anderen Controller. Mein display verwendet 
den SPLC780D von Sunplus; das steht zumindes auf der Herstellerseite 
www.oppod.com! Das ist aber nicht alles, wenn ich mich am Datasheet von 
Sunplus halte, dann kann ich die Zeilenanzahl nicht einstellen.
Verwende ich aber das Manual, welches oppod bereitstellt und sehr 
unterschiedlich im Vergleich zu dem von Sunplus ist (vgl. Bilder), dann 
geht auf einmal alles wunderbar....
Das kann doch wohl nicht sein.. Gerade als Anfänger ist sowas nen riesen 
Stein im Weg.

Man vergleiche beide Codes (1. meiner & 2. der vom Tutorial):
!!! Nicht wundern die Nibbles sind vertauscht!!! PA4-7 -> DB 4-7
1
  ; 3-Mal / Kann weggelassen werden...
2
  ldi tmp, 0b00110000
3
  out PORTA, tmp
4
  rcall en
5
  rcall en
6
  rcall en
1
           ldi temp1, 0b00000011        ; muss 3mal hintereinander gesendet
2
           out PORTD, temp1             ; werden zur Initialisierung
3
           rcall lcd_enable             ; 1
4
           rcall delay5ms
5
           rcall lcd_enable             ; 2
6
           rcall delay5ms
7
           rcall lcd_enable             ; und 3!
8
           rcall delay5ms
Die Codes sind im Grunde gleich, jedoch kann ich bei mir das Senden auch 
weglassen, es funktioniert genauso.

1
  ; 4-Bit
2
  ldi tmp, 0b00100000
3
  out PORTA, tmp
4
  rcall en
5
  rcall en
1
           ldi temp1, 0b00000010        ; 4bit-Modus einstellen
2
           out PORTD, temp1
3
           rcall lcd_enable
4
           rcall delay5ms
exakt gleich!

1
  ; 4-Bit / 1-Zeile
2
  ldi tmp, 0b10000000
3
  out PORTA, tmp
4
  rcall en
1
           ldi temp1, 0b00101000        ; 4Bit / 2 Zeilen / 5x8
2
           rcall lcd_command
Hier unterscheiden sich beide Befehle stark!!

1
  ; Display on / Cursor on / Blink on
2
  ldi data, 0b00001111
3
  rcall lcd_cmd
1
           ldi temp1, 0b00001100        ; Display ein / Cursor aus / kein Blinken
2
           rcall lcd_command
Dasselbe! nur ich verwende einen blinkenden Cursor

1
  ; Entry-Mode: Inc by 1
2
  ldi data, 0b00000010
3
  rcall lcd_cmd
1
           ldi temp1, 0b00000100        ; inkrement / kein Scrollen
2
           rcall lcd_command
3
           ret
Auch wieder ein starker Unterschied!


Da ich nicht genau weiß warum dies nun so ist, kann ich die Unterschiede 
auch schlecht begründen, dennoch hoffe ich, dass ich dem einen oder dem 
anderen damit helfen konnte!! Vielleicht meldet sich ja noch jmd der 
Pros :-)

Danke für die Hilfe!
Gruß
Timo

von Timo G. (timo1983)


Angehängte Dateien:

Lesenswert?

- hier noch die asm-Datei -

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.