Forum: Mikrocontroller und Digitale Elektronik Streifen im EA DOGM128 und sehr dunkel


von Tobi (Gast)


Lesenswert?

Hallo zusammen,

ich probiere nun schon eine Weile herum und versuche mein DOGM128 heller 
zu bekommen. Wenn man auf eine Anzeige senkrecht drauf schaut sieht man 
nur einen schwarzen Bildschirm. Schaut man seitlich darauf sieht man den 
Text ganz leicht. Ich hab zwar keinen BG LED aber das sollte ja auch 
erstmal ohne besser funktionieren.

Habe mit dem Kontrast schon rumgespielt jedoch nicht viel erreicht.
An einer Stelle geht sogar ein schwarzer Streifen von oben bis unten.. 
wie kann das sein??

Meine Init Parameter:

0x40,0xA1,0xC0,0xA7,0xA2,0x2F,0xF8,0x00,0x27,0x81,0x25,0xAC,0x00,0xAF

Hoffe jemand kann mir da weiterhelfen..

Mfg
Tobi

von Hella (Gast)


Lesenswert?

Tobi schrieb:
> Ich hab zwar keinen BG LED aber das sollte ja auch
> erstmal ohne besser funktionieren.

Nicht unbedingt.
Nur bei 128W-6 und 128L-6 kann man ohne Beleuchtung etwas sehen...
Hört sich ganz so an, als hättest Du ein anderes ;)

von Lehrmann M. (ubimbo)


Lesenswert?

Kannst du mechanische Beschädigung ausschließen ?

von Tobi (Gast)


Lesenswert?

Hallo,

danke für eure Antworten.

Ich habe das 128W!

Allerdings habe ich auch Polyester kondensatoren und keine Elkos wie es 
jemand hier im Forum schon geschrieben hat. Allerdings emitnen die dann 
auch das es daran nicht gelegen haben kann.

-> Beitrag "DOG LCD 128x64 Initialisierung ATmega8 (Assembler)"

leider hilft dieser Beitrag dann auch ned weiter.

Ich denke ich kann eine Beschädigung ausschließen, da andere dieses 
Problem auch schon hatten.
Siehe auch:

Beitrag "Re: EA DOGM128 128x64 Grafik Display"

Leider steht dort dann auch keine Lösung.

... Jedoch kann das mit den Elkos doch ned sein da im Datenblatt auch 
keine verwendet werden?!?!

von Tobi (Gast)


Lesenswert?

Achja,

komisch ist auch, dass der Bildschrim sowohl bei einer 
Kontrasteinstellung von 0 als auch 64 dunkel bleibt .. lediglich bei 25 
oder 16.. (also ein Wert dazwischen) ganz leicht etwas zu sehen ist.

Bei mir tritt auch das selbe Problem auf wie jemand schon schrieb in 
einem meiner genannten Links, dass bei einem Reset für bruchteile einer 
Sekunde der Text sehr gut zu lesen ist. Jedoch dann verschwindet wegen 
des Resets.

Komisch ist auch dass es vorkommen kann, wenn ich einen Text anzeige 
dass dann auf magische weise ein Reset meines ATMegas passiert wenn er 
sich eigentlich nur in der while(1); schleife am Ende befindet und das 
Display noch einen String anzeigt.
Dieses Verhalten tritt allerdings erst auf seit ich das Display 
dazugebaut habe.
Ich habe die Schaltung schon mehrmals überprüft und kann eine 
Fehlvertratung somit ausschließen.

Ich habe die Schaltung mit den 9 Kondensatoren am Display aus dem 
Datenblatt aufgebaut und wenn ich sie gegen Masse messe habe ich so 
zwischen 13,6 und 3 Volt. Man kann grob sagen von Pin 21 bis 25 an denen 
sich die ersten 5 Kondesatoren befinden wird die Spannung immer etwas 
weniger ..

Hoffe das hilft irgendwie weiter bei der Fehlerlokalisation.

Mfg Tobi

von XMEGA (Gast)


Lesenswert?

Servus,


Tobi schrieb:
> Kontrasteinstellung von 0 als auch 64 dunkel bleibt .. lediglich bei 25
>
> oder 16..


