Forum: Mikrocontroller und Digitale Elektronik schnelleres ks0108 GLCD


von Lisa (Gast)


Lesenswert?

Hallo zusammen

Ich habe mir vergangene Woche dieses Display geholt:
http://www.pollin.de/shop/dt/NTc1OTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LCD_Modul_TG12864B_03.html

Funktionieren tut soweit auch alles ohne Probleme, allerdings ist mir 
aufgefallen, das es relativ träge reagiert.
Einem anderen Forumsbeitrag hier konnte ich entnehmen, dass Weiss/Blaue 
Displays generell langsamer seien als z.B. Schwarz/grüne.
Bei Reichelt bin ich dann auf dieses gestossen:

http://www.reichelt.de/LCD-128SW-DIP/3/index.html?&ACTION=3&LA=446&ARTICLE=53971&artnr=LCD+128SW+DIP&SEARCH=ks0108

Leider wird kein Zeitbedarf für das Umstellen der Pixel im Datenblatt 
angegeben, darum frage ich hier nach persönlichen Erfahrungen: Ist das 
Schwarz/weisse Display schnell genug, um in "nützlicher Frist" komplett 
verschiedene "Textseiten" anzuzueigen? Bzw. ist es schnelle als das 
weiss/blaue.

Noch zu meinem Setup: Ich setze einen Atmega32 bei 8Mhz ein und habe das 
Display über 8 Leitungen an den COntroller angeschlossen. Verwendet wird 
die Grafik Library hier aus dem Forum (apetech library)

Zum Anschluss auch noch eine Frage: Muss ich in der Library irgendwo 
einstellen, das ich den 8bit Modus verwende, oder ist das automatisch 
so?

Liebe Grüsse

von Lisa (Gast)


Lesenswert?

Ah noch als Nachtrag:
Ich habe mir auch überlegt, ob es was hilft bei der nächsten 
Reichelt-Bestellung noch ein 16MHz Quarz zu bestellten.
Wenn es aber wirklich so ist, dass das LCD einfach zu langsam beim Pixel 
umschalten ist, dann hilft das ja nicht.

von Georg G. (df2au)


Lesenswert?

Gibt es auch ein Datenblatt, das diese Namen verdient?

Was meinst du mit "träge reagiert"? Gibt es Schatten beim Umschalten 
oder dauert einfach ein Bildaufbau zu lange?

Die Farbe eines LCD hat in erster Näherung nichts mit der 
Reaktionsgeschwindigkeit der Pixel zu tun.

von Lisa (Gast)


Lesenswert?

Hi Georg und Danke für deine Antwort

Der Bildaufbau dauert lange: Wenn ich Text auf das Display schreibe, 
dann baut sich dieser Langsam auf, kann man sich ein bisschen wie eine 
Laufschrift vorstellen.
Ich denke eine komplette Textzeile mit Text dauert ca. 2 Sekunden.

Schlimmer ist es aber, wenn man das Display löschen möchte, für neuen 
Inhalt.
Dann wird das komplette Display mit einem Vierreck (habe in die 
Implementation geschaut) überschrieben. Und zwar immer 8 Pixel aufs mal 
(Also es werden nacheinander Vierrecke mit 128 * 8 Pixel geschrieben, 
bis das ganze Display leer ist).

Ich sehe zwei Ansatzpunkte:
1) Schnelleres LCD
2) Modifikation der Library dahingehend, dass ich mir beim schreiben 
merke, welche Pixel nun weiss sind, und beim Löschen werden nur explizit 
die weissen Pixel wieder blau gemacht.

von Lisa (Gast)


Lesenswert?

Mist, habe deine Frage nach dem Datenblatt vergessen:
Auch auf der Seite des Herstellers ist nur das Datenblatt zu finden, 
welches von reichtelt zur Verfügung gestellt wird, ist leider dürftig

von Georg G. (df2au)


Lesenswert?

