Forum: Mikrocontroller und Digitale Elektronik Problem mit EA DOGM128 Grafik-LCD


von Timo Reinert (Gast)


Lesenswert?

Hi,

kurze Frage hatte hier jeman schneinmal das Problem das egal was ihr dem 
Display schreiben wollt der Schirm immer Schwarz ist also auch nicht 
gecleard werden kann (nach Init schwarz).

Was ich bis jetzt sagen kann an zu schneller Datenübertragung kann es 
nicht liegen habe DELAYs.


LG

von spess53 (Gast)


Lesenswert?

Hi

>...das Problem das egal was ihr dem
>Display schreiben wollt der Schirm immer Schwarz ist also auch nicht
>gecleard werden kann (nach Init schwarz).

Wenn das Display nach der Init nicht 'gecleard' wird erscheint ein 
zufälliges Pixelmuster. Wenn deins schwarz ist, stimmt etwas mit der 
Initialisierung nicht.

MfG Spess

von Volker S. (volkerschulz)


Lesenswert?

Wie hast Du denn den Kontrast eingestellt?


Volker

von Timo Reinert (Gast)


Lesenswert?

Meine Init ist wie folgt:
1
 init_spi();
2
3
  reset_dogm128(); //reset dogm128
4
5
  //display start line
6
  send_cmd_dogm128(0x40); //line 0
7
8
  //bottom view
9
  send_cmd_dogm128(0xA0); //ADC reverse A1
10
  send_cmd_dogm128(0xC0); //COM0~COM63 output mode C8
11
12
  //normal / inverted
13
  send_cmd_dogm128(0xA6); //display normal, display off
14
15
  //hardware options
16
  send_cmd_dogm128(0xA2); //set bias 1/9
17
  send_cmd_dogm128(0x2F); //power  control circuits on
18
  send_cmd_dogm128(0xF8); //internal booster to 4x
19
  send_cmd_dogm128(0x00);
20
21
  //contrast options
22
  send_cmd_dogm128(0x27); //v0 = large
23
  send_cmd_dogm128(0x81); //set contrast
24
  send_cmd_dogm128(0x16); //default contrast value
25
26
  //indicator options
27
  send_cmd_dogm128(0xAC); //no indicator
28
  send_cmd_dogm128(0x00);
29
30
  //display on
31
  send_cmd_dogm128(0xAF); //display on

von spess53 (Gast)


Lesenswert?

Hi

>Meine Init ist wie folgt:

Und jetzt dürfen wir raten, in welcher Konfiguration du das Display 
betreibst.

MfG Spess

von Knut B. (Firma: TravelRec.) (travelrec) Benutzerseite


Lesenswert?

Ohne Angaben zur Schaltungsvariante bringt das nix, da die Booster bei 
anderer Verschaltung andere Spannungen liefern und somit andere 
Kontrastwerte eingestellt werden müssen. Die Betriebsspannung wäre auch 
noch wichtig zu wissen.

von Volker S. (volkerschulz)


Lesenswert?

Aendere mal tetweise
1
send_cmd_dogm128(0xA0); //ADC reverse A1
in
1
send_cmd_dogm128(0xA1); //ADC reverse A1

Deine Initialisierung deutet auf Einfach-Versorgung von 3.3V hin. Ist 
das korrekt? Wenn ja, nochmal alle (Pump-)Kondensatoren ueberpruefen... 
Wenn das auch nichts gebracht hat, Schaltplan inkl. aller Infos posten.


Volker

von Timo Reinert (Gast)


Lesenswert?

Achso ja also ich betreibe es mit 3,3V d.h. mit dem oberen Beispiel auf 
Seite 4 aus dem Datenblatt:
http://www.lcd-module.de/pdf/grafik/dogm128.pdf
Boost habe ich wie im Post zu sehen auf 4x eingestellt.
Das Display ist weiter hin an dem SPI eines ATmega32 angeschlossen.
Die Verbindungen zwischen LCD und M32 habe ich alle schon geprüft. Die 
Kondensatoren auch.


lg

von Arc N. (arc)


Lesenswert?