im Datenblatt steht eindeutig 16.
Beim DOGM132  steht 1F!

Dass sich dieser Wert (16) nicht ändern lässt, ist richtig.



Hier meine Initialisierung:


  0x40,   // Display Start Line 0
  0xA1,   // Display Normal / reverse A0
  0xC0,    // Display Normal / reverse C8
  0xA6,
  0xA2,   // Set Bias
  0x2F,   // Power Control set
  0xF8,   // Booster Ratio set
  0x00,   // ""
  0x27,   // Contrast set
  0x81,
  0x16,
  0xAC,   // Static Indicator set
  0x00,   // ""
  0xAF    // Display on/off



Gruß XMEGA

von Holger W. (holgerw)


Lesenswert?

Beim DOGL habe ich 1206 SMD Keramikkondensatoren 1µF ungepolt verwendet 
und nach leichtem verändern des letzten Kontrastwertes ein ordentliches 
Bild erhalten.

Holger

von Tobi (Gast)


Lesenswert?

XMEGA: stimmt das steht im Datenblatt. Ist aber ja nur ein Beispielwert. 
0x81 sagt das ich mit dem folgenden Befehl den Kontarstwert übergeben 
möchte. dieser kann zwischen 1 und 64 betragen... also so hab ichs 
zumindest verstanden :)

Holger: Hattest du ein ähnliches Problem? Zumindest nutzt du auch keine 
gepolten Kondensatoren. Weist du noch was du geändert hast? Ich werde 
mal noch ein paar Kontrastwerte versuchen vielleicht bringts ja was. 
Hast du die Init sonst wie im Datenblatt übergeben?

von Tobi (Gast)


Lesenswert?

Achja, das Display ist von Beginn an komplett schwarz und wenn ich einen 
Text ausgebe ist dieser nicht zu sehen. Erst wenn ich mein Handy drunter 
lege ist ganz schwer etwas zu erkennen. Wenn ich diesen Kontrast mit dem 
Kontrast vergleiche der bei Display an/aus herrscht ist das ein 
himmelweiter Unterschied.
Genau diesen Kontrast müsste man doch auch haben wenn alles korrekt 
funktioniert?!?

von Holger W. (holgerw)


Lesenswert?

Hatte es in einem anderen Thread schon angegeben, meine Init sieht jetzt 
so aus:

0x40,0xa1,0xc0,0xa6,0xa2,0x2f,0xf8,0x00,0x27,0x81,
0x13  <-- diesen Wert habe ich von 0x10 auf 0x13 geändert.
0xac,0x00,0xaf

Ich hatte ganz wenig Kontrast und hellere Sreifen abhängig vom Inhalt 
der oberen Zeilen. Jetzt läuft es.


Holger

von Tobi (Gast)


Lesenswert?

Hallo Holger,

danke für deine Antwort.