Deine Beschreibung deutet stark auf eine zu langsame Treibersoftware 
hin. Da solltest du die Library mal kritisch beäugen.

Das Datenblatt von Reichelt ist ja schon mal deutlich besser als das von 
Pollin.

Kurze Überschlagsrechnung: Du musst 128*64 Pixel übertragen. Das sind 
1024 Bytes. Das Reichelt Display kann 1 Byte/Mikrosekunde abnehmen. Also 
dauert ein Neuaufbau etwa 1ms + Verwaltungsarbeit. Selbst, wenn Pollin 
um den Faktor 10 langsamer sein sollte, sind 2s für eine Textzeile nur 
durch eine sehr ungeschickt programmierte Lib zu erklären.

Gib doch bitte mal einen Link auf die von dir verwendete Lib.

von Lisa (Gast)


Lesenswert?

Die verwendete Library habe ich von hier:
http://www.mikrocontroller.net/articles/KS0108_Library
Direkter Link auf das Zip: 
http://www.mikrocontroller.net/attachment/21921/glcd_ks0108_v11.zip

Dabei habe ich, wie oben beschrieben, ehrlich gesagt keine Ahnung, ob 
die im 4- oder im 8-bit Modus funktioniert. Die Tatsache, dass man in 
der HeaderDatei (ks0108.h) nur den DataPort und keine Pins angeben muss, 
deutet für mich auf 8-bit.

Ausserdem auffällig ist diese Zeile:
1
#define ks0108ClearScreen() {
2
    ks0108FillRect(0, 0, 127, 63, WHITE);
3
}

Ich denke, dass könnte man effizienter gestalten, eben zum Beispiel sich 
merken, welche Pixel beschrieben wurden und dann nur diese Pixel zu 
löschen.

Was mir natürlich auch recht wäre, wäre eine andere Library einzusetzen, 
obwohl ich mich mit der verwendeten schon recht angefreundet habe...;) 
Auch was Grafik und weitere Schriftarten usw. anbelangt.

von Simon S. (-schumi-)


Lesenswert?

Ohne die Lib angesehen zu haben: Kann es sein, dass dort nach jedem 
Datenpaket eine pauschale Zeit gewartet wird? Man macht das ja oft, um 
den Pin für die Rückmeldung "fertig"/"nicht fertig" vom LCD zu sparen. 
Und damit die Lib mit möglichst vielen LCDs funktioniert wurde die 
Wartezeit möglicherweise sehr lang gewählt.

von Lisa (Gast)


Lesenswert?

Hallo Simon

Gute Idee. Das Einzige was ich gefunden habe war folgendes:
1
for(volatile uint8_t i=0; i<8; i++);      // a little delay loop (faster than reading the busy flag)

Sowie:
1
#ifdef DEBUG
2
  volatile uint16_t i;
3
  for(i=0; i<5000; i++);
4
#endif

Bei letzterem muss ich allerdings sagen, dass ich die Debug-Zeile im 
Header auskommentiert gelassen habe, also
1
//#define DEBUG

Diese Zeile sollte ja also nicht zum tragen kommen

von Peter M. (Gast)


Angehängte Dateien:

Lesenswert?

Probier mal die von modifizierte Lib. Die wichtigsten Funktionen sind
implementiert: Fonts, analoge Uhr, usw. Benutzt jedoch 1k internes RAM 
als
"Bildspeicher". Ist sehr schnell.
Noch eine Anmerkung: Es gibt keinen Unterschied zwischen den Displays. 
Die Farbe hat nichts damit zu tun.

Viel Erfolg damit!

Grüße
Peter

von Falk B. (falk)


Lesenswert?

@ Lisa (Gast)

>Ich denke eine komplette Textzeile mit Text dauert ca. 2 Sekunden.

Dann ist deine Software Schrott. Wahrscheinlich von einem Delay-Künstler 
geschrieben.

>1) Schnelleres LCD

