Forum: Mikrocontroller und Digitale Elektronik Löscher einzelner Werte auf einem Graphikdisplay


von Achim S. (achims)


Lesenswert?

Hallo Gemeinde
Auf einem Graphikdisplay lasse ich mir Messwerte anzeigen. Alle 200ms 
erfolgt eine neue Messung.(C, AT1284p)
1
itoa( results[0], Buffer, 10 );    // Zeile 1
2
ks0108SelectFont(Arial8, ks0108ReadFontData, BLACK);
3
ks0108GotoXY(28,20);      // Angabe Position
4
ks0108Puts_P(PSTR("        "));    // Ausgabe P
5
ks0108GotoXY(30,20);  
6
ks0108Puts(Buffer);
Leider wird bei dem nächsten Lauf der alte Messwert nicht überschrieben. 
Einzelne Pixel bleiben weiter sichtbar. Nach ca 5 bis 10 Durchlauf ist 
nur noch ein schwarzer Fleck auf dem Display.
1
ks0108Puts_P(PSTR("        "));    // Ausgabe P
Mit dieser Zeile wollte ich eigentlich den alten Messwert löschen, geht 
aber nicht. Das ganze Display kann ich auch nicht löschen und jedesmal 
neu schreiben.Die Position stimmt genau, habe ich getestet. Scheinbar 
werden die genutzen Pixel angelassen und die neuen dazu geschrieben. Zur 
Angabe der Namen und Bezeichnungen lege ich vorher eine Maske drüber und 
wollte dann nur noch die Werte ändern. Jemand eine Idee dazu?
achim

: Bearbeitet durch User
von Achim S. (achims)


Lesenswert?

Nochmal das ganze, diesmal mit Programm

von asdfasd (Gast)


Lesenswert?

Mittels ks0108SetTransparency(0) das "Mischen" abschalten und einfach 
den neuen Text drüberschreiben.

von Mark B. (markbrandis)


Lesenswert?

Achim S. schrieb:
> Hallo Gemeinde
> Auf einem Graphikdisplay lasse ich mir Messwerte anzeigen. Alle 200ms
> erfolgt eine neue Messung.(C, AT1284p)

Das ist schön. Nur welche Bibliothek genau verwendest Du denn hier?

asdfasd schrieb:
> Mittels ks0108SetTransparency(0) das "Mischen" abschalten und einfach
> den neuen Text drüberschreiben.

Hm. In der KS0108 Lib die ich hier auf mikrocontroller.net nach kurzer 
Suche gefunden habe, gibt es eine solche Funktion nicht. Also gibt es 
offenbar verschiedene Libs bzw. Versionen.

Womit wir wieder beim Punkt "Themenersteller, gib bitte vernünftige 
Infos" wären.

: Bearbeitet durch User
von Mark B. (markbrandis)


Lesenswert?

Eventuell könnte man mit

ks0108FillRect()

arbeiten. Ein gefülltes Rechteck in der Hintergrundfarbe zu zeichnen ist 
quasi das Gleiche wie diesen Bereich zu löschen. Danach den Messwert neu 
ausgeben, am besten nicht in Hintergrundfarbe :)
Sollte an und für sich hinhauen.

: Bearbeitet durch User
von Achim S. (achims)


Lesenswert?

Hallo
ich arbeite mit der Lib von apetech. Bestandteil da von sind:

ks0108DrawLine
ks0108DrawRect
ks0108DrawRoundRect
uint8_t radius, uint8_t color);
ks0108FillRect
ks0108InvertRect
ks0108SetInverted
ks0108SetDot

Das Lib stammt auch von dieser Seite.
Das mit dem Rechteck werde ich testen. Brauche das 8 mal in dieser 
Maske.
Hatte beim suchen diese Lib gefunden.
Welche habe ich übersehen?
achim

von Achim S. (achims)


Lesenswert?

Es funktiniert genau wie es soll
1
ks0108FillRect(79, 40, 11, 8, WHITE);  // Angabe Position überschreibe Wertt
2
ks0108FillRect(94, 40, 14, 8, WHITE);  // Angabe Position überschreibe Wert
3
ks0108SelectFont(Arial8, ks0108ReadFontData, BLACK);  //Auswahl Schrift
4
  itoa( adc3l, Buffer, 10 );    // Zeile 2 Zahl 1
