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.
Schau mal in der Codesammlung. Besser gesagt bei apetech. Er hat nen Source veröffentlicht. Mfg Sascha
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.
> 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 ...
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.
Ä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 ...
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?
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?
"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
ch habe leider keine Ahnung wie ich den Source von ape verwenden soll... codevision kennt die haelfte der verwendeten operatoren nicht.
falls es jemanden gibts, der die funktionsweise des displays versteht bitte helft mir! Danke
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.
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?
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.
Kontrast passt, is auf ca -3.4V eingestellt, ich kann alle pixel sehen, die sind aktiv, ich kann sie nur nicht löschen :)
Dann dreh den Kontrast mal runter, so dass du die Pixel grad nicht mehr siehst und versuch dann, die Pixel zu aktivieren.
Das Problem ist nicht die pixel zu aktivieren, sondern sie zu löschen, bzw. das display generell anzusprechen bzw. zu steuern - das funktioniert nicht.
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.
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
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. ;-)
ok :) ich hab den reset pin jetz über 10k an 5V. Der Code funktioniert aber trotzdem noch nicht.
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;
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?
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 ...
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?
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.
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.
> 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.
Hat noch nie jemand aus so nem display daten gelesen? jedes pixel zwischenspeichern wäre ein wenig speicherraubend.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.