Hallo,
ich habe folgendes Problem.
Ich arbeite mit einem Touchscreen. In der Endlosschleife wird dieser
abgefragt und dann diverse Variablen ins Display geschrieben. Diese
Variablen werden also nur einmal ins Display geschrieben, nämliche wenn
der Screen an der zugehörigen Stell "getoucht" wird. So weit so gut.
Einige der Variaben sind dynamisch, zeitlich veränderlich. Eine Änderung
der Variablen soll also direkt auf das Display auszugeben sein ohne dass
der Touchscreen an der besagten Stelle wieder getoucht werden muss.
Ich könnte natürlich wenn der Touchscreen an der besagten Stelle
getoucht wird eine Hilfsvariable setzen:
Minomalbeispiel:
1
unsignedcharhelfer=0;
2
intmain(void)
3
{
4
while(1)
5
{
6
...
7
if(10<x<20)
8
{
9
helfer=1;
10
schreibevariableinsDisplay;
11
}
12
...
13
if(helfer==1)
14
{
15
loescheDisplayanVariablenstelle;
16
schreibevariableinsDisplay;
17
}
18
}
19
20
21
}
So ist es natürlich sehr unschön, da der Variablenbereich immer gelöscht
wird (egal ob sich die Variable verändert oder nicht)und das Display
flackert.
Die Veränderung der Variable wird von "Außen beeinflusst",
beispielsweise ein Lichtsensor.
Ich würde also am liebsten nur die Variable neu ins Display scheiben,
wenn Sie sich wirklich verändert. Wie vergleicht man zwei sich zeitlich
veränderliche Variablen oder wie geht man so ein Problem an. Vermutlich
nichts wildes und ich brauche nur einen kleinen Denkanstoss.
Danke und Gruss
Timm
> if(10 < x < 20)
das macht bestimmt nicht das was du willst.
Warum löscht du überhaupt das Display -> das verursacht das Flackern.
Überschreibe es doch einfach mit dem neuen wert.
Peter II schrieb:>> if(10 < x < 20)>> das macht bestimmt nicht das was du willst.
Das is klar. Ich wollte nur die Funktionalität des Touchscreens
beschreiben.
Besser:
if(lesetouchscreen)
...
Ich lösche, weil ich die Werte ungern übereinandergestapelt auf dem
Display abgebildet haben möchte. Ich lösche auch nicht das ganze
Display, sondern nur den Bereich in dem die Variable neu geschrieben
werden soll.
Timm schrieb:> Ich lösche, weil ich die Werte ungern übereinandergestapelt auf dem> Display abgebildet haben möchte.
das kommst jetzt auf das Display an, aber meist überschreibt man immer
nur ein Zeichen, dafür muss man nichts löschen. Und wenn die neue Zahl
kürzer ist, dann muss man halt ein Leerzeichen schreiben.
speichere einfach den alten Stand der Variablen und vergleiche es mit
dem neuen Stand, wenn ungleich, dann aufs Display schreiben, sonst
nicht.
mfg Mat
Timm schrieb:> Ich würde also am liebsten nur die Variable neu ins Display scheiben,> wenn Sie sich wirklich verändert.
Ja dann mach das doch.
> Wie vergleicht man zwei sich zeitlich> veränderliche Variablen oder wie geht man so ein Problem an.
Indem man sich den Wert in einer Variablen merkt, der gerade am Display
angezeigt wird. Ehe man einen Wert ausgibt, fragt man einfach ab, ob der
nicht schon angezeigt wird. Wenn ja, dann braucht man nichts tun. Wenn
nein, dann muss man das Display updaten und man merkt sich welcher Wert
jetzt gerade angezeigt wird.
1
displayValue=......;// irgendein Wert, der sonst nicht vorkommt
2
3
while(1)
4
{
5
6
.....
7
neuerWert=......// irgendwie kommt ein auszugebender Wert zustande
8
9
if(neuerWert!=displayValue)// unterscheidet sich der von der Anzeige ?
10
{
11
displayValue=neuerWert;// ja, tut er. Also muss die Anzeige aktualisiert werden
Mit nem Buffer im Mikrocontroller.
Der Buffer (Framebuffer) ist so groß wie dein Display. Alles was du ans
Display senden willst schreibst du in den Framebuffer. Der Buffer ist
viel schneller und man sieht kein Flackern, da alles im Buffer, also
unsichtbar gezeichnet wird. Am Ende der Routine setzt du ein Flag, dass
das Display neu gezeichnet werden soll.
In deiner Main-Schleife prüfst du ständig ob das Flag zum neu zeichnen
gesetzt ist, wenn ja, überschreibst du den Inhalt des Displays mit dem
Inhalt des Framebuffers auf einen Schlag.
Um die Sache weiter zu beschleunigen, kannst du auch noch zusätzlich den
Bereich, der geändert wurde in einem Struct abspeichern. Ist ein zweites
Flag gesetzt, welches zeigt ob nur ein kleiner Teil aktualisiert werden
muss, dann kannst du nur den kleinen Teil ans Display senden.
Hat dein uC nicht so viel RAM und du willst keinen externen anschließen
um das zu bewerkstelligen, so kannst du Karl Heinzs Vorschlag leicht
umsetzen.
Eine kleine Abwandlung wäre, nicht einzelne Variaben zu merken und
jeweils zu vergleichen, sondern stumpf den gesamten Bildschirminhalt in
zwei Puffern zu halten (je nach Bildschirmgröße, z.B. char ...[4][20]).
Die eigentliche Ausgabe erfolgt im gesamten Programm einfach, indem in
einen der beiden geschrieben - egal, was vorher drin stand.
In einem weiteren Task (also z.B. einer IR) wird reihum der Inhalt des
ersten Puffers mit dem zweiten verglichen.
Bei einem Unterschied wird vom ersten in den zweiten kopiert und auf dem
Display ausgegeben.
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.