Timo Reinert schrieb:
> Achso ja also ich betreibe es mit 3,3V d.h. mit dem oberen Beispiel auf
> Seite 4 aus dem Datenblatt:
> http://www.lcd-module.de/pdf/grafik/dogm128.pdf
> Boost habe ich wie im Post zu sehen auf 4x eingestellt.
> Das Display ist weiter hin an dem SPI eines ATmega32 angeschlossen.
> Die Verbindungen zwischen LCD und M32 habe ich alle schon geprüft. Die
> Kondensatoren auch.
>
>
> lg

Wie sieht die Ansteuerung/Beschaltung von /CS, /RST und A0 aus? 
Pull-ups?
Hier sieht das in etwa so aus:
1
 /CS <- 0
2
 A0 <- 1
3
 /RST <- 1
4
5
 /RST <- 0
6
 wait500us
7
 /RST <- 1
8
 wait50us
9
10
 A0 <- 0
11
 initialization
12
 /CS <- 1

von Timo Reinert (Gast)


Lesenswert?

Also A0,CS,RST und natürlich der SPI sind mit dem MCU verbunden ohne 
ext. PullUps.

RST  ist normal high. A0 ist dementsprechen 0 oder 1 jenachdem ob 
Commandos oder Daten gesendet werden. CS ist immer dann low wenn ich 
etwas sende, nach dem senden geht dieser wider auf high. Und bei Reset 
geht RST = 0, Delay 50ms und dann wieder RST = 1.

lg

von Timo Reinert (Gast)


Lesenswert?

Kann mir niemand weiter helfen?

von Chris (Gast)


Lesenswert?

Richtigen SPI-Mode gewählt? Schon einmal andere Einstellungen für den 
Kontrast versucht?

von R. W. (quakeman)


Lesenswert?

Ich habe vor zwei Tagen das erste mal angefangen ein DogL-128 
anzusteuern (Ansteuerung identisch mit DogM-128). Ich betreibe es nur 
mit 3,3V und habe auch dementsprechend die Initialisierung vorgenommen. 
Nach dem ersten Versuch hatte ich auch das Problem, dass das Display 
komplett schwarz war und nichts weiter angezeigt wurde. Das Problem in 
meinem Fall war, dass ich davon ausging, dass das LCD einen eingebauten 
Powerup-Reset hätte. Das scheint aber nicht der Fall zu sein. Nachdem 
ich dann also zu Beginn einen definierten Reset ausgeführt hatte, zeigte 
es ein zufälliges Pixelmuster an. Vermutlich liegt das dadran, weil der 
interne Ram zu beginn undefiniert gefüllt ist. Ein anschließendes 
Beschreiben des LCD mit Nullen für den gesamten Bereich hat das LCD dann 
gelöscht. Seit dem funktioniert es problemlos und ich habe heute schon 
einen eigenen Font dafür geschrieben. :)
Achja und ich verwende CPOL=1 (idle clk=1)  CPHA=1 (bei steigender 
Flanke übernehmen).

Hier mein Beispielcode für einen LPC935 (8051):
1
sbit CS = P2^4;
2
sbit A0 = P2^0;
3
sbit RESET = P2^1;
4
5
// Befehl/Daten an DogL128 schicken
6
// btDaten = 0: Kommando schicken
7
// btDaten = 1: Anzeigedaten schicken
8
void v_Write_DogL128(bit btDaten, unsigned char uDaten) {
9
  A0 = btDaten;
10
  CS = 0;
11
  SPDAT = uDaten;
12
  while((SPSTAT & 0x80) == 0x00);
13
  SPSTAT = 0xFF;
14
  CS = 1;
15
}
16
17
void init_DogL128() {
18
  RESET = 0;
19
  // 5ms warten
20
  v_Sleep_RTC(RTC_RELOAD_5MS);
21
  RESET = 1;
22
23
  // (2) Display start line set
24
  v_Write_DogL128(0, 0x40);  // Display start line 0
25
  
26
  // (8) ADC set
27
  v_Write_DogL128(0, 0xA1);  // ADC reverse
28
  
29
  // (15) Common output mode select
30
  v_Write_DogL128(0, 0xC0);  // Normal COM0~COM63
31
  
32
  // (9) Display normal/reverse
33
  v_Write_DogL128(0, 0xA6);  // Display normal
34
  
35
  // (11) LCD bias set
36
  v_Write_DogL128(0, 0xA2);  // Set bias 1/9 (Duty 1/65)
37
  
38
  // (16) Power control set
39
  v_Write_DogL128(0, 0x2F);  // Booster, Regulator and Follower on
40
41
  // (20) Booster ratio set
42
  v_Write_DogL128(0, 0xF8);  // Set internal Booster to 4x
43
  v_Write_DogL128(0, 0x00);  // 
44
45
  // (17) V0 voltage regulator set
46
  v_Write_DogL128(0, 0x27);  // Contrast set
47
48
  // (18) Electronic volume mode set
49
  v_Write_DogL128(0, 0x81);  // 
50
  v_Write_DogL128(0, 0x10);  // 
51
52
  // (19) Static indicator set
53
  v_Write_DogL128(0, 0xAC);  // No indicator
54
  v_Write_DogL128(0, 0x00);  // Flashing Mode
55
56
  // (1) Display ON/OFF
57
  v_Write_DogL128(0, 0xAF);  // Display on
58
}