Leider bringt diese Einstellugn bei mir keinen Erfolg :(
Ansonsten habe ich deine beschriebenen Effekte mit den Streifen auch.

Ich bekomme es auch nicht hin, dass das Display am Anfang alles hell ist 
anstatt dunkel. Sobald ich das Display initialisiere wird alles schwarz.

Müsste ja A6/A7 sein um das umzustellen. Passiert aber nicht viel. 
Leider

von Holger W. (holgerw)


Lesenswert?

Komplett schwarz sollte es am Anfang nicht sein, nach der Init wird bei 
mir zufälliger Inhalt angezeigt, also verstreute Pixel.
Vielleicht ist noch ein Fehler bei deiner Ansteuerung.
Mit welcher Taktfrequenz steuerst du es an ? Ich habe PIC 18F mit 
"handgemachter" SPI mit 16 MHz. Die Pins sind mit Widerständen auf 3,3V 
angepasst.

Holger

von Tobi (Gast)


Lesenswert?

hab am ATMega 11,0592 MHerz.
ein Lipo versorgt das ganze ohne widerstände.. also alle shat ein wenig 
mehr Spannung als es soll. Dürfte aber nichts ausmachen.

SPI Takt ist gerade auf 1/16.

Habe aber gerade noc heine andere Erkenntnis gewonnen. Und zwar habe ich 
im laufenden Betrieb knallhart die Kondensatoren nacheinander 
rausgezogen. Plötzlich war ein Bild da als ich alle Kondensatoren die 
auf Masse liegen entfernt hatt Oo.

Hab dann in zufälliger Reihenfolge die Kondensatoren wieder reingebaut. 
Mal wurde es besser mal schlechter .. aber wenn alle drin sind ist es 
wieder schwarz. Hab auch unterschiedliche Kontraste in der Schrift.

von Tobi (Gast)


Lesenswert?

achja und habe viele senkrechte Streifen drin.

von Floh (Gast)


Lesenswert?

Tobi schrieb:
> ein Lipo versorgt das ganze ohne widerstände.. also alle shat ein wenig
> mehr Spannung als es soll. Dürfte aber nichts ausmachen.

Also volle 4,2 Volt am LCD?
->Außerhalb der Specs?

von Tobi (Gast)


Lesenswert?

Also der Lipo liefert nur 3,7 Volt.

Komischerweise macht der Kondensator am VOut das Display komplett 
schwarz und der erste an Pin 21 auch... hm..

von Holger W. (holgerw)


Lesenswert?

Dann wird wohl der interne Booster eine zu hohe Spannung erzeugen.
Ich würde die Spannung mal reduzieren oder Boosterratio verändern.

Holger

von Floh (Gast)


Lesenswert?

Tobi schrieb:
> Also der Lipo liefert nur 3,7 Volt.

Das steht wohl auf dem Akku drauf?
Schon mal gemessen, was wirklich rauskommt?

Was meinste wohl, warum der Hersteller der Displays einen 
Spannungsbereich angibt, in dem das LCD arbeitet? Aus Jux? Oder weil er 
Langeweile hat?

von Tobi (Gast)


Lesenswert?

hab die 3,7 gemessen... aber gut hab nen Spannungsbegrenzer eingebaut 
und hab nun glatte 3,3 Volt (gemessen :) ... immer noch das gleiche...

werde das mit dem Booster noch probieren... hab ausserdm einen 
senkrechten Streifen der nie verschwindet.. egal was ich mache.. er 
wirkt irgendwie bläulich... komisch... vermute das zumindest an der 
Stelle das Display nen Fehler hat..

von Tobi (Gast)


Lesenswert?

witzig... wenn ich die Masse ziehe blebt genau dieser evtl. kaputte 
Streifen im Display stehen. Hat dafür jemand ne erklärung?

von Tobi (Gast)


Lesenswert?

so nach stundenlangen Versuchen hab ich nun endlich ein Bild.

Allerdings verhält sich das ganze jetzt etwas komisch.
Ich habe im ersten Schritt sichergestellt, dass auch alle 9 Kondesatoren 
wirklich Kontakt haben (Baue das ganze auf einem Steckbrett als Versuch 
auf) und dann ging es ohne Streifen.

Allerdings war der Kontrast noch sehr wenig.

Gerade habe ich dann mal die Masse, welche zum Display läuft, 
herausgezoegn und was passiert? Ich habe ein einwandfreies 
Bild?!?!?!??!?!

Ich verstehe die Welt nicht mehr woher der nun seine Masse zieht.

Habe alle anderen Stromzweige mal abgetrennt, 5V Wandler, und 
Netzwerkchip. Somit habe ich nur noch den ATMega32 und das Display 
angeschlossen.
Was kann man da groß falsch machen? Jemand ne Ahnung??

von Tobi (Gast)


Lesenswert?

So hab das nun auch hinbekommen.

Das mit der Kontrasteinstellung ist ja ein riesen Mist.

Ich hab jetzt mal in einer Schleife im 0,5 Sec. Takt alle Kontraste 
durchlaufen lassen wärend ein Text sichtbar war.
Der Kontrast wechselte ca. 10 mal von schlecht nach gut. Schaltete ich 
die Masse wieder dran, verhielt es sich genau andersrum. Somit konnte 
ich die Masse wieder anschließen und fand dann den besten Wert für den 
Kontrast heraus.
Die Spec ist echt schlecht dokumentiert da man dort eindeutig versteht, 
dass der Kontrast von 0 bis max eizustellen ist und nicht so ein auf und 
ab!

Wobei ich noch nicht ganz durchsteige ist das beschreiben der Pixel.

Wenn ich (wie aus einem Tutorial) die Initialisierung mache und danach : 
$00, $7F, $09, $09, $76 an daten sende soll angeblich ein "R" 
herauskommen. Im Tut kann ichs nachvollziehen allerdings kommt bei mir 
eine 8 Pixel hohe komplett schwarze Zeile heraus?!?! Oo
In dieser Zeile findet man nur irgendwo eine 0x09 wieder sonst nichts.
Kann das jemand von euch verstehen?

Mfg Tobi

von Tobi (Gast)


Lesenswert?

hm,

habe noch ein Problem beim Display beschreiben.

Und zwar wenn ich ein Byte irgendwo auf das Display schreibt 
funktioniert das auch jedoch wird der Rest der Zeile dann schwarz. Ist 
das normal? Finde dazu nichts in der Spec.

Mfg Tobi

von Tobi (Gast)


Angehängte Dateien:

Lesenswert?

Hab mal ein Bild angehägt wie das rauskommt..

Jemand ne Idee? Bin so langsam ratlos..

von Holger W. (holgerw)


Angehängte Dateien:

Lesenswert?

Ohne die Ansteuerung zu kennen wird das wohl schwer.
Mein DOGL tut ...

Holger

von Tobi (Gast)


Lesenswert?

sag was du brauchst und du bekommst es :)