Nö, das ist schnell genug.

>2) Modifikation der Library dahingehend, dass ich mir beim schreiben
>merke, welche Pixel nun weiss sind, und beim Löschen werden nur explizit
>die weissen Pixel wieder blau gemacht.

Nö, du musst erstmal den IST-Zustand analysieren und schauen, wo die 
Zeit sinnlos draufgeht. Dazu kann man einen Timer benutzen, z.B. Timer 
1, den lässt man mit ein paat Dutzend kHz laufen. Etwa so.


Start = TIMER1;

Funktionsuafruf

End = TIMER1;

Zeit = End-Start;

Diese Zeiten kann man sich ausgeben lassen, z.B. auf dem LCD. Dann 
findet man die Zeitverschwendung.

Ein schneller Blick in den Sourcecode zeigt u.a., dass eine schnelle 
Routine zum Löschen des LCDs fehlt. Dort gibt es nur eine Funktion 
ks0108DrawRoundRect, die ist aber alles ander als schnell, sondern 
greift wiederum auf recht komplexe, langsame Funktion ks0108SetDot 
zugreift.

Wenn gleich die Funktionen sicher noch ne Menge Optimierungspotential 
haben, glaube ich dennoch nicht so ganz, dass die Ausgabe einer Zeile 2s 
dauert. Da ist noch ein anderer Bug. Möglicherweise läuft dein 
Controller nur auf 1 MHz mit dem internen RC-Oszillator, das muss man 
mal prüfen siehe AVR Fuses.

von Peter M. (Gast)


Lesenswert?

Falk Brunner schrieb:
> Ein schneller Blick in den Sourcecode zeigt u.a., dass eine schnelle
> Routine zum Löschen des LCDs fehlt.
http://www.mikrocontroller.net/articles/KS0108_Library

Diese Lib ist, mit Verlaub gesagt, Schrott.

von Oliver S. (oliverso)


Lesenswert?

Die apetech-Lib ist locker schneller, als das LCD. Die nutzt allerdings 
nicht das busy-flag, sondern wartet einfach nach jedem Befehl eine feste 
Zeit. Die Zeit muß man an sein LCD anpassen.

Dazu sind die KS108 in 8bit hohen Zeilen organisiert. Hat man Fonts, die 
kein vielfaches von 8 Bit Zeichenhöhe haben, oder schreibt die Zeichen 
in der Höhe so, daß sie nicht an solch einer Zeilengrenze beginnen, so 
muß die Lib halt erst die Zeile auslesen, die neuen Pixel hineinrechnen, 
und das Ergebnis zurückschreiben. Das dauert, liegt aber in der Natur 
der Sache. Das geht nur mit einem Screenbuffer schneller, der aber 
kostbares Sram kostet.

Pass die delays an, such dir eine Font, der ein vielfaches von 8 Bit 
hoch ist, und schrieb die Zeilen immer auf die Zeilengrenzen, dann 
fluppt das mehr als ordentlich.

Oliver

von Lisa (Gast)


Lesenswert?

Hui, da ging was=)
Also,immer schön der Reihe nach:

@ Peter M
Vielen Dank für die Library. Ich habe versucht, diese anzuwenden, 
scheitere aber an Compiler-Fehlern. Ich habe die Datei protos.h 
included, gleich wie im Beispiel "display.c" zu sehen. Ich bekomme aber 
für jede Methode die ich verwenden will folgende Fehlermeldung:
1
undefined reference to `ClearScreen`
Wobei der genaue Methodenname natürlich ändert, ClearScreen, 
InitDisplay, LCDSoftText usw. usw.
Was mache ich wohl falsch?

@falk:
>>Dann ist deine Software Schrott. Wahrscheinlich von einem Delay-Künstler
>>geschrieben.