Ciao,
     Rainer

von Timo Reinert (Gast)


Lesenswert?

Tut mir leid hatte die letzten Tag viel zutun. Danke für deinen Code 
werde die Initialisierung heute Mittag gleich mal ausprobieren.

Wie hast du den Funt gemacht?
Einfach eine Tabelle, oder wie?

mfg

von R. W. (quakeman)


Lesenswert?

Timo Reinert schrieb:
> Wie hast du den Funt gemacht?
> Einfach eine Tabelle, oder wie?

Ich habe für den Font ein zweidimensionales Array benutzt. Das Array ist 
dann als Konstante Font[x][y] aufgebaut, wobei x für das ASCII Zeichen 
(minus 0x20, da ich mit Space als erstem Zeichen arbeite) und y von 0-4 
für die 5 Bytes der Spalten des jeweiligen Zeichens stehen.
Die meisten Zeichen habe ich im Internet gefunden gehabt. Ein paar 
Sonderzeichen habe ich aber verändert, weil diese nicht gut aussahen. :)
Falls du dir den gesamten Beispielcode samt Font anschauen willst, dann 
schau mal in [1] rein.

Ciao,
     Rainer

[1] 
https://quakeman.homelinux.net/viewvc/uVision/trunk/Test_LCD_DogL128/test_dogl128.c?view=markup

von Felix (Gast)


Lesenswert?

Das Display hat mit dem AtMega168A perfekt funktioniert. Aus 
Speicherplatzproblemen verwende ich jetzt den AtMega328P. Nun wird 
sofort wenn das Display eingeschaltet wird ein zufälliges Pixelmuster 
angezeigt welches zwar durch Buchstaben und Zeichen überschrieben wird 
aber durch die lcd_clear..() Befehle nicht wegzubringen ist.
Der Code ist nach wie vor 1:1 gleich wie jenes vom M168A und jegliche 
verwendete Register und Einstellungen habe ich in den Datenblättern 
kontrolliert und sind ebenfalls gleich.
Die ausgegebenen Zeilen (Schrift) wird wie gewünscht angezeigt. Das 
Problem liegt darin das alle lcd_clear..() Funktionen nicht 
funktionieren und nie eine Zeile gelöscht wird sondern nur die nächste 
Zeile darüber geschrieben wird und das Pixelmuster im Hintergrund immer 
zu sehen ist.

Hatte schon jemand ein ähnliches Problem oder weiß woran es liegen 
könnte?

von R. W. (quakeman)


Lesenswert?

Meine v_Clear() Methode macht ja nichts anderes als das LCD vollständig 
mit weißen Pixeln zu überschreiben, da es keine native clear Funktion im 
Display gibt. Probier doch mal das LCD mit der gleichen Farbe zu füllen 
ob das geht (v_Rect() Methode). Dabei ist es egal ob weiß oder schwarz.
Ansonsten hatte ich mit meiner v_Clear() Methode noch nie Probleme 
gehabt.

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.