was machst du z.b. vom Start bis zum senden des ersten Zeichens im Code 
alles?

Start - SPI init - displ. init - zeichen senden...

könntest du mir mal bitte nen codeschnippsel hier reinwerfen? Zum 
Vergleich....

von Tobi (Gast)


Lesenswert?

achso du hast nen DOGL ich hab nen M ... weis jetzt ned ob das nen 
riesen Unterschied macht..

Hier mal bissl was ich so mache:


----------- SPI --------

uint8_t init_spi(){
  // Set SPI PIN Configuration
  SPI_IO = SPI_IO_CONF;
  LCD_IO = LCD_IO_CONF;
  LCD_CS_PORT |= LCD_CS_PIN;    // CS auf 1 = LCD Disable

  // SPI Master aktivieren
  SPCR = SPI_CONF;

  //double speed
  SPSR |= 0x01;

  return 1;
}

void enable_LCD(){
  LCD_CS_PORT &= ~(LCD_CS_PIN);  // CS auf 0 = LCD Enable
  for (int a = 0;a<100;a++){
     SPDR = 0xFF;
    loop_until_bit_is_set(SPSR,SPIF);
  }
}


void disable_All(){
  LCD_CS_PORT |= LCD_CS_PIN;    // CS auf 1 = LCD Disable
  for (int a = 0;a<100;a++){
     SPDR = 0xFF;
    loop_until_bit_is_set(SPSR,SPIF);
  }
}

-------- DISPLAY Functions -----------

volatile unsigned char 
char_x=0,char_y=1,char_height_mul=1,char_width_mul=1;

uint8_t init_display(){

  //Reset the Display Controller
  LCD_PORT_RST &= ~(LCD_PIN_RST);
  _delay_ms(100);
  LCD_PORT_RST |= (LCD_PIN_RST);
  asm("nop");

  display_write_byte(LCD_CMD,DISPLAY_START_LINE);
  display_write_byte(LCD_CMD,LCD_TOPVIEW);
  display_write_byte(LCD_CMD,LCD_SCAN_DIR_NORMAL);
  display_write_byte(LCD_CMD,LCD_NORMAL);
  display_write_byte(LCD_CMD,LCD_BIAS_1_9);
  display_write_byte(LCD_CMD,LCD_POWER_LOW_POWER);
  display_write_byte(LCD_CMD,LCD_BOOSTER_SET);
  display_write_byte(LCD_CMD,LCD_BOOSTER_6);
  display_write_byte(LCD_CMD,LCD_VOLTAGE_MAX);
  display_write_byte(LCD_CMD,LCD_VOLUME_MODE_SET);
  display_write_byte(LCD_CMD,LCD_VOLUME_MODE_REG_MIN+0x24);
  display_write_byte(LCD_CMD,LCD_INDICATOR_OFF);
  display_write_byte(LCD_CMD,LCD_INDICATOR_MODE_OFF);
  display_write_byte(LCD_CMD,LCD_ON);

  //display_clear();

  return 1;
}

