www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DG-16080 / LC7981 Treiber: Ausgabe Puffern möglich?


Autor: Rene K. (draconix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hiho,

hab da mal eine Frage bezüglich eines GLCD Displays... und zwar dreht es 
sich um dieses Pollin DG-16080 Dingens (Ja... Touch funktionierte).

Soweit funktioniert das Display auch wunderbar. Allerdings jedoch ist es 
etwas träge im Bildaufbau. Schon so das man es sehen kann. Gerade wenn 
man den Screen softwareseitig auf clear setzt (Da laß ich höhe mal 
breite 0x00 durchlaufen). Aber wie gesagt man sieht es.

Gibt es eine Möglichkeit den Screen zu "buffern" und dann auf einen 
Schlag zu Ausgabe zu geben?! Bietet der LC7981 Controller solch eine 
Möglichkeit?! Oder sogar Hardwaremäßig? Wozu ist der Reset Pin und der 
CS gut (Pin 15 und 16)? Dort habe ich Reset hardwareseitig auf high und 
CS auf low.

Jemand einen Hinweis?

Autor: K. J. (theborg0815) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi, also so wie es ist nicht allerdings war hier in nen terat dazu was 
wie man den kompletten Speicher nutzen kann eventuell geht es damit.

cs,reset sind nur zum resetten b.z.w. halt Chip selekt wird dir dabei 
auch erstmal nicht weiterhelfen.

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rene

also wenn du den Bildaufbau sehen kannst, dann machst du was falsch.

Ich kann bei meinem DG16080 den Bildinhalt löschen und neue Daten 
darstellen ohne dabei eine nennenswerte Verarbeitungszeit feststellen zu 
können.

Wie löschst du den Bildinhalt? - doch nicht etwa pixelweise!
Wertet deine LCD-Routine das Busy-Bit aus oder verwendest du Delay's?

Sascha

Autor: Rene K. (draconix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sascha Weber schrieb:
> @Rene
>
> also wenn du den Bildaufbau sehen kannst, dann machst du was falsch.
>
> Ich kann bei meinem DG16080 den Bildinhalt löschen und neue Daten
> darstellen ohne dabei eine nennenswerte Verarbeitungszeit feststellen zu
> können.
>
> Wie löschst du den Bildinhalt? - doch nicht etwa pixelweise!
> Wertet deine LCD-Routine das Busy-Bit aus oder verwendest du Delay's?
>
> Sascha

Nunja, es nun, wie gesagt, nicht so das ich es direkt sehen kann, es 
flackert halt kurz, das nervt aber :D

Ich warte die Busyflag mit einem delay ab von 3x nop, Das auslesen der 
Bussyflag würde über der Verarbeitsungszeit liegen - aber so 
ansastzweise bin ich bei ca. 1µs für die Flag.

Den Bildschirminhalt lösche ich byteweise (0x00) also in 1600 Schritten 
:/

Autor: Daniel T. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest einen µC mit etwas mehr Ram nehmen (z.B. atmega32) und das 
Bild in diesen Ram abspeichern. Dann kannst du das Bild periodisch 
aktualisieren indem du das Bild einfach überschreibst.

z.B in C etwa so:

ISR:
{
for(i=0;i<1600;i++) writeByte(bild[i]);
}


void setRamPixel(int x, int y)
{
 ...
 bild[i]=...;
}

Autor: Sascha Weber (sascha-w)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Rene K. schrieb:

> Den Bildschirminhalt lösche ich byteweise (0x00) also in 1600 Schritten

setzt du die Cursorposition für jedes Byte neu? Oder gibst du die 20Byte 
pro Zeile hintereinander aus?

Hab bei mir gerade mal gemessen das löschen des Bildinhaltes dauert 15ms 
und der Bildaufbau siehe Anhang 180ms.
ATMega644 läuft mit 18MHz.

Sascha

Autor: Rene K. (draconix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Daniel T. schrieb:
> Du könntest einen µC mit etwas mehr Ram nehmen (z.B. atmega32) und das
> Bild in diesen Ram abspeichern. Dann kannst du das Bild periodisch
> aktualisieren indem du das Bild einfach überschreibst.

Sehr schön danke, eine nette idee! Einfach selber einen Framebuffer 
bauen. µC ist sowieso ein ATMega32.

Sascha Weber schrieb:
> setzt du die Cursorposition für jedes Byte neu? Oder gibst du die 20Byte
> pro Zeile hintereinander aus?

Nein nein, ich schreibe die 1600byte hintereinander rein, da er ja eh 
jede Zeile bei Ende springt:
void lcd_clear(void) {
        unsigned int i;

        lcd_Cmove(0, 0);
        
        for (i = 0; i < 1600; i++) lcd_graphics_draw_byte(0x00);
}

Sascha Weber schrieb:
> Hab bei mir gerade mal gemessen das löschen des Bildinhaltes dauert 15ms
> und der Bildaufbau siehe Anhang 180ms.
> ATMega644 läuft mit 18MHz.

Nuja, messen könnte ich es ja mal mit meinem Logicanalyzer. Mein Atmega 
läuft mit 16Mhz, jedoch wird es halt durch die Bussyflag nicht deutlich 
schneller, auch kann ich das schreiben gegenüber einem 8Mhz Quarz nicht 
deutlich steigern, da ich dann die fallenden E-Flanke in der Zeit 
anpassen muß.

Autor: PIC Nico (eigo) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe nochmal eine Frage an die Profis hier: Ich kann mit der
Funktion von Benedikt, zum "springen" zu einer Adresse im Display:
void GLCD_SetAdress(unsigned char x, unsigned char y)
{
  unsigned short adress;
  adress=y*20+x;
  GLCD_writecom(0x0A);        // write adress low
  GLCD_writedata(adress&255);
  GLCD_writecom(0x0B);        // write adress high
  GLCD_writedata(adress/256);    
}

..nur bis zur Zeile 7 springen danach geht es nicht mehr, bzw. wird ab
hier dann nichts mehr geschrieben =( Wenn ich aber keine Zeile anwähle
sondern einfach nur wild aufs LCD drauf los schreibe schreibt er sauber
das ganze Display voll aufgrund des inkrementieren um 1 je Datensatz.

Meine Initialisierung sieht so aus:
void GLCD_Init_C(void)
{
  GLCD_RES=0;
  Delay10KTCYx(1);
  GLCD_RES=1;

  GLCD_writecom(0x00);  // Mode Con
  GLCD_writedata(0x3C);  // Character Mode, Cursor blink  
  
  GLCD_writecom(0x01);  // Character Pitch
  GLCD_writedata(0x77);  // 8x8 Chars  

  GLCD_writecom(0x02);  // Number of Characters
  GLCD_writedata(19);  // 19 Zeichen <--->

  GLCD_writecom(0x03);  // Set Duty
  GLCD_writedata(0x4F);  // 80-1

  GLCD_writecom(0x04);  // Cursor Position
  GLCD_writedata(0x07);  // Line 1

  GLCD_writecom(0x08);  // Start Adresse Low
  GLCD_writedata(0x00);  // 0

  GLCD_writecom(0x09);  // Start Adresse High
  GLCD_writedata(0x00);  // 0

  GLCD_writecom(0x0A);  // Cursor lower adress
  GLCD_writedata(0x00);  // 1

  GLCD_writecom(0x0B);  // Cursor upper adress
  GLCD_writedata(0x00);  // 1
}

1. Wo ist der unterschied zwischen Cursor Adresse und Start Adresse?

schönen Abend! Nico

PS: Ich hatte den Beitrag mal in einem anderen Thread gestellt der war 
aber schon ziemlich alt ich hoffe hier nimmt sich einer Zeit mir zu 
helfen =/

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.