Forum: Mikrocontroller und Digitale Elektronik 64x128 Pixel Display funktioniert nicht


von Buchmann (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich hab folgendes Problem mit dem Display (Datenblatt im Anhang):
Ich hab die Funktionen laut Datenblatt getestet, hab aber weder den
Status des Displays lesen können, noch irgendetwas anzeigen. Hat jemand
Erfahrung mit sopcheln Displays, bzw. deren Funktionsweise?
Wenn ja bitte helft mir! Und bitte keine links zu libs oder fertigen
Programmen, ich würde die Funktionsweise des Displays gerne verstehen.

von Sascha (Gast)


Lesenswert?

Schau mal in der Codesammlung. Besser gesagt bei apetech. Er hat nen
Source veröffentlicht.

Mfg Sascha

von Sascha (Gast)


Lesenswert?


von Buchmann (Gast)


Lesenswert?

Danke Sascha, aber genau das wollte ich eben nicht, den Sourcecode, aus
dem ich die Funktion des Displays nicht ableiten kann. ich würde den
Code gerne selber schreiben, dazu müsste ich das display aber erst mal
verstehen.

von Sebastian (Gast)


Lesenswert?

> Ich hab die Funktionen laut Datenblatt getestet, hab aber weder den
> Status des Displays lesen können, noch irgendetwas anzeigen.

Da meine Glaskugel gerade in Reparatur ist: Was hast du denn genau
gemacht? Compiler? IDE? OS? µC? Sourcecode? Initialisierungsroutinen?

Ich benutze ein solches Display mit dem KS0108 ohne Probleme und kann
dir gerne meinen Code geben (oder du holst ihn dir auf www.mathar.com),
aber das willst du ja scheinbar nicht ...

von Buchmann (Gast)


Lesenswert?

Ich verwende nen ATMega128, programmiert wird mit CodeVision AVR in C.
Laut Datenblatt müsste das DIsplay mit dem folgenden Code deaktiviert
werden können:

EN = 1;
delay_us(1);
EN = 0;
RW = 0;
RS = 0;
CS1 = 0;
CS2 = 1;
DATA = 0b00111110;
delay_us(1);
EN = 0;

funktioniert leider nicht.

von Buchmann (Gast)


Lesenswert?

RESET is 1

von Sebastian (Gast)


Lesenswert?

Äh, wie willst du bitte sehen, ob das DEaktivieren des Display (nicht)
klappt, wenn du es noch nicht mal aktivieren kannst?!?

Ein Init geht so:

void GLCDInit(char side)
{
  char i,j;

  if (side=='l') {CSPORT|=CS2; CSPORT&=~CS1;}  // left controller
  else if (side=='r') {CSPORT|=CS1; CSPORT&=~CS2;}  // right
controller
  else if (side=='b') {CSPORT&=~CS1; CSPORT&=~CS2;}  // both
controllers

  CONFIGPORT=0x00;
  DATAPORT=0x00;
  CONFIGPORT|=E; CONFIGPORT&=~RW; CONFIGPORT&=~DI;  // E=1, R/W=0,
D/I=0
  DATAPORT=0x3F;          // switch LCD on
  CONFIGPORT&=~E;         // E=0

  for(j=0;j<8;j++)
  {
    GLCDSetRow(j, side);
    for(i=0;i<64;i++) GLCDPrintColumn(0, side);
  }

  GLCDSetRow(0, side);
}

Ersetze also mal dein DATA durch ein 0x3F und aktiviere das Display so.
Dann schaun wir weiter ...

von Buchmann (Gast)


Lesenswert?

funktioniert nicht...

hab mal ein paar Fragen:

EN muss high sein, damit der chip anspricht oder?
RESET ist active LOW, muss also während des Betriebs HIGH sein richtig?

von Buchmann (Gast)


Lesenswert?

Ich komm einfach nicht weiter, hab jetzt schon zig programme getestet,
app notes gelesen und datenblätter studiert, aber das display will
einfach nichts anzeigen... hat jemand ne fertige hex file, und die
pinbelegung dazu, um das display zu testen?

von Sascha (Gast)


Lesenswert?

"Danke Sascha, aber genau das wollte ich eben nicht, den Sourcecode,
aus
dem ich die Funktion des Displays nicht ableiten kann. ich würde den
Code gerne selber schreiben, dazu müsste ich das display aber erst mal
verstehen."

Was denn nun? Der Source von ape funzt einmalig......

Mfg Sascha

von Buchmann (Gast)


Lesenswert?

ch habe leider keine Ahnung wie ich den Source von ape verwenden soll...
codevision kennt die haelfte der verwendeten operatoren nicht.

von Buchmann (Gast)


Lesenswert?

falls es jemanden gibts, der die funktionsweise des displays versteht
bitte helft mir! Danke

von Sebastian (Gast)


Lesenswert?

Aaaaaah! Ich kann dir gerne helfen. Aber stell endlich mal eindeutige
Fragen! Ich bin doch kein Hellseher. Und antworte auf meine Fragen,
oder rede ich gegen eine Wand?!? Warum willst du das Display
DEaktivieren?!? Das ist völlig sinnlos, wenn du es noch nicht mal
aktivieren kannst.

EN muss high sein, ja. Und Reset muss auch high sein, genau. Bei den
meisten Displays ist der schon intern über einen Pullup auf Vcc
(einfach mal nachmessen). Schadet aber nix, wenn du noch mal einen
10k-Pullup dranhängst.

So, und jetzt warte ich erst auf Antworten.

von Buchmann (Gast)


Lesenswert?

zunächst danke fuer deine Hilfe.
Also Reset hab ich an einen PORT des Controllers gehaengt, ist aber
eigentlich immer high. Beim Messen waren am Reset Pin 0V.

1. Ich würde gerne wissen, was genau ich an das Display senden muss, um
zu Beginn einfach alle Pixel zu löschen.

2. Das Signal RW dient dauz, um zu lesen, bzw. zu schreiben. Muss ich
denn etwas lesen? kann ich den PIN dauerhaft auf 0V haengen, damit das
display immer auf schreiben eingestellt ist?

von ERDI-Soft (Gast)


Lesenswert?

Und wie sieht es mit der Kontrastspannung aus?
Wenn mich mein Gehirn aus Faulheit über die Feiertage nicht komplett
abgeschaltet hat, dann musst du Pin 18 über ein Poti mit Pin 3
verbinden.

von Buchmann (Gast)


Lesenswert?

Kontrast passt, is auf ca -3.4V eingestellt, ich kann alle pixel sehen,
die sind aktiv, ich kann sie nur nicht löschen :)

