Hallo miteinander
Ich sitze hier vor einem DOGL Display. Initialisiert ist es wie im
Datenblatt, das sollte soweit stimmen.
Hier noch der Link: http://www.lcd-module.de/pdf/grafik/dogl128-6.pdf
Erste Frage:
Kann ich mit dem Befehl "(10) Display all points" aus dem Datenblatt
alle Punkte aufleuchten lassen, also so zu sagen als Test?
Dazu müsste ich ja einfach ein 0xA5 senden nach der Initialisierung,
wenn A0 auf Masse liegt?
Zweite Frage:
Nun stellt sich mir aber die Frage, wie ich z.B einen Punkt zeichnen
kann an Position "x,y".
Konkret stelle ich mir das so vor:
- A0 auf Masse
- (2) Display start line set: 01000000
- (3) Page address set: 10110000
- A0 auf +3V3
- (6) Display data write: 11111111 (als Test)
Ist dieser Ablauf soweit korrekt?
Vielen Dank und Gruss
Tom
Hi
>Erste Frage:
Ja.
>Zweite Frage:
Nein. Deine X-Position legst du mit 'Column Address Set' fest. Die
Y-Position eines Pixels setzt sich aus der Page-Adresse (Y/8) und der
Bitposition im adressierten Byte (Y mod 8) zusammen. '11111111 (als
Test)' erzeugt einen 8 Pixel langen senkrechten Strich.
MfG Spess
In Ordnung, werd ich noch rausnehmen.
Aber die zufälligen Pixel sehe ich nicht, das heisst dass die
Initialisierung nicht korrekt/komplett war?
Irgend eine Idee wo der Fehler liegen könnte?
Gruss
Tom
Also ich hatte mit dem DogL auch das Problem, dass die Initialisierung
nicht funktionierte. Was ich machen musste war, dass ich den Reset Pin
des LCD zu Beginn erst auf 0 setzen, kurz warten (~5ms) und dann wieder
auf 1 setzen musste damit das LCD einen internen Reset ausführt. Leider
hatte es mit einer kürzeren Pause von nur ~100µs zwischen 0 und 1 nicht
funktioniert gehabt.
Hallo Rainer
Genau das habe ich heute Morgen schon versucht, leider jedoch erfolglos.
So wie ich das sehe, stimmt die Initialisierung...leider habe ich kein
Oszilloskop hier, um dies zu überprüfen.
Sonst noch eine Idee?
Gruss
Thomas
Hmm also bei mir ist CS immer nur für die Dauer eines Befehls auf 0.
Aber das sollte ja laut Datenblatt egal sein. Bist du sicher, dass deine
spi_xfer und output_bit methoden korrekt arbeiten?
Poste diese doch am besten mal um zu sehen, was dadrin genau passiert.
Als ganz anderer Ansatz wäre noch zu klären, ob du die
Hardwarebeschaltung der Kondensatoren korrekt aufgebaut hast.
Ciao,
Rainer
Ich habe bisher immer den Slave angesprochen, die Befehle ausgeführt und
den Slave wieder deaktiviert...das sollte kein Problem sein.
Im Anhang ist noch der Schemaausschnitt, müsste soweit auch korrekt
sein.
Die Funktionen "spi_xfer" sowie "output_bit" sind Funktionen vom CCS
Compiler.
output_bit setzt einfach den entsprechenden I/O auf den gewünschten
Zustand.
spi_xfer wickelt den ganzen Transfer dann ab mit den mitgegebenen
Parametern (siehe:
http://iranmicro.ir/Online/Help/ccs/index.html?spi_xfer%28_%29.htm).
Es ist übrigens nicht das erste Mal, dass ich ein SPI Slave in Betrieb
nehme..doch wie schon gesagt fehlt mir momentan leider ein Oszilloskop,
was die Suche nach dem Fehler etwas schwieriger macht...
Gruss
Thomas
Ich bin auch gerade dabei mit PIC ein DOGL anzusteuern, ausser
anfänglichen leichten Problemen mit dem Kontrast hat es auf Anhieb
funktioniert.
Allerdings habe ich die SPI Routinen selbst in Assembler gestrickt und
verwende einen 18F2520 mit Widerstans-Pegelwandlern.
Hast du mal geprüft ob die Pins überhaupt "wackeln" ?
Holger
Langsam aber sicher kanns fast nur noch die SPI Routine sein...mal
schauen, werde sonst einmal die Initialisierung "von Hand" machen und
dann schauen, obs funktioniert.
Prüfen, ob die Pins ihren Zustand ändern geht ohne Oszilloskop nicht
wirklich gut, jedenfalls bei SPI.
Mit was für einem SPI-Takt wird das Teil gefahren?
Das DOGL in Verbindung mit nem PIC kann max. ca. 2 MHz SPI Takt. Wenn
man
mehr benutzt, sehen die SPI-Flanken nicht mehr schön aus und man bekommt
massig Übertragungsfehler.
Zumindes hab ich bei mir das mit <= 2 MHz SPI-Takt zum Laufen gebracht,
so dass auch wirklich nur die Pixel wie gewünscht gesetzt wurden und
nicht
zufällig ;-)
Ach ja, wie sehen eigentlich deine Übertragungsroutinen zum Thema RS und
CS Signal aus?
Hast Du auch ein paar delay NOPs bzw. ein Delay-Loop eingebaut?
Also (wenn ich mich recht erinnere) ging das so:
1. RS auf gewünschten Pegel setzen
2. Warten (je nach Takt ein paar NOPs oder ein Delay-Loop)
3. CS setzen
4. Warten (je nach Takt ein paar NOPs oder ein Delay-Loop)
5. Daten schaufeln
6. CS setzen
Fertig.
-> Wartezeit (siehe Setup and Hold Time von RS und CS)
Ich nochmal - habe soeben selber eine SPI-Test-Routine geschrieben und
es funktioniert - das Display zeigt direkt nach dem Initialisieren an
zufälligen Positionen gesetzte Pixel an.
Der Testmodus funktioniert soweit auch.
Danke nochmal für die Hilfe.
Gruss
Thomas
Hi!
Habe es auch nur mit einer eigenen SPI Routine geschafft.
Nach dem Init bekomme ich auch diese zufälligen Pixel und mit dem
Testmodus geht genau so gut. Meine Frage wäre nun wie ich ein Clear
hinbekomme damit die wilden Pixel weg sind. Habe es mit dem Reset Befehl
versucht aber danach schein wohl das ganze Init wg zu sein.Vielleicht
habe ich da auchnur einen Denkfehler.
MFG
blutengel
Ich habe auch nix gefunden, ich lösche den Inhalt wirklich einzeln durch
überschreiben mit 0 (7*128)
Wobei ich im Betrieb immer die Kopie im RAM komplett ausgebe.
Holger
Hi
>Meine Frage wäre nun wie ich ein Clear hinbekomme damit die wilden Pixel >weg
sind.
Indem du alle Stellen des Displayspeichers mit 0x00 beschreibst.
MfG Spess
Wie kann ich denn danach wieder die Adresse auf 0 setzen. Ich gehe die
erste Page von 0 bis 127 durch und schreibe 0 hinein dann inkrementiee
ichdie PAge und wiederhole den vorigen Vorgang. Nach 7 Durchläufen ist
mein GLCD "gesäuber". Aberjetzt steht der Adresszeiger doch auf der
letzten Stelle.Habe mit dem Befehl Display Star Line set versucht den
Adresszeiger auf den Anfang zu setzen aber danach schein mein Init weg
zu sein.Wie bekomme ich es hin das der Adresszeiger wieder am Anfang
ist?
blutengelMFG
Wenn du das LCD mit richtiger Grafik ansteuern willst bleibt dir nichts
anderes übrig als das komplette Display im RAM abzubilden. Also bau dir
eine Routine die immer komplett den RAM Bereich von 1024 (8*128) Bytes
ausgibt. Ich hab es dann so gelöst dass ich nach der Ausgabe den RAM im
µC lösche und neu aufbaue mit einzelnen Pixel setzen, dann wieder
ausgeben.
Holger
Was genau muss ich denn senden damit er wieder nach Column 0 geht?
In dem Word Dokument von EA steht ja:
Changing to another position in display RAM; new column
1. CS-pin set to low (select the display and synchronize the internal
bit counter)
2. A0-pin set to low (for writing command data)
3. The next is a 2 byte command (column address set)
3.1 Write e.g. hex 14 to the display (most significant 4bit)
3.2 Write e.g. hex 00 to the display (least significant 4bit)
Next display data will be written at column 64.
4. set A0 to high (ready to receive display data)
5. set CS-pin to high (display is no longer selected)
wobei ich Punkt 3.1 und 3.2 nicht verstehe.
was genau soll das bedeuten?
MFG
blutengel
Also
0xb0 setzt auf Page 0, 0xb1 auf Page 1 usw.
column wird in 2 Bytes übertragen
0x10 (upper nibble)) und 0x00 (lower nibble) für column 0
beides mit A0 = 0
also 0x10 und 0x04 für die 5. Spalte
Holger
Leider verstehe ich das noch nicht wieso 2 Nibble.warum nicht die 8 bit
sofort.Mit der Page Adress ist klar. Und bei deinem Beispiel wieso
ergibt sich daraus Column 5?Wie setzt sich die Adresse zusammen?
MFG
blutengel