Forum: Mikrocontroller und Digitale Elektronik LCD Pollin T6963C Controller


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Guten Abend,
wer kennt sich denn mit so einem Ding aus? Ich habe einen 8051 an so 
einen Controller geklemmt und komm an einer Stelle nicht weiter.
Was funktioniert?
Initialisierung, Display Löschen, Grafikbyte reinschreiben.
Was nicht: Cursor positionieren.
Ich habe das mal vereinfacht zum Testen. Mein Grafikbereich  beginnt bei 
0000. Vor der Main rufe ich die Folge

 lcd_send_data(0x00);
 lcd_send_data(0x06);
 lcd_send_cmd(0x24);

auf, was den Cursor an die sechste Stelle der ersten Zeile bewegt. 
Toll!! Aber die Reihenfolge ist schon nicht wie in der Doku, erst kommt 
das LSB, dann das MSB.
Das also wäre nun Adresse 0600 und nicht 0006, trotzdem bin ich da wo 
ich hin will.
Nun will ich in die Mitte des Displays, also 16 Zeilen runter, jede hat 
16 Byte. Heißt also 256 Bytes weiter,also 0106 etwa. Wenn ich nun aber 
01 und 06 sende lande ich wieder in der ersten Zeile.
Warum ??
Wenn ich den Bereich  0200 als Grafikbereich wähle geht gar nix, da 
lande ich wasweißichwo.
Ich habe mehrerer Dokumente schon gefunden die alle irgendwie ähnlich 
sind und das genau so gemacht wie da angesagt. Bin aber nun 
steckengeblieben.
Wer kann mal kurz den entscheidenen Tip geben?
Danke, Gruss
Thomas

von Michael U. (Gast)


Lesenswert?

Hallo,

ich habe zwar keine Ahnung, wo Du die Daten her hast, aber das 
Datenblatt des T6963C sagt doch auch eindeutig bei Kommando 0x24: Data1: 
Low-Adress, D2 High-Adress...
0x24 setzt auch keinen Cursor, sondern den Adress-Pointer.
Wo Du Dich dann auf dem Display rumtreibst, hangt davon ab, wie Du den 
Grafikbereich programmiert hast, also wie der darzustellende Bereich im 
Display-Ram abgebildet wird.

Du hast die Anzahl Spalten auch richtig gesetzt?
Du hast ein 96x32 Pixel Display?
Lese ich zumindest aus Deinen Angaben (Mitte bei 16. Zeile und 16 Byte 
pro Zeile) raus?

Gruß aus Berlin
Michael

von Thomas (Gast)


Lesenswert?

Hallo Michael,
sehe ich genau so, wenn ich aber die richtige Reihenfolge einhalte lande 
ich immer in der ersten Zeile am Anfang. Den Grafikbereich habe ich bei 
0000 hingelegt, ich sagte ja schon daß ich bei anderen Startadressen 
ganz woanders bin und nix sehe. Ich schreibe kontinuierlich rein, nach 
einigen Sekunden (wenn der Zwischenbereich wohl gefüllt ist) sehe ich 
dann etwas im Display.
Ich habe (Code war angehängt) ein 128x64 Display. Dieses hat nach meinem 
Verständnis 16 Bytes pro Zeile und 64 Zeilen. Also sollte ich bei 256 
(0x0100) in der 16. Zeile landen, stimmt das?

Gruss aus Hofheim im Taunus unddank erst mal..

Thomas

von Thomas (Gast)


Lesenswert?

Hallo nochmal,
ich habs nochmal durchgespielt:
erst 01, dann 06: erste Zeile, Zeichen 6
erst 06, dann 01: erste Zeile, Zeichen 1 (jeweils mit Zeichen 0 als ganz 
linkes).

Hä?? Was sagt mir das nun? Ist meine Intitialisierung falsch?

Thomas

von Michael U. (Gast)


Lesenswert?

Hallo,

naja, mit den 128 stimmt natürlich, da konnte ich nicht kopfrechnen...

Ist schon ein paar Tage her mit dem T6963C, also ivh versuche es mal:

Du legst mit Set Graphic Home Address (0x42) den Beginn des 
Grafikbereiches fest, das ist also die Adresse, die links oben 
dargestellt wird.
Dann mit Set Graphic Area (0x43) die Anzahl Spalten in der Zeile fest.
Die ist maximal (Displaybreite deines Displays / Char Font Size), 
jenachdem, wie Du also FontSize eingestellt hast, 6 oder 8, bei 8 also 
16, bei 6 sind es 21 Spalten, da werden die letzten Pixel nicht mehr 
dargestellt.

Dann noch den Mode und Displaymode setzen, OR-Verknüpft, Grafik On, Text 
Off vermutlich, ich habe meins immer kombiniert mit Text und Grafik 
betrieben, weiß also jetzt nicht sicher, wie das Verhalten bei nur 
Grafik ist.
Die erste Zeile beginnt dann bei Graphic Home Address, die nächste bei 
Graphic Home Address + Anzahl Spalten usw.

