www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik gLCD Problem: Leerzeichen zeichnen oder anderen Fix


Autor: dau45 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend!

Ich bin gerade dabei einen Funkwecker zu realisieren. Basis ist ein 
Atmega32 welcher in C programmiert wird. DCF Dekodierung etc. steht 
schon und nun habe ich mein 16x2 Display durch ein 128x64 gLCD 
ausgetauscht welches ich mit der Libary von Andre 
(Beitrag "GLCD Routinen ( KS0108, HD61202 )") auch wunderbar 
ansteuern kann.

Nun habe ich ein Problem dessen Ursprung mir bekannt ist, für das mir 
aber keine Lösung einfällt:

Die Uhrzeit (siehe Anhang) wird als weiße Schrift (damit das möglich ist 
habe ich die Libary angepasst) auf schwarzem grund dargestellt. Wenn 
sich nun eine Zahl verändert wird die vorherige einfach "übergemalt", 
d.h. die Zahlen überlagern sich und die Ausgabe ist hin (wie im Anhang 
zu sehen).

Der Hintergrund mit den Grafiken etc. ist übrigens als BMP eingebunden 
und wird beim Start geladen.


Nun welche Lösungen habe ich mir schon überlegt?

1) Vor jeder Ausgabe LCD clearen und die Bitmap mit dem Hintergrund neu 
laden
=> Neuladen der BMP dauert so lange, dass die Ausgabe fürchterlich 
blinkt; Darstellungsprobgleme natürlich perfekt behoben aber Zustand 
nicht tragbar.


2) hmm vll den besagten schwarzen Streifen nicht als BMP laden sondern 
via drawFillrect immer neu zeichnen => zeichnen dauert noch länger als 
aus BMP, sieht noch schlimmer aus.



Kennt jmd eine Lösung für das Problem? Wäre für jede Hilfe sehr dankbar!

Autor: Thomas R. (tinman) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vllt einfach die aktuelle Uhrzeit beim "zeitwechsel" erst schwarz auf 
weiss ausgeben und dann die neue weiss auf schwarz ? Am besten nur den 
teil der sich geändert hat.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wäre es damit?

Einen Bitmap-Ausschnitt mit einer eigenen Routine schreiben, deren 
Schleifen nur einen Teil des Bildbereiches (RAM-Adressen) abdecken und 
die Grafik byteweise ins RAM legt. Also nicht mit Pixel-Set/Clear, 
sondern durch Schreiben ins RAM auf ausgesuchte Bereiche. Das erfordert 
zwar bei jeder Pixelzeile erneutes Setzen des Adresspointers, ist aber 
schneller als Einzelpixelzugriff.

...

Autor: dau45 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für eure Antworten.

@Thomas: die Idee hatte ich verfolgt und es war garnicht soo schlecht, 
war aber auch mit einer großen Verzögerung verbunden... habe die gLCD 
Routine jetzt so angepasst, dass sie nicht nur die gesetzten Bits 
zeichnet sondern alle Bits eines Chars entweder weiß oder schwarz macht. 
Nun ist das Problem behoben.

@Hannes: Deinem Ansatz konnte ich leider nicht ganz folgen... Ist für 
mich wohl eine Nummer zu hoch -- das hier ist mein erstes "richtiges" 
Projekt mit dem AVR abseits von blinkenden LED's :-)



Ich habe leider nun ein neues Problem: Das zeichnen auf dem gLCD hält 
den Programmablauf immens auf! Ich habe vorher nicht genau drauf 
geachtet aber eine Sekunde dauerte ca. 1,5s... weil das schreiben auf 
dem LCD alles aufhiehlt.....
Habe das ganze dann soweit optimiert, dass immer nur die veränderte 
(Sekunden)Ziffer gezeichnet wird - das hat etwas geholfen aber das 
Problem keinesfalls behoben...

Ich habe die mylcd Lib schon nach Optimierungspotenzial durchsucht aber 
konnte keine waits o.ä. finden -- es denke er hängt so lange in der 
Schleife fest, welche die Bussy-Flag des LCD abfragt... Also sind die 
langen Verzögerungen hervorgerufen durch das LCD-Modul ansich?



Ich fürchte fast dass das außerhalb meiner Einflussnahme steht und als 
gegebene Eigenscahft des Bauteils hinzunehmen ist??


Freue mich auf Antworten -- ich bin gerade etwas Verzweifelt und 
befürchte, dass ich mein Projekt in der momentanen Form nicht 
realisieren kann -.-

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dau45 schrieb:

> Ich habe leider nun ein neues Problem: Das zeichnen auf dem gLCD hält
> den Programmablauf immens auf! Ich habe vorher nicht genau drauf
> geachtet aber eine Sekunde dauerte ca. 1,5s... weil das schreiben auf
> dem LCD alles aufhiehlt.....
> Habe das ganze dann soweit optimiert, dass immer nur die veränderte
> (Sekunden)Ziffer gezeichnet wird - das hat etwas geholfen aber das
> Problem keinesfalls behoben...

Ich denke, das Problem wird darin bestehen, dass deine Buchstaben Pixel 
für Pixel gemalt werden. Das dauert nun mal. Das kann man nur dann 
optimieren, wenn man das etwas intelligenter angeht und sich zunächst im 
Speicher die darzustellenden Bytes zurechtlegt und diese rausschiebt. 
Das kann allerdings je nach Speicherorganisation der Anzeige aufwändig 
werden.

Aber ein paar Texte ausgeben, kann keine 1.5 Sekunden dauern :-)

Wie generierst du eigentlich deine Zeitinformation?
Wenn du jetzt delay sagst, dann hast du schon deinen Ansatzpunkt.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@dau45

Guck mal hier in der Libary von Andre kann man das Datenbyte 
Invertieren.
Also Invert setzen.
// ---------------------------------
// Set Data mode, and write data
// ---------------------------------
void lcd_write_data(uint8_t data ,uint8_t chip)
{
  if (invert!=0)  data = ~data;
  lcd_chip_select(chip);
  LCD_CMD_PORT |= (1<<CD);
  LCD_CMD_PORT &= ~(1<<RW);        // we're in data mode
  lcd_write(data,chip);
}

Autor: dau45 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Klaus: Danke, dass habe ich auch schon gefunden :-)


@Karl Heinz:
Das von dir beschriebene vorgehen wird in Andre's Routine "FastText" 
genannt (ich glaube zumindest, dass es das ist) - ich dachte es wäre 
aktiv. Dann habe die Libary gerade nochmal überflogen und habe gesehen, 
dass FastText nur arbeitet wenn die Startposition des Textes ein 
vielfaches von 8 ergibt.

Habe meine Position der Uhrzeit angepasst und siehe da: es läuft ohne 
Probleme!! Manchmal sieht man dan Walt vor lauter Bäumen nicht - ich 
sollte mal was Anderes machen....

Einen Delay nutze ich natürlich nicht sondern einen Timer der alle 10ms 
overflowed - da schaut er dann nach dem DCF Signal und zählt 
gleichzeitig für eine Softclock eine Variable um 1 hoch; ist die 
Variable bei 100 angekommen werden die Sekunden inkrementiert.
Die Abweichung konnte ich nur erkennen, weil der DCF-Empfänger atm nicht 
angeschlossen war.


Ich werd mal duschen gehen und ein wenig beobachten ob die Uhr nun 
wieder exakt läuft aber es sieht gut aus.

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.