Forum: Mikrocontroller und Digitale Elektronik Lcd DG12232 mit Mega8


von Andre W. (fuxxx)


Lesenswert?

Hi

ich versuche zurzeit ein grafik lcd (das DG12232, das soweit ich gelesen 
hab zwei SED1520 controller nutzt) mit einem Mega 8 in C anzusteuern 
(Takt 1 Mhz).
Allerdings stecke ich dabei gerade fest und weiß nicht weiter.

Die Kontrastspannung hab ich erzeugt, alles soweit ichs verstanden hab 
verkabelt und die C Library von hier verwendet:
http://en.radzio.dxp.pl/sed1520/
(Hat die schonmal jemand benutzt?)

Ein Beispiel wie man die lib verwendet hab ich dort leider nicht 
gefunden, momentan sieht der code bei mir so aus:
1
  GLCD_InitPorts();
2
  GLCD_Init();
3
  GLCD_ClearScreen();
4
5
  while (1){
6
    for (x=0;x<122;x+=3){
7
      for (y=0;y<32;y+=3){
8
        GLCD_SetPixel(x,y,1);
9
        _delay_ms(100);
10
      }
11
    }
12
  GLCD_ClearScreen();
13
  _delay_ms(1000);  
14
  }

Er zeichnet auch was, aber statt jedes 3. pixel zu setzen zieht er solch 
einen streifen übers bild:
http://www.imagebanana.com/view/x4m4v34f/fehler1.jpg

Die grafik lib setzt einen pixel, indem sie anscheinend die daten vom 
display liest (immer ein byte), den pixel mit "or" draufpackt und das 
ganze zurück zum display schickt.
Wenn ich das Auslesen auskommentiere sieht das Bild so aus:
http://www.imagebanana.com/view/c5man1/fehler2.jpg
Das entspricht fast dem was ich erwarten würde, es wird halt immer nur 
ein Pixel aus dem Byteblock gesetzt, die andern beim Setzen des letzten 
natürlich überschrieben...

Die Frage ist jetzt was mach ich falsch?
Stimmen die Befehle nicht, muss ich mit der Lib anders umspringen?
Oder könnte es an einer falschen oder zu langen Verkabelung liegen?
Vom Display sind A0, RW, RES und CS1, CS2 angeschlossen.
CS1 und CS 2 heissen in der lib E1 und E2 aber ich nehm mal an die 
bezeichnungen sind äquivalent oder?

Wäre wirklich nett, wenn sich das mal jemand angucken könnte und mir ein 
wenig mit dem ding hilft :)

von Matthias K. (matthiask)


Lesenswert?

Das DG12232 hat etwas anders herausgeführte Pins.
Kuck mal hier, da ist auch eine Beschreibung dabei:
Beitrag "DG-12232 Ansteuerung von 2xSED1520 Controller"

von Andre W. (fuxxx)


Lesenswert?

Vielen Dank für den Link.
Hab heute mit der Lib gekämpft und am Ende kam tatsächlich ein richtiges 
Bild auf dem Display an.
Der Unterschied ist, dass diese Lib den "Enable" Pin ansteuert.
Daran wirds wohl gelegen haben, dass bei mir nur Müll ankam.

Dennoch hat die Lib anscheinend noch ganz schöne Probleme.
Am Anfang wollte gar nichts, weil da wild hin und her und doppelt 
inluded wurde.
Denn gab es widersprüchliche Deklerationen einer Funktion (WaitForStatus 
wenn ich mich nicht täusche)
Der Header und Code sagt, die kriegt einen Parameter, sie braucht aber 
zwei.
Da hab ich noch nicht ganz rausgefunden, was ich als "Controller" 
Parameter da nun übergeben muss (ich nehm im Moment immer 0).

Worans jetzt scheitert ist, dass er wenn ich ein Pixel einzeln setzen 
will einfach stehen bleibt und nichts macht.
Bilder und Texte gehen, Pixel einzeln jedoch nicht.

Die Idee bei mir ist nun folgende:
ich nehm die Lib die ich Anfang hatte und ergänze den Teil mit dem 
Enable Pin.
Oder hab ich hier ein Brett vorm Kopf und seh die Lösung einfach nicht?

von Andre W. (fuxxx)


Lesenswert?

Hi

so nach 2tägigem rumgewurschtel im Code und Suchen im Datenblatt hab ich 
den Übeltäter endlich gefunden.
Grund für das Problem war, dass das Auslesen der Daten nicht 
funktionierte, da kein Dummyread ausgeführt wurde (Was aber so im 
Datenblatt steht)
Beide verwendeten Libs haben dies einfach ignoriert und funktionierten 
deshlab nicht.

folgendermaßen sieht jetzt der korrigierte Code bei mir aus:
1
unsigned char GLCD_ReadData(void)
2
{
3
unsigned char tmp;
4
5
GLCD_WaitForStatus(0x80, 0); 
6
GLCD_WaitForStatus(0x80, 1); 
7
8
SED1520_CONTROL_PORT |= (SED1520_A0 | SED1520_RW); 
9
SED1520_DATA_DDR = 0x00; 
10
SED1520_DATA_PORT = 0xFF;
11
12
  if (lcd_x < 61) {SED1520_CONTROL_PORT &= ~SED1520_CS1;}
13
   else { SED1520_CONTROL_PORT &= ~SED1520_CS2;}
14
  
15
  //dummy read
16
  SED1520_CONTROL_PORT |= SED1520_E; 
17
  wait;
18
  SED1520_CONTROL_PORT &= ~SED1520_E;
19
  
20
  wait;
21
  SED1520_CONTROL_PORT |= SED1520_E; 
22
  wait;
23
  tmp = SED1520_DATA_PIN; 
24
  wait;
25
  SED1520_CONTROL_PORT &= ~SED1520_E; 
26
  
27
  SED1520_CONTROL_PORT |= (SED1520_CS1 | SED1520_CS2);
28
  
29
  SED1520_DATA_PORT = 0x00;
30
  SED1520_DATA_DDR = 0xFF; 
31
  
32
  lcd_x++; 
33
  if(lcd_x > 121)
34
    lcd_x = 0; 
35
  
36
  return tmp;
37
}

jetzt klappt alles wunderbar, bis auf die tatsache das das malen auf dem 
display noch zulange dauert...
aber das krieg ich schon hin :)

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.