Forum: Mikrocontroller und Digitale Elektronik DDRAM Adressen Pollin 4x16 LCD


von Michael M. (eos400dman)


Lesenswert?

Hallo,

ich schaffe es einfach nicht die Adressen der dritten und vierten Zeile 
herauszufinden. Weiß die zufällig jemand? Wenn ich immer weiter 
Buchstaben sende schreibt er auch in diese Zeilen bloß würde ich gerne 
die Adresse wissen um direkt in die Zeile zu schreiben. Ich habe schon 
ein Programm geschrieben das einfach die Adresse hoch zählt und immer 
einen Buchstaben ausgibt. So habe ich aber nur Zeile 1 und 2 
herausfinden können.

Gruß und Dank im Voraus Michael

von Klaus W. (mfgkw)


Lesenswert?

Ich kenne jetzt dein Display und mag kaum glauben, daß die Adressen 
nicht im Datenblatt stehen, aber ich hatte mal ein 4x16 mit folgenden 
Adressen erfolgreich benutzt:
1
   Zeile 0 = 0x80 + 0x00
2
   Zeile 1 = 0x80 + 0x40
3
   Zeile 2 = 0x80 + 0x10
4
   Zeile 3 = 0x80 + 0x50

von Acer_Power (Gast)


Lesenswert?

Ich würde mal für die Zeilen 3 und 4 den zweiten Chip-Select-Eingang 
benutzen (OC2 oder so ähnlich)

von Michael M. (eos400dman)


Lesenswert?

Also hier mal das Datenblatt: 
http://www.pollin.de/shop/downloads/D120628D.PDF
Ich kann die Adresse nirgends finden.
Was ich schon weiß:
1
Zeile 0 = 0x80 + 0x60
2
Zeile 1 = 0x80 + 0x20

Acer_Power schrieb:
> Ich würde mal für die Zeilen 3 und 4 den zweiten Chip-Select-Eingang
> benutzen (OC2 oder so ähnlich)

Es gibt keinen CS-Eingang.

von Klaus W. (mfgkw)


Lesenswert?

Den gibt es bei 4*40, weil die letztlich zwei Controller haben.

von Michael M. (eos400dman)


Lesenswert?

Hat sonst noch jemand ne Idee woran es liegen kann?

Gruß Michael

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Michael Mayer schrieb:
> Was ich schon weiß:Zeile 0 = 0x80 + 0x60
>
> Zeile 1 = 0x80 + 0x20


Dann probiere mal 0x80 + 0x00 und 0x80 + 0x40

von Jürgen W. (juergen_w) Benutzerseite


Lesenswert?

Michael Mayer schrieb:
> Wenn ich immer weiter
> Buchstaben sende schreibt er auch in diese Zeilen bloß würde ich gerne
> die Adresse wissen um direkt in die Zeile zu schreiben.

Dann sende am besten den Zeichensatz. Etwa 80 Zeichen ab dem Buchstaben 
A.
Dann kannst du anhand der Ausgabe die Adressen bestimmen.

von Klaus W. (mfgkw)


Lesenswert?

Michael Mayer schrieb:
> Hat sonst noch jemand ne Idee woran es liegen kann?

Falsche Initialisierung?
Es gibt da irgendwo ein Bit, wo man zwischen einzeiligen und 
zweizeiligen unterscheiden kann (wobei das vierzeilige dann wohl als 
zweizeiliges durchgeht).

von Klaus W. (mfgkw)


Lesenswert?


von Klaus W. (mfgkw)


Lesenswert?

Klaus Wachtler schrieb:
> Es gibt da irgendwo ein Bit, wo man zwischen einzeiligen und
> zweizeiligen unterscheiden kann (wobei das vierzeilige dann wohl als
> zweizeiliges durchgeht).

Das ist
> 6). Function Set
>
> X: Do not care (0 or 1)
> DL: It sets interface data length.
> DL = 1: Data transferred with 8-bit length (DB7 - 0).
> DL = 0: Data transferred with 4-bit length (DB7 - 4).
> It requires two times to accomplish data transferring.
> N: It sets the number of the display line.
> N = 0: One-line display.
> N = 1: Two-line display.
> F: It sets the character font.
> F = 0: 5 x 8 dots character font.
> F = 1: 5 x 10 dots character font.
1
   RS RW DB7 DB6 DB5 DB4 DB3 DB2 DB1 DB0
2
   0  0   0   0   1   DL  N   F   X   X

von Michael M. (eos400dman)


Lesenswert?

Klaus Wachtler schrieb:
> Hier steht übrigens etwas mehr als in deinem Pollin-"Datenblatt":
> http://www.google.com/url?sa=t&source=web&cd=14&ve...
Danke! Ich habe jetzt die Adressen 80 C0 90 D0 heraus gesucht. Diese 
stimmen auch für die Zeilen, allerdings stehen die Buchstaben nicht ganz 
links sondern mittig in der Zeile. Erhöhe ich die Adresse wandern die 
Buchstaben nach rechts bis zum Rand und dann nochmal von der Mitte bis 
zum Rand.