5
ks0108GotoXY(85,40);          // Angabe Position
6
ks0108Puts(Buffer);            // Ausgabe Wert an Position
7
  itoa( adc3r1, Buffer, 10 );    // Zeile 2 Zahl 2
8
ks0108GotoXY(95,40);          // Angabe Position
9
ks0108Puts(Buffer);            // Ausgabe Wert an Position
10
  itoa( adc3r2, Buffer, 10 );    // Zeile 2 Zahl 3
11
ks0108GotoXY(100,40);          // Angabe Position
12
ks0108Puts(Buffer);            // Ausgabe Wert an Position
Durch die Angabe einer Form überschreibe ich den Messwert, Beim nächsten 
lauf kommt der neue Wert.
Zu Anfang war es schwierig die genau Position zu finden.
Danke für deine Hilfe
Das Programm soll über den i2C Bus 4 x analoge Daten und 4 x umgrechnete 
Spannungen auf einem Display anzeigen.
achim

von W.S. (Gast)


Lesenswert?

Achim S. schrieb:
> Leider wird bei dem nächsten Lauf der alte Messwert nicht überschrieben.

Tja, du hast die ganze Herangehensweise beim Benutzen von Grafikdisplays 
noch nicht verstanden. Das ist im ganz Groben so ähnlich wie das 
Zeichnen von Programmoberflächen unter Windows am PC. Man legt sich für 
jedes Element einen Bereich zu, den man zu behandeln wünscht: Mit einem 
Hintergrund füllen oder in irgend einer Farbe ablöschen (also mit Farbe 
füllen) und anschließend das darauf plazieren, was darauf zu sehen sein 
soll: eine Ausschrift oder ein Icon oder eine Linie, Kreis etc... Das 
muß man bei jedem Aufruf zur Selbstdarstellung des betreffenden 
Elementes machen.

So ähnlich geht es auch bei Grafikdisplays am µC zu.
Das läuft dann so etwa auf ein Unterprogramm hinaus, was mal ganz grob 
so aussieht:

void ZeichneMesswert(const rect R, int MW)

und dessen Inhalt sieht dann so aus:
- Ablöschen des Rechtecks R
- Wandeln von MW in eine Zeichenfolge
- Zeichenfolge in Rechteck R zeichnen, ggf. passend ausrichten (links, 
rechts, mittig, Dezimalpunkt an bestimmter Stelle o.ä.)

W.S.

von Achim S. (achims)


Lesenswert?

Sorry, das verstehe ich so nicht.
Durch die Lib werden bestimmte Anweisungen bereit gestellt. Diese 
Anweisungen kann man mit Daten versehen, damit an bestimmtem stellen 
geometrische Figuren gezeichnet werden können.
Es werden bestimmte Fonts genutzt um bestimmte Zeichensätze in der 
gewünschten Art darzustellen. Genauso können auch ganze Bilder auf dem 
Display dargestellt werden.
Danach kann man das ganze Display löschen und was neues zeichnen oder 
anzeigen.
Habe es so gemacht, eine Maske definiert mit allen notwendigen Anzeigen 
und Bezeichnungen. Diese wird zu Beginn einmal aufgerufen. Das Auslesen 
der Messwerte, das Umrechnen der Messwerte und die Darstellung in der 
Maske erfogt dann alle ca 100 bis 200 ms. Dadurch spare ich mir das 
löschen des Displays und den Neuaufbau alle 200ms. Da ich die 
notwendigen Berechnungen mit Festkomma ausführe, geht die Anzeige 
relativ schnell.
Könntest du es mir etwas klarer darstellen?
achim

von Klaus Santa (Gast)


Lesenswert?

Achim S. schrieb:
> Sorry, das verstehe ich so nicht.

Dann vielleicht so: vor dem Schreiben neuer Werte den alten Wert noch 
einmal in der Hintergrundfarbe schreiben. Damit werden genau die Pixel 
gelöscht, die vorher geschrieben wurden.
Danach den neuen Wert anzeigen.

Achim S. schrieb:
> Da ich die
> notwendigen Berechnungen mit Festkomma ausführe, geht die Anzeige
> relativ schnell.

Das geht auch mit float schnell.

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.