void display_write_byte(uint8_t isCommand, unsigned char data)
{
  enable_LCD();

  if(isCommand == 0)
    LCD_PORT_A0 &= ~(LCD_PIN_A0);
  else
    LCD_PORT_A0 |= LCD_PIN_A0;

  SPDR = data;
  while(!(SPSR & (1<<SPIF)));

  disable_All();
}

void display_clear(){

  unsigned char row, col;

  for(row=0;row<8;row++)
  {
    //display_goto_Point(1,row);
    for (col=0;col<132;col++)
    {
      display_goto_Point(col,row);
      display_write_byte(LCD_DATA,0x00);
    }
  }
}

void display_goto_Point(unsigned char x, unsigned char y){

  display_write_byte(LCD_CMD,LCD_PAGE_ADDRESS | ((y) & 0x0F));
  display_write_byte(LCD_CMD,LCD_COL_ADDRESS_MSB | ((x>>4) & 0x0F));
  display_write_byte(LCD_CMD,LCD_COL_ADDRESS_LSB | ((x) & 0x0F));
}


-------------- MAIN ----------

        // SPI Init
  uint8_t ret = init_spi();

        LED_PORT_GREEN  |= LED_PIN_GREEN;  // Turn on green LED
  // Display Init
        //display_clear();
  ret = init_display();

  //char_x=0;//0-128
  //char_y=1; //0-8
  //display_write_str("DASistEINtestGANZ");
  //char_x=0;
  //char_y=2;
  //display_goto_Point(0,1);
  display_write_byte(LCD_DATA,0xF7);
  //  display_goto_Point(1,1);
  display_write_byte(LCD_DATA,0x09);
  //  display_goto_Point(2,1);
  display_write_byte(LCD_DATA,0x09);
  //  display_goto_Point(3,1);
  display_write_byte(LCD_DATA,0x66);
while(1);

von Holger W. (holgerw)


Lesenswert?

DOGL unterscheidet sich vom DOGM ...

Also ich nutze einen PIC 18F2520, 16MHz Quarz, alles in Assembler.
Initialisierung, danach Ausgabe in Pages, dann (im Bild) Ausgabe über 
eigenen Pixelroutinen. Waits zwischen den Ausgaben gibt es keine, nicht 
mal ein NOP.
Prinzipiell scheint es ja bei dir zu funktionieren, ich vermute mal du 
sendest zu viele Zeichen.
Du hast den (vermutlich) fehlerhaften Code, poste doch mal.
Mit C oder Atmel Assembler kann ich dir aber leider nicht viel helfen.

Holger

Edit: ok hat sich überschnitten, ich schau mal ...

Edit2: nee sorry da muss ich passen ...
da möchte ich nicht mal wissen was das tut:  LCD_PORT_A0 &= 
~(LCD_PIN_A0);

von Tobi (Gast)


Lesenswert?

klar... es sieht so aus als würde ich zu viele Zeichen senden.. 
allerdings wenn ich mal nicht einen character sende mit der 
entsprechenden umfangreicheren Funktion... sondern nur ein Byte sende... 
also wie man oben im Code ja sieht, passiert da nicht viel mehr als 4 
Byte senden fertig...

Was auch komisch ist, wenn ich ein clear mache dann läuft die obere 
Funktion durch und auf dem Display wir jede Zeile erstmal schwarz.. also 
jede Page bevor sie dann von links nach rechts hell wird.. das Ganze 
dauert komischerweise auch knapp 2 Sek. .. zu lange?!?!?

Ich habe einen ATMega32 .. an dem hängt nen Quarz mit 11,0952 MHz und 
SPI ist auf 1/2 Takt gestellt..

von Tobi (Gast)


