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
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
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 |
Hi
>Meine Init ist wie folgt:
Und jetzt dürfen wir raten, in welcher Konfiguration du das Display
betreibst.
MfG Spess
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.
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
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
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 |
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
Richtigen SPI-Mode gewählt? Schon einmal andere Einstellungen für den Kontrast versucht?
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
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
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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.