Forum: Mikrocontroller und Digitale Elektronik Adafruit 2,8" TFT Ili9341 Bitmap


von peter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Freunde,

könnt ihr mir sagen, wieso ich folgendes verzerrtes Bild (siehe Anhang) 
unter dem Bitmap erhalte bzw. hatte jemand schonmal so ein Problem

Der Code für das Zeichnen eines Bitmaps sieht wie folgt aus:

void UTFT::drawBitmap(int x, int y, int sx, int sy, bitmapdatatype data, 
int scale)
{
  unsigned int col;
  int tx, ty, tc, tsx, tsy;
  byte r, g, b;

  if (scale==1)
  {
    setXY(x, y, x+sx-1, y+sy-1);
    for (tc=0; tc<(sx*sy); tc++)
    {
      col=pgm_read_word(&data[tc]);
      LCD_Write_DATA(col>>8,col & 0xff);
    }
  }
  else
  {
    for (ty=0; ty<sy; ty++)
    {
      setXY(x, y+(ty*scale), x+((sx*scale)-1), y+(ty*scale)+scale);
      for (tsy=0; tsy<scale; tsy++)
      for (tx=0; tx<sx; tx++)
      {
        col=pgm_read_word(&data[(ty*sx)+tx]);
        for (tsx=0; tsx<scale; tsx++)
        LCD_Write_DATA(col>>8,col & 0xff);
      }
    }
  }

  clrXY();
}

von peter (Gast)


Lesenswert?

Liegt es evtl. ander LCD_Write_DATA?

von peter (Gast)


Lesenswert?

Keiner eine Idee?

von Jens (Gast)


Lesenswert?

Wenn du Bilder auf dein Display zaubern willst kommt es auf die 
Dataorder an.
Also deine Bilddaten pro Pixel werden als WORD im Speicher abgelegt.
Und du liest auch wieder ein WORD aus. Soweit so gut.
Aber wenn du die Bilder vom PC überträgst (Speicherkarte oder so) dann 
kann es sein, dass am PC zuerst das Low-Byte und dann das High-Byte 
gespeichert werden.
Dein Display braucht die Daten aber genau umgekehrt.

Also versuche mal die Dataorder zu tauschen. Vielleicht funktioniert das 
schon.
Wenn nicht muss du den gesamten Code posten. So kann keiner sehen was 
die LCD_WRITE-Funktion wirklich macht.

Gruß, Jens

von Jens (Gast)


Lesenswert?

Ist die Schrift auch Teil des Bildes? Oder ist das anders erzeugt.
Wenn das zum Bild gehört, dann gilt das nicht mehr was ich oben 
geschrieben habe. Dann sieht es so aus als ob dein Lesepointer den 
Bereich verlässt wo auch wirklich Bilddaten im Speicher stehen. Das sind 
dann nur zufallswerte.


Gruß; jens

von peter (Gast)


Lesenswert?

Jens schrieb:
> Also versuche mal die Dataorder zu tauschen. Vielleicht funktioniert das
> schon.
>Dann sieht es so aus als ob dein Lesepointer den
Bereich verlässt wo auch wirklich Bilddaten im Speicher stehen. Das sind
dann nur zufallswerte

also ich habe das array per lcd assistant aus einem bild erzeugt.
data order habe ich versucht. das Hat leider nichts gebracht.

void UTFT::LCD_Write_DATA(uint8_t data)      //ilitek s.31
{
  DC_TFT_HIGH;
  CS_TFT_LOW;
  SPI.SPI_transfer(data);
  CS_TFT_HIGH;
}


void UTFT::LCD_Write_DATA(uint8_t VH,uint8_t VL)  //16 Bit dateien
{
  LCD_Write_DATA(VH);                //LowByte
  LCD_Write_DATA(VL);                //HighByte

}

von Jens (Gast)


Lesenswert?

Hallo,

Wie du das Bild erzeugt hast sagt aber noch nichts darüber aus WO es im 
Speicher steht. Dazu brauchst du die Startadresse und die Länge deines 
Bildes.
Vor allem ist in deiner Funktion noch ein Zoom mit eingebaut.
Kommentiere das zuerst mal aus, dass man nur nach einem Fehler sucht. 
Wenn die Bilder in normaler Größe angezeigt werden, kannst du dich um 
den Zoom kümmern.
Also den Wert scale weg und nur den ersten Teil in deiner if-Anweisung 
stehen lassen.

Wo kommt denn das Bild her? Da steht zwar eine Referenz auf ein 
Datenfeld, aber nichts wie die Daten von deinem Bild da hinein kommen! 
Wie stellst du sicher, dass in dem Feld die RICHTIGEN Daten stehen?

Nochmal:
Bitte poste den gesamten Code sonst kann man nur Vermutungen anstellen.

Grüße, Jens

von peter (Gast)


Lesenswert?

Jens schrieb:
> Nochmal:
> Bitte poste den gesamten Code sonst kann man nur Vermutungen anstellen.

also jens erstmal vielen dank dir für deine hilfe. du scheinst dich da 
wirklich auszukennen und ich hoffe, dass ich es mithilfe deiner 
unterstützung hinbekomme.
habe mein code als anhang beigefügt.

kleine notiz, die mich gerade stark verwundert:
ich habe mittlerweile 2 bilder implementier. wenn ich in meiner main 
allerdings nur ein bild aufrufe, zeigt er mir mittlerweile beide auf dem 
bildschirm an obwohl ein neues init und ein neues clrScr stattfindet. 
wie kann das sein

von peter (Gast)


Angehängte Dateien:

Lesenswert?

der anhang...

von peter (Gast)


Lesenswert?

Mit dem LCD assistant wird mir aus dem bild ein array generiert. dies 
auf richtigkeit zu überprüfen fällt natürlich schwer...

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.