Forum: Mikrocontroller und Digitale Elektronik EA DOGL - Befehlsaufbau


von Tom (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Du kannst dir den 'Testmode' sparen. Nach erfolgreicher Initialisierung 
sollten zufällig verteilte gesetzte Pixel zu sehen sein.

MfG Spess

von Tom (Gast)


Lesenswert?

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

von R. W. (quakeman)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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

von R. W. (quakeman)


Lesenswert?

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

von Tom (Gast)


Angehängte Dateien:

Lesenswert?

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

von Holger W. (holgerw)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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.

von Matthias (Gast)


Lesenswert?

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)

von Tom (Gast)


Lesenswert?

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

von blutengel (Gast)


Lesenswert?

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

von Holger W. (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von R. W. (quakeman)


Lesenswert?

Es gibt keinen expliziten clear Befehl. Also der Ansatz jedes Pixel auf 
Null zu setzen ist der einzige Weg dabei.

von blutengel (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

>Wie bekomme ich es hin das der Adresszeiger wieder am Anfang ist?

Pageadresse und Columnadresse auf Null setzen.

MfG Spess

von Holger W. (holgerw)


Lesenswert?

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

von blutengel (Gast)


Lesenswert?

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

von Holger W. (holgerw)


Lesenswert?

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

von blutengel (Gast)


Lesenswert?

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

von Holger W. (holgerw)


Lesenswert?

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

von blutengel (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.