www.mikrocontroller.net

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


Autor: Buchmann (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Sascha (Gast)
Datum:

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

Mfg Sascha

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Buchmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Buchmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Buchmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
RESET is 1

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Buchmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Buchmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Buchmann (Gast)
Datum:

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

Autor: Buchmann (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Buchmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: ERDI-Soft (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Buchmann (Gast)
Datum:

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

Autor: ERDI-Soft (Gast)
Datum:

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

Autor: Buchmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ERDI-Soft (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Buchmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

Autor: Buchmann (Gast)
Datum:

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

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Buchmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke werd ich gleich mal testen.

Autor: Buchmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ...

Autor: Buchmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Buchmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Buchmann (Gast)
Datum:

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

Autor: DerMax (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.