Hallo,
ich habe einen Joystick und einen Touchscreen (2,8 Zoll/ILI9341) an den
Arduino Due angeschlossen.
Ich möchte mit dem Joystick ein Kreis über den Touchscreen steuern, aber
wenn ich nichts mache, dann flackert der Kreis permanent.
Kann mir jemand einen Tipp geben - warum - und ob mein Code einen Fehler
enthält ?
Danke :-)
Grüße
Chris
Ch072 K. schrieb:> Ich möchte mit dem Joystick ein Kreis über den Touchscreen steuern, aber> wenn ich nichts mache, dann flackert der Kreis permanent.
Was erwartest du, wenn du immer abwechselnd einen Kreis zeichnest und
den Bildschirm mit 0xFFFF füllst?
Normalerweise verwendet man für den Bildaufbau einen Hintergrundspeicher
und überträgt dann das fertige Bild in den sichtbaren Bildspeicher.
Hallo & Guten Morgen,
mein Gedankengang ist:
Kreis an der aktuellen Position löschen und an der neuen Position wieder
zeichnen so das ich einen flüssigen Bildlauf bekomme.
Wie bekomme ich einen flüssigen Bildlauf hin ?
p.s.
Um trotz direktem Schreiben in den Bildspeicher bei "nichts machen" ein
Flackern zu unterbinden, könntest du bei sich nicht änderndem (nx,ny)
einfach auf die Lösch- und Malerei auf dem Display verzichten.
Ch072 K. schrieb:> Hallo & Guten Morgen,>> mein Gedankengang ist:> Kreis an der aktuellen Position löschen und an der neuen Position wieder> zeichnen so das ich einen flüssigen Bildlauf bekomme.
Dann mach das doch. Die alte Position kannst du dir in static-Variablen
merken.
> Wie bekomme ich einen flüssigen Bildlauf hin ?
Nur neu zeichnen, wenn sich die Position/Daten vom Joystick geändert
haben.
x bzw. y sind echt schlechte Bezeichner für Makros.
Zu kurz, zu allgemein und zu klein geschrieben.
Falls irgendwo im Code mal Variablen mit den Namen definiert werden,
wird der Text auch da ersetzt.
aus
1
intx,y;
macht der Preprozessor dann
1
int10,11;
Und das gibt dann sehr merkwürdige Fehlermeldungen.
Ch072 K. schrieb:> Kreis an der aktuellen Position löschen und an der neuen Position wieder> zeichnen so das ich einen flüssigen Bildlauf bekomme.
Wenn es nur um den Kreis geht, kannst du zum Löschen an der alten
Position einen Kreis in der Farbe 0x0000 zeichnen und anschließend in
der neuen einen neuen Kreis in der Zeichenfarbe.
Ch072 K. schrieb:> tft.drawCircle(nx,ny,25,0x001F);> tft.fillScreen(0x0000);
Zusätzlich zu dem was schon gesagt wurde (nur neu zeichnen wenn sich die
Koordinaten geändert haben) würde ich auch mal empfehlen die Reihenfolge
dieser beiden Zeilen umzudrehen.
Im Moment wird der Kreis gezeichnet und sofort wieder gelöscht, bis zum
nächsten Zeichnen dauert es dann eine Weile (da wird 2x analogRead
ausgeführt). Ich kenne mich mit Arduino nicht aus, daher weiß ich nicht
genau wie schlimm die Verzögerung zum nächsten Zeichnen ist, aber das
wird vielleicht sichtbar sein.
Die Zeit die das Bild komplett schwarz ist so klein wie möglich zu
halten sollte aber auch für weniger sichtbares flackern sorgen.
Wolfgang schrieb:> Normalerweise verwendet man für den Bildaufbau einen Hintergrundspeicher> und überträgt dann das fertige Bild in den sichtbaren Bildspeicher.
Optimal ist es, wenn der Grafikchip einen doppelt so großen RAM hat, als
für das Display notwendig. Dann kann man das neue Bild in den jeweils
unsichtbaren Bereich zeichnen und danach umschalten.
es geht auch ohne Double Buffering bei den günstigen TFT mit eigenem
Grafikspeicher. Dazu muss der geänderte Bildteil im µC RAM neu berechnet
werden und am Block (oder in Teilen) in den Grafikspeicher geschoben
werden. Dieses rendern ist natürlich aufwändig wenn der Hintergund
'lebt', und die Libraries die das können sind schon recht komplex.
Wenn der Hintergrund einfarbig bleiben soll, dann ist es etwas
einfacher. Aber nicht ganz ohne weil Löschen und Neuzeichnen im µC
vorberechnet werden sollte.
Hallo,
Danke für euere Tipps und Ratschläge.
Ich werden in den nächsten Tagen mich mal ran setzen, und mal sehen ob
ich es zum laufen bekomme :-)
Grüße
Chris