Lesenswert?

LCD_PORT_A0 &= ~(LCD_PIN_A0);

schaltet den Port an dem A0 hängt aus

LCD_PORT_A0 |= LCD_PIN_A0;

schaltet ihn an... das funktioniert... habs sogar gemessen :) .. zeichen 
kommen ja auch an..

von Holger W. (holgerw)


Lesenswert?

Da muss ich mich jetzt ausklinken, lese aber weiter mit, wenn mir noch 
was auffällt meld ich mich wieder.
Ich setz mein Pin mit einem ordinärem BSF LCD_PIN_A0

Viel Erfolg

Holger

von Tobi (Gast)


Lesenswert?

Danke dir Holger für deine Zeit :)

von Arc N. (arc)


Lesenswert?

Hier mal wie es bei mir funktioniert:
DOGM128-W6, Schaltung ist die 3.0/3.3V Single Supply aus dem Datenblatt, 
Spi-Takt 12 MHz, Spi-Mode = 3, Kondensatoren sind keramische X7R, 1 uF, 
25V, 0603.
Was allerdings Probleme bereiten kann (das Teil ist hier auch gesteckt, 
damit es richtig im Gehäuse sitzt), ist eben diese Verbindung d.h. kein 
richtiger Kontakt -> kein Kontrast und/oder Streifen, wackeln hilft dann 
hin und wieder.
Die Lösung war ein billiger, aufgetrennter IC-Sockel mit Federkontakten.
U.U. kann es auch am Reset liegen
1
void LCDInit() {
2
  DOGM128SELECT();
3
  DOGM128A0HIGH();
4
  DOGM128RSTHIGH();
5
6
  DOGM128RSTLOW();
7
             // wait 500 us
8
  Wait(100);  
9
  Wait(100);
10
  Wait(100);
11
  Wait(100);
12
  Wait(100);
13
  DOGM128RSTHIGH();
14
15
  DOGM128A0LOW();
16
17
             // init see datasheet
18
  DOGM128Send(0x40);
19
  DOGM128Send(0xa1);
20
  DOGM128Send(0xc0);
21
  DOGM128Send(0xa6);
22
  DOGM128Send(0xa2);
23
  DOGM128Send(0x2f);
24
  DOGM128Send(0xf8);
25
  DOGM128Send(0x00);
26
  DOGM128Send(0x27);
27
  DOGM128Send(0x81);
28
  DOGM128Send(0x16);
29
  DOGM128Send(0xac);
30
  DOGM128Send(0x00);
31
  DOGM128Send(0xaf);
32
33
  DOGM128DESELECT();
34
}

von Stephan (Gast)


Lesenswert?

Hi,

mal eine Frage:
1
void display_write_byte(uint8_t isCommand, unsigned char data)
2
{
3
  enable_LCD();
4
5
  if(isCommand == 0)
6
    LCD_PORT_A0 &= ~(LCD_PIN_A0);
7
  else
8
    LCD_PORT_A0 |= LCD_PIN_A0;
9
10
  SPDR = data;
11
  while(!(SPSR & (1<<SPIF)));
12
13
  disable_All(); // <----
14
}
Die Funktion sieht grob gesagt ok aus, aber disable_All ????
WAS SOLL DAS???
1
void disable_All(){
2
  LCD_CS_PORT |= LCD_CS_PIN;    // CS auf 1 = LCD Disable
3
  for (int a = 0;a<100;a++){  // <---
4
     SPDR = 0xFF;             // <--- 
5
    loop_until_bit_is_set(SPSR,SPIF);
6
  }
7
}

was soll das bewirken???
hiermit sendest du die schwarzen Balken!!!!

mfg
Stephan

von Tobi (Gast)


Lesenswert?

oh man du hast recht... wie kann man denn so daneben sein :)

Das ist ein übernommenes Codestück aus einem anderen Projekt mit eienr 
SD Karte bei der das gesendet werden soll... ich hab das jetzt 
unetrbewusst wie ein Delay betrachtet und hab mit meinem eingefahrenen 
Blick da immer drüber weggeschaut!!!

Heiei... Vielen Dank Stephan!!!

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.