mikrocontroller.net

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


Autor: Timo Reinert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie hast Du denn den Kontrast eingestellt?


Volker

Autor: Timo Reinert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Meine Init ist wie folgt:
 init_spi();

  reset_dogm128(); //reset dogm128

  //display start line
  send_cmd_dogm128(0x40); //line 0

  //bottom view
  send_cmd_dogm128(0xA0); //ADC reverse A1
  send_cmd_dogm128(0xC0); //COM0~COM63 output mode C8

  //normal / inverted
  send_cmd_dogm128(0xA6); //display normal, display off

  //hardware options
  send_cmd_dogm128(0xA2); //set bias 1/9
  send_cmd_dogm128(0x2F); //power  control circuits on
  send_cmd_dogm128(0xF8); //internal booster to 4x
  send_cmd_dogm128(0x00);

  //contrast options
  send_cmd_dogm128(0x27); //v0 = large
  send_cmd_dogm128(0x81); //set contrast
  send_cmd_dogm128(0x16); //default contrast value

  //indicator options
  send_cmd_dogm128(0xAC); //no indicator
  send_cmd_dogm128(0x00);

  //display on
  send_cmd_dogm128(0xAF); //display on

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Meine Init ist wie folgt:

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

MfG Spess

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Volker Schulz (volkerschulz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aendere mal tetweise
send_cmd_dogm128(0xA0); //ADC reverse A1
in
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

Autor: Timo Reinert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht 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:
 /CS <- 0
 A0 <- 1
 /RST <- 1

 /RST <- 0
 wait500us
 /RST <- 1
 wait50us

 A0 <- 0
 initialization
 /CS <- 1  

Autor: Timo Reinert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Timo Reinert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann mir niemand weiter helfen?

Autor: Chris (Gast)
Datum:

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

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht 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):
sbit CS = P2^4;
sbit A0 = P2^0;
sbit RESET = P2^1;

// Befehl/Daten an DogL128 schicken
// btDaten = 0: Kommando schicken
// btDaten = 1: Anzeigedaten schicken
void v_Write_DogL128(bit btDaten, unsigned char uDaten) {
  A0 = btDaten;
  CS = 0;
  SPDAT = uDaten;
  while((SPSTAT & 0x80) == 0x00);
  SPSTAT = 0xFF;
  CS = 1;
}

void init_DogL128() {
  RESET = 0;
  // 5ms warten
  v_Sleep_RTC(RTC_RELOAD_5MS);
  RESET = 1;

  // (2) Display start line set
  v_Write_DogL128(0, 0x40);  // Display start line 0
  
  // (8) ADC set
  v_Write_DogL128(0, 0xA1);  // ADC reverse
  
  // (15) Common output mode select
  v_Write_DogL128(0, 0xC0);  // Normal COM0~COM63
  
  // (9) Display normal/reverse
  v_Write_DogL128(0, 0xA6);  // Display normal
  
  // (11) LCD bias set
  v_Write_DogL128(0, 0xA2);  // Set bias 1/9 (Duty 1/65)
  
  // (16) Power control set
  v_Write_DogL128(0, 0x2F);  // Booster, Regulator and Follower on

  // (20) Booster ratio set
  v_Write_DogL128(0, 0xF8);  // Set internal Booster to 4x
  v_Write_DogL128(0, 0x00);  // 

  // (17) V0 voltage regulator set
  v_Write_DogL128(0, 0x27);  // Contrast set

  // (18) Electronic volume mode set
  v_Write_DogL128(0, 0x81);  // 
  v_Write_DogL128(0, 0x10);  // 

  // (19) Static indicator set
  v_Write_DogL128(0, 0xAC);  // No indicator
  v_Write_DogL128(0, 0x00);  // Flashing Mode

  // (1) Display ON/OFF
  v_Write_DogL128(0, 0xAF);  // Display on
}

Ciao,
     Rainer

Autor: Timo Reinert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht 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/trun...

Autor: Felix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: R. W. (quakeman)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.