von ERDI-Soft (Gast)


Lesenswert?

Dann dreh den Kontrast mal runter, so dass du die Pixel grad nicht mehr
siehst und versuch dann, die Pixel zu aktivieren.

von Buchmann (Gast)


Lesenswert?

Das Problem ist nicht die pixel zu aktivieren, sondern sie zu löschen,
bzw. das display generell anzusprechen bzw. zu steuern - das
funktioniert nicht.

von ERDI-Soft (Gast)


Lesenswert?

Dann sag mir mal, wie du Pixel, die nicht aktiv sind, löschen willst.
Hast du bereits Codes von anderen ausprobiert? Geht da was?
Poste am besten mal Schaltplan und Code. Sonst kann dir keiner wirklich
sagen, woran es liegt.

von Buchmann (Gast)


Lesenswert?

Schaltplan gibts keinen zu posten... das display is direkt an den
controller angeschlossen.. nur das poti is eben fuer den kontrast
dran.. aber ich denke das kann man sich noch vorstelen.
code von anderen hab ich noch nicht ausprobiert. Ich möchte ja nur
gerne wisse, was ich in welche riehenfolge an das display senden muss,
um es zu initialisiern, usw

von Sebastian (Gast)


Lesenswert?

Du hast erst mal ein prinzipielles Problem, wenn der Reset-Pin auf 0V
ist. Also: Such den Fehler in deiner Verkabelung. Du brauchst den Pin
auch nicht auf einen Controller-Port legen. Wie ich schon sagte: Über
10k an Vcc, fertig. Bevor das Reset-Signal nicht klappt, hat dich kein
Code dieser Welt zu interessieren. ;-)

von Buchmann (Gast)


Lesenswert?

ok :) ich hab den reset pin jetz über 10k an 5V. Der Code funktioniert
aber trotzdem noch nicht.

von Sebastian (Gast)


Lesenswert?

Mann, sei doch nicht so hektisch! Du bist ja wie ein kleines Kind,
sorry. Wir wissen ja jetzt, dass der Code bei dir nicht klappt ...

Also, Über 10k an Vcc? Und du hast auch GEMESSEN? Da MUSS high
anliegen, sonst hast du immer noch einen Fehler? Wenn du gemessen hast
und der Pin wirklich high ist, sehen wir weiter.

Der Code, den du oben gepostet hast, ist prinzipiell fast richtig. Nur
das erste EN=0 nach dem ersten delay_µs ist falsch! Du musst zuerst die
Daten anlegen und DANN erst EN fallen lassen. Setz ausserdem mal nach
JEDEM Befehl ein Delay, das lange genug ist (1ms oder mehr). Vielleicht
hast du Timing-Probleme. Also so:

EN = 1;
delay;
RW = 0;
delay;
RS = 0;
delay;
CS1 = 1; (Du willst ja beide hälften des Displays initialisieren!)
CS2 = 1;
delay; (das war bist jetzt alles "Vorbereitung")
DATA = 0x3F; (jetzt kommt das Datenwort -> Init)
delay;
EN = 0; (und jetzt die fallende Flanke auf EN)
delay;

