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
Danke für deine Antwort. Leider funktioniert nicht einmal der Testmodus, hier sonst mal die relevanten Stellen:
1 | //DOGL - Graphic LCD (Software SPI)
|
2 | #use spi(MASTER, DI=PIN_D7, DO=PIN_D8, CLK=PIN_D6, BITS=8, stream=dogl)
|
3 | |
4 | .
|
5 | .
|
6 | .
|
7 | .
|
8 | |
9 | output_bit (a0_glcd,0); |
10 | output_bit (cs_glcd,0); |
11 | delay_us (5); |
12 | |
13 | //Initialisierung
|
14 | spi_xfer (dogl,0x40,8); |
15 | spi_xfer (dogl,0xA1,8); |
16 | spi_xfer (dogl,0xC0,8); |
17 | spi_xfer (dogl,0xA6,8); |
18 | spi_xfer (dogl,0xA2,8); |
19 | spi_xfer (dogl,0x2F,8); |
20 | spi_xfer (dogl,0xF8,8); |
21 | spi_xfer (dogl,0x00,8); |
22 | spi_xfer (dogl,0x27,8); |
23 | spi_xfer (dogl,0x81,8); |
24 | spi_xfer (dogl,0x10,8); |
25 | spi_xfer (dogl,0xAC,8); |
26 | spi_xfer (dogl,0x00,8); |
27 | spi_xfer (dogl,0xAF,8); |
28 | delay_us (5); |
29 | |
30 | //Testmodus
|
31 | spi_xfer (dogl,0xA5,8); |
32 | delay_ms (1000); |
33 | |
34 | //"Normaler" Modus
|
35 | spi_xfer (dogl,0xA4,8); |
36 | |
37 | //8 Pixel langer Strich (als Test)
|
38 | spi_xfer (dogl,0x40,8); |
39 | spi_xfer (dogl,0xB0,8); |
40 | output_bit (a0_glcd,1); |
41 | spi_xfer (dogl,0xFF,8); |
42 | output_bit (a0_glcd,0); |
43 | |
44 | //Slave deaktivieren
|
45 | output_bit (cs_glcd,1); |
Wo könnte hier der Fehler liegen? Die Pins sind sicher richtig gemappt beim PIC24FJ256GB106. Danke und Gruss Tom
Hi Du kannst dir den 'Testmode' sparen. Nach erfolgreicher Initialisierung sollten zufällig verteilte gesetzte Pixel zu sehen sein. 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.
1 | sbit RESET = P2^1; // Reset Pin des DogL |
2 | |
3 | RESET = 0; |
4 | v_Sleep_RTC(RTC_RELOAD_5MS); // 5ms Pause |
5 | RESET = 1; |
Ciao, Rainer
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
Es gibt keinen expliziten clear Befehl. Also der Ansatz jedes Pixel auf Null zu setzen ist der einzige Weg dabei.
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
Hi
>Wie bekomme ich es hin das der Adresszeiger wieder am Anfang ist?
Pageadresse und Columnadresse auf Null setzen.
MfG Spess
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
Der Hersteller hat das nun mal festgelegt, dass die Spalte in 2 Bytes übertragen wird, (hoffe ich hab mich jetzt nicht verzählt): Byte1 Byte 2 0001 0000 0000 0000 Spalte 0 0001 0000 0000 0001 Spalte 1 0001 0000 0000 0010 Spalte 2 0001 0000 0000 0011 Spalte 3 0001 0000 0000 0100 Spalte 4 0001 0000 0000 0101 Spalte 5 ... 0001 0000 0000 1111 Spalte 15 0001 0001 0000 0000 Spalte 16 0001 0001 0000 0001 Spalte 17 ... 0001 0111 0000 1111 Spalte 127 Holger
Danke jetzt verstehe ich das alles so langsam. Klasse Forum!!! MFG blutengel
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.