Forum: Mikrocontroller und Digitale Elektronik 122x32 Display


von Johannes S. (strohchen)


Lesenswert?

Hallo,

ich habe mir bei Pollin das recht günstige Grafikdisplay gekauft und 
versucht mit einem atmega8 anzusteuern.
Ich benutze  dazu den Code von http://en.radzio.dxp.pl/sed1520/ und habe 
folgendes Problem. Die Schriftzeichen der font.h-Datei können wunderbar 
angezeigt werden, will ich jedoch einezelne Pixel und somit ja auch 
Linien und Bitmaps anzeigen, funktioniert es nicht. Es werden keine 
Linien oder Pixel angezeigt sondern nur schwarze Balken der vier 
"Zeilen" oder wie im Datenblatt Pages.

Ich glaube herausgefunden zu haben das es an er Funktion
GLCD_ReadData(); liegt, da bei mir der Rückgabewert immer 0xFF ist. Wenn 
ich hier permanent 0x00 eingebe funktioniert es, überschreibt dann 
jedoch die schon geschriebenen restlichen Pixel.
1
unsigned char GLCD_ReadData(void)
2
{
3
unsigned char tmp;
4
5
GLCD_WaitForStatus(0x80, 0); 
6
GLCD_WaitForStatus(0x80, 1); 
7
SED1520_CONTROL_PORT |= SED1520_A0; 
8
SED1520_CONTROL_PORT |= SED1520_RW; 
9
SED1520_DATA_DDR = 0x00; 
10
SED1520_DATA_PORT = 0xFF;
11
if(lcd_x < 61)
12
    {
13
    SED1520_CONTROL_PORT |= SED1520_E1;
14
    asm("nop");asm("nop");
15
    SED1520_CONTROL_PORT &= ~SED1520_E1;
16
  asm("nop");asm("nop");
17
  SED1520_CONTROL_PORT |= SED1520_E1; 
18
  asm("nop");asm("nop");
19
  tmp = SED1520_DATA_PIN; 
20
  SED1520_CONTROL_PORT &= ~SED1520_E1; 
21
  }
22
else 
23
    {  
24
    SED1520_CONTROL_PORT |= SED1520_E2;
25
    asm("nop");asm("nop");
26
    SED1520_CONTROL_PORT &= ~SED1520_E2;
27
  asm("nop");asm("nop");
28
  SED1520_CONTROL_PORT |= SED1520_E2;
29
  asm("nop");asm("nop");
30
  tmp = SED1520_DATA_PIN;  
31
  SED1520_CONTROL_PORT &= ~SED1520_E2; 
32
  }
33
SED1520_DATA_DDR = 0xFF; 
34
lcd_x++; 
35
if(lcd_x > 121)
36
  lcd_x = 0;
37
return tmp;
38
}

Ich habe schon mehr "NOPs" eingefügt usw. hilft alles nichts. löscht man 
z.B. die oberen beiden Setzen und Rücksetzen des E1 bzw. E2 raus, ist 
der Rückgabewert der Funktion die aktuelle Pageadresse aber eben nicht 
der eigentliche Wert der angezeigten Pixel.

Ich hoffe jemand kann mir helfen, da mir absolut nichts mehr einfällt 
was ich noch ausprobieren könnte.
Im Datenblatt des sed1520 Controllers habe ich noch gelesen, falls man 
etwas lesen möchte muss der PIN /RD auf low sein, ich habe ihn jedoch 
dauerhaft über pullup Widerstand auf high liegen. Dieser wird aber auch 
in der Bibliothek überhaupt nicht berücksichtigt. Kann es hierdrann 
liegen?

Habe schon alle Themen bezüglich dieses Displays durchgeschaut, aber 
kein ähnliches Problem gefunden.
Vielen dank

von Marko B. (glagnar)


Lesenswert?

Ich habe diese lib auch mal ausprobiert, hat aber nicht funktioniert. 
Ich hab mir dann meine eigene geschrieben.

Irgendwas hast Du bei der Pinbelegung verwechselt. Der RD\ Pin heisst in 
diesem Fall E1 bzw E2. Der SED1520 wird im 68er Modus betrieben. Einfach 
mal das Datenblatt lesen. Stellt sich jetzt natuerlich die Frage, 
welchen Pin Du dann auf High gelegt hast ...

Im uebrigen verschwendet der Code einen Pin. Der Reset wird nicht 
gebraucht und kann auf Vcc gelegt werden.

Der Busy-Wait ist auch ueberfluessig.

Statt den NOPs solltest Du ausserdem ein definiertes 1us Delay machen, 
z.B. mit _delay_us().

von Johannes S. (strohchen)


Lesenswert?

Hi,

vielen Dank schonmal, du sagst /RD entspricht je nach Controller E1 bzw 
E2. Bei dem Pollin Display ist ja aber CS1 = E1 und CS2 = E2, es gibt 
aber noch einen weiteren /RD anschluss. Den hab ich eben dauerhaft auf 
high liegen.

Marko B. schrieb:
> Im uebrigen verschwendet der Code einen Pin. Der Reset wird nicht
> gebraucht und kann auf Vcc gelegt werden.

Den hatte ich auch dauerhaft auf high liegen, funktioniert dann aber 
nicht. Weißt du, was ich da am Code abändern muss, damti ich ihn 
weglassen kann?

Danke

von Marko B. (glagnar)


Lesenswert?

Das Display hat ja zwei Controller. Da gibt es zwei Moeglichkeiten, den 
Controller auszuwaehlen: zweimal /CS herausfuehren und eine gemeinsame E 
Leitung, oder zweimal E und eine gemeinsame /CS Leitung. Ich denke mal, 
Dein Display hat letzteres.

Ob dann in einem Transfer gelesen oder geschrieben wird, wird dann mit 
dem R/W Pin festelegt: R/W high -> lesen, low -> schreiben.

Der R/W Pin heisst im 80er Modus /WR ... es gibt im 68er Modus keinen 
/RD Pin.

Um den Reset Pin wegzulassen musst Du im Code nichts abaendern, einfach 
auf High legen und das Display ist im 68er Mode, steht aber im 
Datenblatt.

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.