Merkwürdige Displayanzeige

Benutzte Hardware:
Arduino Uno ATmega 328 - compatibles Board von AZ-Delivery
ARD SDH 2,8 TD TFT-Display mit SD-Kartensteckplatz von Reichelt

Das Display hat 320 x 240 Pixel.
Ich möchte eine Reihe von Quadraten anzeigen. Jedes soll 13x13 Pixel groß sein.

Wenn das erste Quadrat an der Position 0,0 angezeigt wird und das nächste an der Position 14,0 müsste dazwischen ein Leerraum von einem Pixel bleiben.

Die weiteren Quadrate sollen jeweils 14 Pixel weiter (also 28,0 42,0 56,0 usw.)
gezeichnet werden.

Der Zwischenraum von einem Pixel ist jedoch nur zwischen den ersten beiden Quadraten sichtbar. Danach kommt es zu Überschneidungen.

Hier der Testsketch:

//////////////////////////////////////////////
//              Test verschiedene            //
//               Grafik                      //
//                                           //
/////////////////////////////////////////////

#include <Adafruit_TFTLCD.h>
#include <Adafruit_GFX.h>

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4


#define BLACK   0x0000
#define BLAU    0x001F
#define ROT     0xF800
#define GRUEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define GELB    0xFFE0
#define WEISS   0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); //Pins für Display festlegen und Namen "tft"

#define Vierk (tft.drawRect(X, Y, X+13, Y+13, WEISS)) //Setzt einen Quadrat 13 Pixel an Position X,Y


void setup()
{
  int X;
  int Y;

  tft.reset();
  tft.begin(0x9341); //Diese Nummer ist für mein Display richtig!!!!
  tft.setRotation(3);
  tft.fillScreen(BLACK);

  //14er Raster Vierecke
  tft.fillScreen(BLACK);
  Y = 0; //für alle

  X = 0;
  Vierk;

  X = 14;
  Vierk;

  X = 28;
  Vierk;

  X = 42;
  Vierk;

  X = 56;
  Vierk;

  X = 70;
  Vierk;

  X = 84;
  Vierk;

  X = 98;
  Vierk;

  X = 112;
  Vierk;

  X = 126;
  Vierk;

  X = 140;
  Vierk;

  X = 154;
  Vierk;

  X = 168;
  Vierk;

  X = 182;
  Vierk;

  X = 196;
  Vierk;

  X = 210;
  Vierk;

  X = 224;
  Vierk;

  X = 238;
  Vierk;

  X = 252;
  Vierk;

  X = 266;
  Vierk;

  X = 280;
  Vierk;

  X = 294;
  Vierk;

  X = 308;
  Vierk;
  while (1);
}

void loop() {
  // put your main code here, to run repeatedly:

}

Hier das erzeugte Bild:

Mache ich irgendwo einen Denkfehler? Ich kann mir nicht erklären, woran es liegt.
Für Tipps wäre ich dankbar.

Wird bei tft.setRotation(3) irgendwas an den Koordinaten umskaliert?

Hallo Michael,

nein, nicht das ich wüsste. Das Display ist dadurch im Querformat. Der Arduino darunter hat dann den USB-Anschluss links.

Andere Beispielprogramme und ein eigenes Testprogramm mit Sinuskurve funktionieren auch.

Hab es auch gerade nochmal getestet. setRotation ändert nicht an dem Phänomen-

Mach das gleiche im tft.setRotation(0)
Die Display sind 240 x 320 Pixel Auflösung es ist ein Porträt Display deshalb wird in der Lib umgerechnet und es kommt zum Umrechnungsfehler.
Guck dir das genau an dann wirst du feststellen das die 2 und 3 ist nicht 13 und13 nur 14 und 12.
Das Phänomen habe ich auch beobachtet, wen man die einzeln zeichnet ist alles iO.
1 Pxel hat 3 Farben RGB wen du 320 / 3 ist 106,6666 daher kommt zu Fehler

Hallo fony,
hab ich probiert - ändert nichts.

Das verstehe ich nicht wirklich, dass die 2. zu 3. wie 14 Pixel aussehen kommt m.E durch die Überlappung.

OK, ein Pixel hat drei Farben, aber wieso kommt es deswegen zu diesem Effekt?

Ich hab nochmal weiter probiert. Auch wenn ich die Quadratgröße zu 8X8 ändere gibt es Überlagerungen obwohl die Schrittweite für das nächste Quadrat bei 14 Pixel bleibt.

Mir ist schon eingefallen bei den Beispielen egal welsche Lib das war, niemals wird genommen weniger als 3 Pixel abstand wen die das so wie du ,oder mit for Schleife machen :wink:

Hier ist mir Fehler unterlaufen es ist TFT mit fester Pixelzahl

Baue das Morgen nach :wink:
Ja dicker Denkfehler, auch meinerseits gestern ;

#define Vierk (tft.drawRect(X, Y, X+13, Y+13, WEISS))

solche Konstruktion geht nur ein mall warum ?

drawRect(x, y, w, h, color)

Mach dein Probesketch so wie unten danach funktioniert es

//////////////////////////////////////////////
//              Test verschiedene            //
//               Grafik                      //
//                                           //
/////////////////////////////////////////////

#include <Adafruit_TFTLCD.h>
#include <Adafruit_GFX.h>

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4


#define BLACK   0x0000
#define BLAU    0x001F
#define ROT     0xF800
#define GRUEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define GELB    0xFFE0
#define WEISS   0xFFFF

Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); //Pins für Display festlegen und Namen "tft"

#define Vierk (tft.drawRect(X, Y, 13, 13, WEISS)) //Setzt einen Quadrat 13 Pixel an Position X,Y


void setup()
{
  int X;
  int Y;

  tft.reset();
  tft.begin(0x9341); //Diese Nummer ist für mein Display richtig!!!!
  tft.setRotation(3);
  tft.fillScreen(BLACK);

  //14er Raster Vierecke
  tft.fillScreen(BLACK);
  Y = 0; //für alle

  X = 0;
  Vierk;

  X = 14;
  Vierk;

  X = 28;
  Vierk;

  X = 42;
  Vierk;

  X = 56;
  Vierk;

  X = 70;
  Vierk;

  X = 84;
  Vierk;

  X = 98;
  Vierk;

  X = 112;
  Vierk;

  X = 126;
  Vierk;

  X = 140;
  Vierk;

  X = 154;
  Vierk;

  X = 168;
  Vierk;

  X = 182;
  Vierk;

  X = 196;
  Vierk;

  X = 210;
  Vierk;

  X = 224;
  Vierk;

  X = 238;
  Vierk;

  X = 252;
  Vierk;

  X = 266;
  Vierk;

  X = 280;
  Vierk;

  X = 294;
  Vierk;

  X = 308;
  Vierk;
  while (1);
}

void loop() {
  // put your main code here, to run repeatedly:

}

Danke an alle!
Manchmal bin ich einfach zu blind. Heute ist mir auch klar, wo der Fehler lag.
War wohl gestern doch schon zu spät.
:sleeping:

Bei TFT Displays lauern noch mehr solche Fehler :wink:

Diesmal war es nicht das Display sondern meine eigene Blödheit. Die Quadrate wurden ja jedesmal größer.
Der Fehler war entstanden, weil ich vorher Dreiecke konstruiert habe als Windpfeile (16 Stück für 16 verschiedene Windrichtungen). Dann sollten die nur noch schnell Rahmen bekommen...

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.