mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 122x32 Display


Autor: Johannes S. (strohchen)
Datum:

Bewertung
0 lesenswert
nicht 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.
unsigned char GLCD_ReadData(void)
{
unsigned char tmp;

GLCD_WaitForStatus(0x80, 0); 
GLCD_WaitForStatus(0x80, 1); 
SED1520_CONTROL_PORT |= SED1520_A0; 
SED1520_CONTROL_PORT |= SED1520_RW; 
SED1520_DATA_DDR = 0x00; 
SED1520_DATA_PORT = 0xFF;
if(lcd_x < 61)
    {
    SED1520_CONTROL_PORT |= SED1520_E1;
    asm("nop");asm("nop");
    SED1520_CONTROL_PORT &= ~SED1520_E1;
  asm("nop");asm("nop");
  SED1520_CONTROL_PORT |= SED1520_E1; 
  asm("nop");asm("nop");
  tmp = SED1520_DATA_PIN; 
  SED1520_CONTROL_PORT &= ~SED1520_E1; 
  }
else 
    {  
    SED1520_CONTROL_PORT |= SED1520_E2;
    asm("nop");asm("nop");
    SED1520_CONTROL_PORT &= ~SED1520_E2;
  asm("nop");asm("nop");
  SED1520_CONTROL_PORT |= SED1520_E2;
  asm("nop");asm("nop");
  tmp = SED1520_DATA_PIN;  
  SED1520_CONTROL_PORT &= ~SED1520_E2; 
  }
SED1520_DATA_DDR = 0xFF; 
lcd_x++; 
if(lcd_x > 121)
  lcd_x = 0;
return tmp;
}

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

Autor: Marko B. (glagnar)
Datum:

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

Autor: Johannes S. (strohchen)
Datum:

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

Autor: Marko B. (glagnar)
Datum:

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

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.