hallo zusammen im Beitrag "Chipkarte mit Textdisplay" ist die Rede von einem EA T123 i2c display. ich habe einen atmega 32 und versuche dieses Display anzusprechen. Dies leider ohne Erfolg :-(. ich wollte zum Test das Beispiel aus dem Datenblatt ausführen, doch nicht mal dies klappt. ich habe die Vermutung das ich die Daten als Paketschicken muss, doch weiss nicht genau wie ich das machen soll. Vielen Dank für Eure hilfe. Gruss martial
Verwendest Du eine externe negative Kontrastspannung (Beschaltung siehe Seite 11 im Datenblatt des EAT123) ? Wenn nicht, mußt Du den interne Spannungsgenerator mit Bit G im Funktion-Set Byte explizit einschalten. Das Beispiel geht von einer externen Spannung aus. Also als erstes (nach dem 0x00) nicht 0x2C sondern 0x2E senden. Gruß Ingo
Hallo Ingo ich verwende die single supply Schaltung, somit habe ich das funktions-set geändert. Aber es funktioniert leider immer noch nicht. gruss Martial
Hmmmm, ist denn alles richtig angeschlossen? Wichtig sind die beiden Kondensatoren bei der "Single Supply"-Beschaltung. Außerdem ist zu beachten, das die Zählweise der Pins nicht in Leserichtung, sondern von rechts nach links ist (wenn man von oben auf das Display schaut, also die Pins oben link liegen). Anschluß 1 (GND) liegt dann also ganz rechts, Pin 6 (SCL) ganz links außen. Ich sag das nur deshalb, weil ich bei meinem ersten Versuchsaufbau auf dem Steckbrett einfach von links mit Pin 1 angefangen hatte. Hat dann auch gar nichts funktioniert (logischerweise), aber glücklicherweise haben es alle Teile überlebt :-) Ansonsten habe ich bisher nur in Assembler programmiert. Hier mal meine Initialisiereung: .macro LCD_INIT ldi TWIadr, LCD_I2CADD+TWIwr ; Set device address and write rcall TWI_start ; Send start condition and address ldi TWIdata, 0b00000000 ; Write Control-Byte rcall TWI_do_transfer ; Execute transfer ldi TWIdata, 0b00101100 ; Function Set rcall TWI_do_transfer ; Execute transfer ldi TWIdata, 0b00001110 ; Display/Cursor On rcall TWI_do_transfer ; Execute transfer ldi TWIdata, 0b00000110 ; Set mode rcall TWI_do_transfer ; Execute transfer rcall TWI_stop ; Send stop condition .endmacro Da ich eine externe LCD-Spannung verwende, hab ich das G-Bit nicht gesetzt. Sonst sieht das ja fast aus, wie Deine Initialisiereung. Wobei mir nicht klar ist, warum Du erst 0x0C und dann 0x0E sendest. Gruß Ingo
hallo ingo ich kann den kontrast mit dem Poti verstellen, daher sollte es schon richtig angeschlossen sein. Wenn ich den Befehl 0x00 und nacher 0x0F sende blinkt das Display auch. Daher glaube ich das der I2C richitg konfiguriert ist, oder meinst Du das es zufall ist das dieser Befehl durchkommt??? Gruss Martial
Was natürlich auch noch sein könnte, das Du zwischen den Befehlen warten mußt, bis das Display sie verarbeitet hat. Laut Datenblatt sind das normalerweise mindestens 20 µs, bei "Clear Display" sogar 1,1 ms. Ich brauche das bei mir nicht zu berücksichtigen, weil ich meinen Controller zum Strom sparen eh nur mit 32 kHz takte, da ist bei mir ein Prozessortakt langsamer als diese 20 µs, so das ich mir die ganze Warterei klemmen kann. In den meisten Fällen sind die Probleme mit LCDs auf das ungenügende Timing zurückzuführen, also speziell die Befehlsausführungszeit des Displays muß beachtet werden. Zumidenst war das bei mir mit meinem bisher verwendeten LCD-Modulen der Fall :-) Gruß Ingo
So, ich hab mal meinen AVR mit 1 MHz laufen lassen, und siehe da, es gibt Probleme. Es müssen also unbedingt die Timings eingehalten werden. Insbesondere muß man auch bereits nach dem Einschalten (Power-On) mindestens 2 ms warten, bevor das Display überhaupt ordentlich ansprechbar ist. Das aber der Cursor (Unterstrich) nicht angezeigt wird, hat noch einen ganz anderen Grund. Bei dem Display gibt es schlichtweg keine 8 Zeile im Zeichen, die dafür eigentlich vorgesehen ist. Das sieht man im Datenblatt von Electronic Assembly auf der letzen Seite bei "Abmessungen" (siehe auch Bild im Dateianhang). Man kann das auch gut erkennen, wenn man den Kontrast des Displays soweit hochdreht, das alle Segemente dunkel werden. Die Beispiele (und auch sonstigen Inhalte) aus dem Datenblatt sind nahezu ausschließlich aus dem originalen Philips-Datenblatt des verwendeten I2C-LCD-Controllers (PCF2116) kopiert worden. Eben jenes Datenblatt habe ich mir auch geholt, hat mir bei manchen Problemen besser weitergeholfen. http://www.semiconductors.philips.com/acrobat/datasheets/PCF2116_FAM_4.pdf Zum testen kannst Du ja mal den Block-Blink-Cursor einschalten, also Bit B im Display/Cursor-On/Off Byte setzen. Das wäre dann z.B. 0x0F, oder meintest Du das oben mit dem blinkenden Display? "...Wenn ich den Befehl 0x00 und nacher 0x0F sende blinkt das Display auch..." Dann war ja schon fast alles richtig :-) Gruß Ingo
Hallo Ingo mit dem blinken habe ich genau diesen Cursor gemeint. Dann bin ich also doch nicht so unfähig. Hast Du, das Du das blinken auf den display geschickt hast, auch schon diese 2ms gewartet? Ich werde jetzt mal das datenblatt das Du mir vorgeschlagen hast studieren. Ich danke Dir für die mühe. Gruss martial
Hallo Martial, ja, ich warte vor der gesamen LCD-Initialisierung einfach 2 ms (bei meinem kleinen 1MHz Testprogramm). Und dann erst starte ich TWI und das Sende der Steuerungs-Bytes. Hängt natürlich auch von der Taktfrequenz Deines Controllers ab, und davon, was Du vorher noch im Programm erledigen mußt (Initialisierung sonstiger Komponenten). Ich habe es so gemacht, das ich die LCD-Initalisierung als letztes ausführe, bevor das eigentliche "Hauptprogramm" startet. Alles andere erledige ich vorher, und habe damit schon eine gewisse Wartezeit für das LCD, die ich aber sinnvoll nutzen kann. Bei meinen 32 kHz Systemtakt brauchte ich dann keine zusätzliche künstliche Verzögerung einbauen, weil sowieso bereits mehr als 2 ms nach dem Power-On-Reset vergangen waren. Gruß Ingo
Hallo Ingo ich habe einen Teilerfolg erziehlt, doch ist dies noch nicht zufriedenstellend ;o). Ich kann jetzt auf das Display schreiben, doch es zeigt auf der ersten und auf der dritten(letzten) das gleiche an. Hier meine init schritte: write_i2c(0x00); // 00 control byte write_i2c(0x22); // 22 funktions set 1 Linie write_i2c(0x0E); // 0E cursor on, display on write_i2c(0x04); // 04 entry mode set cursor write_i2c(0x8B); // 8B Anzeigepos um zu schreiben sende ich : write_i2c(0x40); // controll byte write_i2c(0xAA); // * write_i2c(0xEF); // H write_i2c(0xEC); // A write_i2c(0xEC); // L write_i2c(0xE1); // L write_i2c(0xC8); // O write_i2c(0xAA); // * besten Dank und Gruss Martial
Da hast Du Dich jetzt an dem Beispiel aus dem Philips Datenblatt orientiert, denke ich mal. Dort wird aber mit 0x22 "Function Set" nur ein einzeiliges Display mit 24 Zeichen initialisiert (steht ja im Kommantar sogar dahinter :-). Das EA T123 ist aber dreizeilig zu je 12 Zeichen. Da es das explizit nicht gibt, muß es wie ein vierzeiliges initialisiert werden. Also Bit M,N im "Function Set" gesetzt, ergibt dann zusammen mit dem G-Bit für die Kontrastspannung 0x2E. Nach dem 0x00 nicht 0x22, sondern 0x2E senden. Gruß Ingo
Hallo Ingo Nein ich habe mich da an ein Beispiel von einem Leidensgenossen gehalten fg. Das mit dem 0x2E habe das schon versucht und dann macht es gar nichts mehr. gruss Martial
Hmmm komische Sache plötzlich kann ich auf der 1.Zeile schreiben :-). aber es gibt mir eine Fehlermeldung auf dem Bus. Ich glaube jetzt ist wieder ein Zeit Problem. Mal schauen ob das auch noch weg ghet.$ gruss Martial
Achso, na ich hatte in Erinnerung, daß sich das Philips-Beispile auf ein einzeiliges Display bezieht, daher meine Annahme. Es ist aber definitiv falsch, oder funktioniert das etwas bei dem Leidensgenossen so? Ich habe ja das gleich Display, und ich mache das "Function Set" mit 0x2E, an der Stelle wurde sogar das EA-Datenblatt korrekt geändert :-) Andererseits kommt mir das 0x8B komisch vor, damit schreibst Du ja in den nicht sichtbaren Bereich. Beim "vierzeiligen" Display beginnen die Zeilen bei 0x00, 0x20, 0x40 und 0x60. Gruß Ingo
ich habe einen weiteren fehler gefunden, und zwar hatte ich es noch auf dekrement eingestellt, darum auch die addresse am anderen ende. aber als ich dies noch geändert habe kann ich auch mit den "normalen" adressen die zeilen ansprechen. besten Dank und Gruss Martial
Ahso, so genau hatte ich mir Deine Initialisierung im einzelnen nicht angesehen, habe mich gleich auf den ersten Fehler gestürzt, der mir ins Auge gesprungen war :-) Na dann weiterhin viel Erfolg. Nun würde mich aber noch interessieren, was das für ein Gerät werden soll (bin halt neugierig), denn das EA-T123 ist nicht grad ein Mainstream-Display. Gruß Ingo
es ist noch schwierig das in ein paar zeilen zu erklären, doch ich versuche das mal ganz kurz zu erklären. die ganze machine soll am schluss eine solarzelle so ausrichten, das sie die grösste energie erzeugen kann. mit verschieden messinstrumenten (gps, kompass, sonneneinstrahlwinkel messgerät(selbst gebaut)) wird die position der zellen berechnet und dann die motoren angesteuert. mit dem display kann man sich dann durch das steuermenue schalten und einige einstellungen vornehmen. gruss martial
Danke! Klingt ja ganz interessant. Hab erstmal kurz überlegen müssen, was da mit GPS und Kompass gemacht werden soll. Ich würde einfach nur durch Lichtmessung auf größte Helligkeit positionieren. Aber mit den anderen Informationen kann man ja einfach die aktuelle Position der Sonne berechnen und dann dirket darauf ausrichten, wenn ich das richtig sehe. Tolle Sache, aber auch ein nicht unerheblicher Aufwand... Gruß Ingo
Hallo Ingo ich bin wieder am Display :o). ich kann wohl alles schreiben was ich will, jedoch kann ich keine Pos. blinken lassen. dies brauche ich für eine Zahlen eingabe, wenn diese Pos nicht blinkt weiss ich nicht bei welcher Stelle ich mich gerade befinde. Obwohl ich bei der Init. eine 0x0E schreibe. Besten Dank und Gruss Martial
Ja eben nich 0x0E, sondern 0x0F mußt Du für den Blinkenden Cursor bei der Initilisierung schreiben. 0x0E schaltet ja nur den (nicht sichtbaren) Unterstrich-Cursor ein. Das Bit0 (Bit B im Display Control Byte) muß gesetzt werden, also 0x0F. Gruß Ingo
hallo Ingo danke für deine hilfe, jetzt muss ich es nur noch an die richtige pos schieben. dies sollte ja mit dem gleichen befehl gehen wie man auf den display schreibt. gruss martial
hallo ingo das projekt display ist für den moment beendet. ich kann alles so schreiben und blinken lassen wie ich es will. :o) komisch ist nur, das ich auf verschiedene addressblöcke zugreifen kann. die blink positionen sind auf den standart vom datenblatt und schreiben kann ich auf den anderen (zeile1 80; zeile2 94; zeile3 B4) hauptsache es funktionert. besten dank und gruss martial
Ich habe mich zugegebenermaßen in letzter Zeit nicht weiter mit dem Display beschäftigte, denn bei "Chipkarte mit Textdisplay" ist es so gut wie aus dem Rennen. Als ich es noch genutzt hatte, war es nur für die Textausgabe gedacht, so Sachen wie Cursor brauchte ich da nicht. Daher kann ich zu dem von Dir beschrieben Effekt auch nichts weiter sagen. Hauptsache aber, es macht nun alles zu Deiner Zufriedenheit :-) Gruß Ingo
...ich weiß, man öffnet keine alten Threads - aber ganz vll "hört" Martial ja noch mit? Kannst du noch ein paar Details zu deinen Problemlösungen posten? Danke.
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.