von Programist (Gast)


Lesenswert?

Ich glaube du hast da ein grundlegendes Problem.0x80 ist der Befehl für 
den Kontroller, und die 0x00, 0x40, 0x10, 0x50 sind die Anfangsaddressen 
für die Zeilen.Du must sie zusammen addieren.Also wenn du in die Zeile 0 
schreiben willst dann gibst du 0x80 ein weil 0x00 + 0x80 = 0x80.Un so 
weiter.

von Michael M. (eos400dman)


Lesenswert?

Das ist mir schon klar. Bei den Displays von Reichelt hatte ich auch 
keine Probleme damit. Nur das von Pollin lauft nicht richtig.

von Programist (Gast)


Lesenswert?

Dann hast du ihn nicht richtig initialisiert.

von Michael M. (eos400dman)


Lesenswert?

Meine Initialisierung sieht so aus:
1
;**********Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
2
lcd_init:
3
           push  temp1
4
           ldi   temp3,6
5
powerupwait:
6
           rcall delay5ms
7
           dec   temp3
8
           brne  powerupwait
9
           ldi   temp1,    0b00000011   ; muss 3mal hintereinander gesendet
10
           out   LCD_PORT, temp1        ; werden zur Initialisierung
11
           rcall lcd_enable             ; 1
12
           rcall delay5ms
13
           rcall lcd_enable             ; 2
14
           rcall delay5ms
15
           rcall lcd_enable             ; und 3!
16
           rcall delay5ms
17
           ldi   temp1,    0b00000010   ; 4bit-Modus einstellen
18
           out   LCD_PORT, temp1
19
           rcall lcd_enable
20
           rcall delay5ms
21
           ldi   temp1,    0b00101000   ; 4 Bot, 2 Zeilen
22
           rcall lcd_command
23
           ldi   temp1,    0b00001100   ; Display on, Cursor off
24
           rcall lcd_command
25
           ldi   temp1,    0b00000001   ; Display on, Cursor off
26
           rcall lcd_command
27
           ldi   temp1,    0b00000100   ; endlich fertig
28
           rcall lcd_command
29
30
           pop   temp1
31
           ret

von Programist (Gast)


Lesenswert?

Weiss nicht genau, aber Ich glaube das ist nicht ganz richtig.
Vielleicht hilft dir das hier:

http://www.8052.com/tutlcd

von Michael M. (eos400dman)


Lesenswert?

Was denkst du wo genau was falsch ist?
Ich benutze die Routine schon länger und hatte nie Probleme.

Gruß Michael

von Programist (Gast)


Angehängte Dateien:

Lesenswert?

Du meinst, du hast diese routine mit einem anderen display benutzt und 
es hat richtig funktioniert? Dann weiss ich nicht, muss bei dem Display 
auch funktionieren.Ich meine wenn du schon was auf dem display sehen 
kannst, dann ist es ein kleines Problem.Wenn die Zeichen nicht am Anfang 
der Zeile sind dann sind bei dem Display warscheinlich die Addressen 
anders, aber die erste Zeile muss sowieso am 0x00 anfangen.
Dieses Display hat den SPLC780D1 cotroller.
http://tinsharp.en.alibaba.com/product/50485537-210513951/character_lcd_TC1604A_01_.html

von Michael M. (eos400dman)


Lesenswert?

Programist schrieb:
> Du meinst, du hast diese routine mit einem anderen display benutzt und
> es hat richtig funktioniert?
Ja genau. Danke für das PDF. Werde mich mal damit beschäftigen.

Gruß Michael

von Michael M. (eos400dman)


Lesenswert?

Wenn ich die Adresse 0x00 (welche ja das erste Zeichen in der ersten 
Zeile sein sollte) also das Kommando 0x80 sende steht der Text in der 
ersten Zeile aber in der Mitte der Zeile. Damit ich an den Anfang komme 
muss ich eine Adresse zwischen 0x20 und 0x2F verwenden. Aber es können 
doch nicht 16 Adressen für ein Feld des Displays sein, oder doch?

Gruß Michael

von holger (Gast)


Lesenswert?

>Damit ich an den Anfang komme
>muss ich eine Adresse zwischen 0x20 und 0x2F verwenden. Aber es können
>doch nicht 16 Adressen für ein Feld des Displays sein, oder doch?

Such mal nach einem Kurzschluss auf den Datenleitungen.
Vieleicht auch eine offene Leitung.

von Michael M. (eos400dman)


Lesenswert?

holger schrieb:
> Such mal nach einem Kurzschluss auf den Datenleitungen.
> Vieleicht auch eine offene Leitung.
Hab ich schon mehrfach und gerade noch mals. Kein Kurzschluss, keine 
Unterbrechung, keine vertauschten Leitungen.

Gruß Michael

von holger (Gast)


Lesenswert?

>> Such mal nach einem Kurzschluss auf den Datenleitungen.
>> Vieleicht auch eine offene Leitung.
>Hab ich schon mehrfach und gerade noch mals. Kein Kurzschluss, keine
>Unterbrechung, keine vertauschten Leitungen.

