Forum: Mikrocontroller und Digitale Elektronik Arduino Due mit TouchScreen und JoyStick - Kreis flackert ständig


von Ch072 K. (chris072)


Lesenswert?

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
1
#include <MCUFRIEND_kbv.h>
2
3
MCUFRIEND_kbv tft;
4
5
#define x 10
6
#define y 11
7
8
void setup() {
9
 pinMode(x, INPUT);
10
 pinMode(y,INPUT);
11
12
 tft.reset();
13
 tft.begin(0x9341);
14
 tft.setRotation(1);
15
}
16
17
void loop() {
18
int nx,ny;
19
nx = analogRead(x)-600; //Bildschirmmitte in x 
20
ny = analogRead(y)-640; //Bildschirmitte  in y
21
22
tft.drawCircle(nx,ny,25,0x001F);  
23
tft.fillScreen(0x0000);
24
  
25
}

von Wolfgang (Gast)


Lesenswert?

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.

von Wolfgang (Gast)


Lesenswert?

Wolfgang schrieb:
> ... mit 0xFFFF füllst?

Sorry, "mit 0x0000 füllst"

von Ch072 K. (chris072)


Lesenswert?

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 ?

von Wolfgang (Gast)


Lesenswert?

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.

von Dirk B. (dirkb2)


Lesenswert?

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
 int x, y;
 macht der Preprozessor dann
1
 int 10, 11;
Und das gibt dann sehr merkwürdige Fehlermeldungen.

von Wolfgang (Gast)


Lesenswert?

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.

von Arduino-Muffel (Gast)


Lesenswert?

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.

Beitrag #7238974 wurde von einem Moderator gelöscht.
von Peter D. (peda)


Lesenswert?

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.

von J. S. (jojos)


Lesenswert?

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.

von Ch072 K. (chris072)


Lesenswert?

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

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.