von Buchmann (Gast)


Lesenswert?

danke werd ich gleich mal testen.

von Buchmann (Gast)


Lesenswert?

Sehr gut.. es tut sich was... nach dem initialisieren werden einige
pixel deaktiviert, es sind jedoch noch ca 90% der pixel aktiv.. wie
kann ich diese löschen bzw setzen?

von Sebastian (Gast)


Lesenswert?

Nach dem Init hat das Display prinzipiell irgendeinen undefinierten
Zustand. Obwohl das Datenblatt sagt, es würde ein "Clear Display"
durchgeführt, hat es sowas bei mir noch nie gemacht. Deswegen schreibe
ich ja auch über alle Felder einzeln eine Null drüber:

for(j=0;j<8;j++)
  {
    GLCDSetRow(j, side);
    for(i=0;i<64;i++) GLCDPrintColumn(0, side);
  }

  GLCDSetRow(0, side);

> Sehr gut.. es tut sich was...

So, und jetzt sag du mir noch mal, dass mein Sourcecode nicht klappt!
Lies dir den Code durch, den ich oben gepostet habe und verstehe ihn.
Danach kannst du gerne meckern. Aber ein "klappt nicht", ohne es
auszuprobiert haben ist Müll. Sorry, verarschen kann ich mich selber.
Mein Code hätte dir übrigens deinen Fehler mit dem falschen EN-Signal
gestern schon verdeutlicht ...

von Buchmann (Gast)


Lesenswert?

Sorry aber wir reden hier aneinander vorbei.. ich glaube dir gerne das
dein code funktioniert, aber leider nicht mit meinem compiler...
Aber noch eine Frage:

wie kann ich einzelne pixel setzten und löschen? also signalmäßig?

von Sebastian (Gast)


Lesenswert?

Dann wäre eine etwas präzisere Meldung als

> funktioniert nicht...

vielleicht angebracht! Kann ich hellsehen? ;-)

> wie kann ich einzelne pixel setzten und löschen? also signalmäßig?

Gar nicht.

Was glaubst du eigentlich, wofür die Hersteller Datenblätter
herstellen? Damit man Papierschiffchen draus baut?! Lies doch mal das
Datenblatt, da steht klipp und klar drin, dass du immer komplette
8-bit-Worte (also 1 Byte) an das Display schicken musst. Das Display
hat zwei Pages mit je 64 Spalten und 8 Zeilen zu je 8 Bit. Wenn du also
einen einzigen Pixel setzen willst, musst du genau wissen, welches Byte
dazu gehört.

Sorry, wenn ich manchmal etwas genervt wirke, aber wirklich 95% deiner
Fragen in diesem Thread sind klar und deutlich im Datenblatt erläutert.

von Buchmann (Gast)


Lesenswert?

Danke fuer deine Tips.. jetzt funktionierts - das problem war laut
datenblatt musste EN zum ändern von RS, CS1, CS2 und RW low sein -
stimmt aber nicht.
Ein Problem habe ich allerdings noch: wenn ich versuche, daten aus dem
display zu lesen, kommen immer die seleben an - immer 184 auch wenn
keine pixel gesetzt ist.

von Sebastian (Gast)


Lesenswert?

> Danke fuer deine Tips.. jetzt funktionierts - das problem war laut
> datenblatt musste EN zum ändern von RS, CS1, CS2 und RW low sein -
> stimmt aber nicht.

Wo im Datenblatt steht das?! EN muss immer eine fallende Flanke
aufweisen, nicht low sein. Das ist ein großer Unterschied!

> Ein Problem habe ich allerdings noch: wenn ich versuche, daten aus
dem
> display zu lesen, kommen immer die seleben an - immer 184 auch wenn
> keine pixel gesetzt ist.

Keine Ahnung. Vom Display lesen hab ich noch nie gemacht.

von Buchmann (Gast)


Lesenswert?

Hat noch nie jemand aus so nem display daten gelesen? jedes pixel
zwischenspeichern wäre ein wenig speicherraubend.

von DerMax (Gast)


Lesenswert?

Das lesen aus dem Display ist mit diesem Controiller gar nicht so
einfach. Ich habs nuzr mit viel probieren hinbekommen. Auf jeden Fall
brauchst du einen dummy-read. Also du musst wenn du eine Page lesen
willst diese zweimal lesen udn nur das zweite Ergebnis verwenden dann
funktioniert es in der Regel...
Ein Grafikspeicher im Controller ist aber die einfachere und auch
wesentlich schnellere Variante. Bei einem 64x128 Pixel Display brauchst
du dann halt 1kb... nen mega8 wird da dann aber nich mehr reichen.

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.