Wie ist die Pinbelegung vom LCD am Port?
Welche Taktfrequenz und welcher Controller?
Wenn du die Infos lieferst kann ich dir mal
ne HEX Datei zum testen schicken.

von Michael M. (eos400dman)


Angehängte Dateien:

Lesenswert?

Atmega 32 mit 4 Mhz Belegung des Displays im Anhang. Das mit den 
geteilten Datenleitungen geht leider nicht anders weil ich Den INT1 
brauche. Wäre echt nett wenn du mir den HEX Datei schicken würdest.

Gruß Michael

von holger (Gast)


Angehängte Dateien:

Lesenswert?

Probier mal.

von Michael M. (eos400dman)


Lesenswert?

Ich glaub ich spinne! Es funktioniert. Danke Holger! Jetzt musst mir 
bitte nur noch verraten was ich falsch mache.:)

von holger (Gast)


Lesenswert?

>Ich glaub ich spinne! Es funktioniert. Danke Holger! Jetzt musst mir
>bitte nur noch verraten was ich falsch mache.:)

Du hast die Pins am Port anders angeschlossen als
die Standard Libs es haben möchten. Deine DB7 Leitung
ist schuld. Da wirst du im Assemblercode wohl einiges
ändern müssen.

von Michael M. (eos400dman)


Lesenswert?

Ich hab meinen Code eigentlich angepasst hab ich zumindest gedacht.
1
mov temp3, temp1
2
andi temp3, 0b00001000
3
rol temp3
4
andi temp3, 0b00010000
5
or temp1, temp3
6
andi temp1, 0b11110111
Sollte doch eigentlich gehen, oder nicht?

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Michael Mayer schrieb:
> mov temp3, temp1
> andi temp3, 0b00001000
> rol temp3
> andi temp3, 0b00010000
> or temp1, temp3
> andi temp1, 0b11110111

Besser so:

 mov temp3, temp1
 andi temp3, 0b00001000
 lsl temp3
 andi temp1, 0b11100111
 or temp1, temp3

von spess53 (Gast)


Lesenswert?

Hi

Warum so kompliziert?
1
 bst temp1,3
2
 bld Temp1,4
3
 andi temp1, 0b11110111

MfG Spess

von Michael M. (eos400dman)


Lesenswert?

Danke nun läuft es auch mit meinem Programm.

Gruß Michael

von Klaus W. (mfgkw)


Lesenswert?

Dann könntest du bitte für den nächsten den genauen LCD-Typ und die 
korrekten Adressen spendieren ....

von Michael M. (eos400dman)


Lesenswert?

Also der Typ nennt sich: TC1604A-01
Zeile 1: 0x80
Zeile 2: 0xA8
Zeile 3: 0x90
Zeile 4: 0xD0

Gruß Michael

von spess53 (Gast)


Lesenswert?

Hi

>Zeile 2: 0xA8

Das wäre die DDRAM-Adresse 0x28. An der Stelle hat aber der SPLC780D1 
keinen.

Datenblatt S.7:

1.Zeile 0x00...0x27
2.Zeile 0x40...0x67

MfG Spess

von Falk B. (falk)


Lesenswert?

@  spess53 (Gast)

>>Zeile 2: 0xA8

>Das wäre die DDRAM-Adresse 0x28. An der Stelle hat aber der SPLC780D1
>keinen.

>Datenblatt S.7:

>1.Zeile 0x00...0x27
>2.Zeile 0x40...0x67

Bitleitungen vertauscht? In Hardware oder Software?

MFG
Falk

von Michael M. (eos400dman)


Lesenswert?

Weder noch. Die Texte und Kommandos komme ja alle richtig an.

von spess53 (Gast)


Lesenswert?

Hi

>Weder noch. Die Texte und Kommandos komme ja alle richtig an.

Na dann begründe mal deine Zeile in nicht vorhandenem DDRAM.

MfG Spess

von Michael M. (eos400dman)


Lesenswert?

Mein Fehler! Muss natürlich C0 statt A8 heißen. Hab erst jetzt gesehen 
das ich A8 geschrieben Habe. Sorry.

Gruß Michael

von spess53 (Gast)


Lesenswert?

Hi

Nachtrag:

>Weder noch. Die Texte und Kommandos komme ja alle richtig an.

Die kamen angeblich auch an als bei dir noch nicht berücksichtigt war, 
das DB7 nicht PD3 sondern an PD4 hängt.

MfG Spess

von Michael M. (eos400dman)


Lesenswert?

spess53 schrieb:
> Die kamen angeblich auch an als bei dir noch nicht berücksichtigt war,
> das DB7 nicht PD3 sondern an PD4 hängt.
Nicht ganz, da kamen die Kommandos falsch an.

von Klaus W. (mfgkw)


Lesenswert?

Also wie jedes 4x16 (soweit ich es bisher gesehen habe):

Zeile 1: 0x00
Zeile 2: 0x40
Zeile 3: 0x10
Zeile 4: 0x50
(jeweils zzgl. 0x80 für das Kommando)

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.