Bei FonzSize = 8 ist das noch übersicht lich, bei 6 ist etwas mehr 
Rechnerei dabei im Grafikmode.

Ansonsten zeig doch mal Deine Init-Routine, vielleicht fällt mir da noch 
was auf.

Gruß aus Berlin
Michael

von Michael U. (Gast)


Lesenswert?

Hallo,

hab gerade gesehen, Source hing ja oben dran.
Sieht eigentlich ganz gut aus.

Gruß aus Berlin
Michael

von Thomas (Gast)


Lesenswert?

Hi Michael,
ich hexe hier herum.  Mit diesem Kommando

lcd_send_data(0x06);   //first low then high byte
lcd_send_data(0xF0);
lcd_send_cmd(0x24);

komme ich ans zweite Viertel des LCDs, aber nicht in Spalte 6 sondern an 
den Anfang. Da sind doch schon MSB und LSB vertauscht, oder? Ich habe 
die INIT Routine auch nochmal verändert, von anderen abgeschrieben. 
Effekt ist derselbe.
Mit dem F0 sollte ich doch SEITEN weit wegspringen, wieso sind  die  da 
vertauscht? Ich kann nicht weiter als das erste Viertel springen, wenn 
ich weiter als FF will komm ich wieder in der ersten Zeile heraus. Kann 
jemand das erklären?

Gruss

Thomas

von Thomas (Gast)


Lesenswert?

Ach noch etwas: ich hab die Schaltung zweimalk mit zwei LCDs aufgebaut 
und bekomme zweimal dasselbe Ergebnis. HW Probleme sollten 
ausgeschlossen sein, Pin 18 ist auf Masse (8 Bit).

von Michael U. (Gast)


Lesenswert?

Hallo,

Seiten weit wegspringen kannst Du schon deshalb nicht, weil das Display 
vermutlich nur 8k Ram hat, der Rest wird also zwangsweise nur 
gespiegelt.
Wie sich da aber die interne Logik verhält, weiß ich nicht.

Ja, 0x006 sollte die 6. Spalte der ersten Zeile sein,
0x0010 die 1. Spalte der zweiten Zeile, wenn Anzahl Spalten 16 ist und 
das Display im 8-Pixel-Mode.
0x03FF müßte die letzte Spalte der letzten Zeile sein, also rechts 
unten, wenn ich mich nicht wieder verrechnet habe. ;)

Schreib das Ding doch mal Byte für Byte mit einer Warteschleife voll, 
damit Du zuschauen kannst, ob da ein System drin ist.

Vom Sourcecode würde ich es nicht vermuten, aber kann es Timingprobleme 
geben? Bei meinem Display waren es zuerst auch die Speicherzugriffe, wo 
es einfach Pixelfehler gab, obwohl Init und Kommandos noch richtig 
erkannt wurden. Allerdings erst bei MemoryMapped-Zugriffen mit mehr als 
12MHz...

Gruß aus Berlin
Michael

von Thomas (Gast)


Lesenswert?

Hi,
ich schreib ja alles voll ohne Ende, das LCD füllt sich schön von oben 
bis unten. Nur der Anfangspunkt ist nur im Bereich von 00 bis FF 
einstellbar, wenn ich weiter will (ja, 3FF ist das Ende) so lande ich 
immer wieder in der ersten Zeile. Und komisch ist auch daß ich den 
Pointer mit umgekehrten MSB-LSB setzen muss damit ich überhaupt irgendwo 
hin komme.
Werde mal einen anderen Quarz versuchen (8051 mit 24MHz hab ich gerade), 
dann sollte es vielleicht langsamer laufen.
Danke erst mal, werde mal löten...

Gruss

Thomas

von Thomas (Gast)


Lesenswert?

Hallo,
es geht, weiß nicht warum!!
Wenn ich ein Array definiere und diese Funktion periodisch aufrufe läuft 
es, warum??

char test[2]
test[0]= 0xFF;
test[1]= 0x00;

lcd_print(test, 0x2C, 0x05);

 while (1)
  {
  _wait_ms(20);
  lcd_print(test, 0x2C, 0x05);
  test[0]=user_cnt;

usw......

Die Funktion lcd_print macht aber auch nichts anderes als das was ich 
stückweise definiert habe ausser send_command(0xC0). Habe ich aber auch 
probiert, hat nix geholfen. Nu sende ich die Zeichen mit 0x20 Differenz 
aus und sie landen da wo ich sie erwarte. Ich habe den Grafikbereich auf 
0x200 gelegt und es geht.
Häääää???? Kann mir das einer erklären?
Gruss

Thomas

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.