Das bezweifle ich gar nicht, darum bin ich ja auch der Verwendung einer 
anderen library gegenüber nicht abgeneigt.
Der ATmega läuft aber definitiv mit 8MHz, sonst läuft (noch) keine 
andere Software darauf die, z.B.: über Interrupts das Display ausbremsen 
könnte.

von c-hater (Gast)


Lesenswert?

Lisa schrieb:

> Gute Idee. Das Einzige was ich gefunden habe war folgendes:
>
>
1
for(volatile uint8_t i=0; i<8; i++);      // a little delay loop 
2
> (faster than reading the busy flag)

Das dehnt die Sache mindestens auf das Dreifache der tatsächlich nötigen 
Zeit (jedenfalls bezogen auf das Reichelt-Display), ist aber trotzdem 
relativ unerheblich, ob in 1ms oder in drei ms das komplette Display 
beschrieben ist, ist zwar sicher meßbar, aber für einen Menschen nicht 
zu unterscheiden.

> Sowie:
>
1
#ifdef DEBUG
2
>   volatile uint16_t i;
3
>   for(i=0; i<5000; i++);
4
> #endif

Das würde natürlich ganz anders reinkrachen. Ich würde mal davon 
ausgehen, daß das DEBUG-Symbol einen Wert hat.

> Bei letzterem muss ich allerdings sagen, dass ich die Debug-Zeile im
> Header auskommentiert gelassen habe, also
1
//#define DEBUG
>
> Diese Zeile sollte ja also nicht zum tragen kommen

Diese sicher nicht. Aber das Symbol kann auch an beliebiger anderer 
Stelle im Quelltext gesetzt werden, außerdem auch noch über die 
Compiler-Parameter. Ich würde mal auf letzteres tippen...

von Lisa (Gast)


Lesenswert?

Trommelwirbel
Und der Oscar geht an:  c-hater

Ich danke dir vielmals, du hattest recht. Ich hab die entsprechende 
Zeile auskommentiert.
Hier noch für alle mit dem selben Problem:

Kommentiert in der Datei ks0108.c folgende Zeilen in der Methode 
ks0108WriteData(...) aus:
1
/*
2
#ifdef DEBUG
3
  volatile uint16_t i;
4
  for(i=0; i<5000; i++);
5
#endif
6
*/

Jetzt läufts wie geschmiert

von Oliver S. (oliverso)


Lesenswert?

Lisa schrieb:
> Hier noch für alle mit dem selben Problem:

Na ja, man könnte ja auch erst einmal nachsehen, wo und warum im eigenen 
Code DEBUG definiert wird.

Oliver

von Lisa (Gast)


Lesenswert?

Hat c-hater doch geschrieben:

>>Diese sicher nicht. Aber das Symbol kann auch an beliebiger anderer
>>Stelle im Quelltext gesetzt werden, außerdem auch noch über die
>>Compiler-Parameter. Ich würde mal auf letzteres tippen...

Bei mir warens die Compiler params

von Peter M. (Gast)


Lesenswert?

Lisa schrieb:
> undefined reference to `ClearScreen`

Sorry für die späte Antwort, war unterwegs.

In dem ZIP-File habe ich die GRAFIKLCD.aps mit eingefügt.
Lade Dir das Projekt in Dein AVR-Studio und lass es übersetzen.
Die main() ist display.c definiert. Da läuft dann eine endlos Demo.
Die include Datei ks108.h musst Du entsprechend Deinem AVR anpassen.
Entsprechend auch die Prescaler in central_timer.c anpassen, da Deine 
CPU
mit 8 MHz unterwegs ist.
Die Demo ist für 1 MHz eingestellt. Die ISR(TIMER0_OVF_vect) muss mit 
1ms Takt aufgerufen werden, sonst stimmt das ganze Timinig nicht.

Wenn die Demo soweit läuft, dann kannst Du dir ein Lib erstellen und die 
zu Deinem eigentlichen Projekt dazu linken.

Ich hoffe, dass dies verständlich war.

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.