Forum: Mikrocontroller und Digitale Elektronik Ili 9481 TFT BGR statt RGB


von ungres66 (Gast)


Lesenswert?

Hallo @ ALL,

versuche gerade einen TFT mit Ili9481 anzusteuern.

Erstmal das Positive: Lesen und Schreiben der Register und Gram 
funktioniert.

Mein Problem:

Wenn ich einen Pixel (z.b.: ROT =0xF800 [RGB]) ins Gram schreibe 
erscheint auf dem TFT dieser Pixel als BLAU anstatt ROT.

Wenn ich den Gram auslese ist der Wert =0xF800 .

Habe versuchsweise beim Register "Set_address_mode (36h) " einen Bit 
(B3=RGB/BGR Order )verändert und folgendes ist passiert:

Schreibe ROT =0xF800 ins Gram und auf dem TFT ist der Pixel auch Rot.

Aber wenn ich den Pixel vom Gram auslese erhalte ich den Wert=0x001F !!!


ps.: Den Wert kann ich per Code von BGR auf RGB verändern.
Aber dieses kostet Zeit.


Hat jemad eine Idee welchen Register ich verändern muss ???

Mfg
ungres66

von void (Gast)


Lesenswert?

Schonmal über das Get_address_mode Register nachgedacht?
  Get_address_mode (0Bh) - Bit D3 – RGB/BGR Order

von ungres66 (Gast)


Lesenswert?

Ich dachte dies wäre nur ein Register zum auslesen !

Kann mann diesen auch beschreiben ??

von ungres66 (Gast)


Lesenswert?

Habe gerade versucht einen Wert ins Register Get_address_mode (0Bh) zu 
schreiben aber dies funktioniert nicht .

Ich kann Es leider nur auslesen.

von ungres66 (Gast)


Lesenswert?

Hat jemand eine anere Idee?

von void (Gast)


Lesenswert?

> Ich dachte dies wäre nur ein Register zum auslesen!
  > Kann mann diesen auch beschreiben??

Korrekt. Kann kann man nur lesen. Fehler von mir.

Habe mir von der Beschreibung von Set_address_mode
  "Pixels sent in RGB/BGR order"
in die Irre führen lassen.

Mit senden ist wohl vom GRAM auf das Display gemeint (nicht vom uC in 
das GRAM).
Dafür spricht die Zeichnung auf DB Seite 80 (in der Beschreibung von 
Set_address_mode).
Dagegen spricht aber deine Beobachtung, dass du aus dem GRAM die Daten 
gedreht ausliest:

  > Schreibe ROT =0xF800 ins Gram und auf dem TFT ist der Pixel auch 
Rot.
  > Aber wenn ich den Pixel vom Gram auslese erhalte ich den 
Wert=0x001F!!!

von ungres66 (Gast)


Lesenswert?

warte kurz ich schau nach.

von ungres66 (Gast)


Lesenswert?

Also folgendes beobachte ich :

Set_address_mode (36h) = Bit 4 auf HIGH

>> ROT =0xF800 ins Gram >> TFT=ROT

Beim auslesen kommt Wert=0x001F

Dieses verstehe Ich nicht

von ungres66 (Gast)


Lesenswert?

Wenn ich den Gram auslese bekomme ich alle Werte in BGR anstatt RGB !!

von ungres66 (Gast)


Lesenswert?

Und folgendes beobachte ich bei LOW (für HIGH siehe weiter Oben)

Set_address_mode (36h) = Bit 4 auf LOW (Null)

>> ROT =0xF800 ins Gram >> TFT=BLAU

Beim auslesen kommt der richtige Wert=0xF800 für ROT


Jetzt stimmt der Speicher aber auf dem TFT erscheint der Pixel erscheint 
Blau.

Dieses verstehe Ich nicht

von void (Gast)


Lesenswert?

Die Frame-Write/Read Formate-Diagramme auf den Seiten 28(DBI B type) und 
30(DBI C type = SPI) zeigen einen Unterschied zwischen read und write 
auf. Bei Read ist das "Set_pixel_format" egal (*), bei Write ist es 
davon abhängig. Vielleicht ist der Ursprung deines Problems ein 
ungültiges/falsches "Set_pixel_format".
Setzte mal
 Set_pixel_format (3Ah) = 3'h6
dann sollte das Read-Format dem des Write-Formats (des Interfaces) 
entsprechen.

Falls nicht; Systematisches vorgehen hilft.
- Welches Interface zum uC benutzt du?
- Wie sieht der Code aus?
- Mal eine Nacht drüber schlafen.

In dem Sinne gute Nacht.

von ungres66 (Gast)


Angehängte Dateien:

Lesenswert?

Ich benutze den Display Bus Interface (DBI).Im 16 Bit Modus.

Habe den Set_pixel_format (3Ah)verändert bringt nichts.

Display reagiert nur auf die ersten 3 Bits.

Mein init Code sieht folgendermasen aus: Siehe Anhang.

Ich sitz irgendwie auf dem Schlauch´, ist bestimmt nur eine klenigkeit

von Benjamin (Gast)


Lesenswert?

ungres66 schrieb:
> Display reagiert nur auf die ersten 3 Bits.
Bist Du evtl. im IDLE-Mode (39h)?
Da gibt es nur 8 Farben...

von void (Gast)


Lesenswert?

ungres66 schrieb:
> Ich benutze den Display Bus Interface (DBI).Im 16 Bit Modus.
> Habe den Set_pixel_format (3Ah)verändert bringt nichts.

Klar. Für DBI 16 bit i/f Modus mit "16bpp frame memory write"  hast du 
es auch schon richtig eingestellt:
1
TFT_WR_REG(0x3A); //Interface pixel format
2
TFT_WR_DATA(0x05);    // 16 bits per pixel


>TFT_WR_REG(0xC8); //GAMMASET
Die Gamma-Werte hierfür hast du aber nicht aus dem ILI9481 Datenblatt.
Woher kommen die, sind die sinnvoll?


>TFT_WR_REG(0x36) = 0x68
Page Address Order - Warum nicht oben nach unten?
Page/Column Order - Reverse mode. Ist vermutlich Absicht.


>TFT_WR_REG(0xC0); //SETSTBA
Das Register "Panel Driving Setting (C0h)" hat 6 Parameter. Du schreibst 
nur 5 Stück.

>TFT_WR_REG(0xC5);  //SETDISPLAYFRAME
Das Register "Frame Rate and Inversion Control (C5h)" schreibst du auf 
0x08 (Bit D3 = 1), es hat aber nur die Bits D0-D2.


Ich schlage vor zu gehst nochmal zurück zu dem Code wo er abgeschrieben 
wurde und vergleichst es nochmal.
ab Zeile 426
https://github.com/Bodmer/TFT_HX8357_Due/blob/master/TFT_HX8357_Due.cpp
Sollte so wie ich sehe auch für 16bit I/F mode sein.

von ungres66 (Gast)


Angehängte Dateien:

Lesenswert?

@ Benjamin

>Bist Du evtl. im IDLE-Mode (39h)?

Ich glaube nicht # Darstellung von 16 Bit Farben geht.

@ void

> TFT_WR_REG(0x3A); //Interface pixel format

Können Wir abhaken,gleiche Meinung 0x05 ist ok.

>TFT_WR_REG(0xC8); //GAMMASET
Nein diese GAMMASET Werte sind nicht von mir.
Hat jemand im Forum geteilt für den Atmega.
Keine Ahnung ob Sie sinnvoll sind.
Ich bin erstmal drinnen muss mich erst orientieren.
Hatte einige Probleme bei der Verbindung zum TFT.
Die RD Leitung war nicht auf dem TFT-Adapter herausgeführt.
Die Daten-Leitungen waren in nur eine Richtung (Write) gesetzt.
Mit einem 74LVC245a (Ich glaube Sie dienten der senkung der 
Sapnnungspegel von den I/O Leitungen.
Habe die Funktion des 74LVC245a Hardwareseitig etwas geändert damit ich 
auch Lesen kann.

>TFT_WR_REG(0x36) = 0x68 Page Address Order - Warum nicht oben nach unten?

Mein Controler liegt bei mir Links deshalb.

>TFT_WR_REG(0xC0); //SETSTBA Das Register "Panel Driving Setting (C0h)" hat 6 
Parameter.
Du schreibst nur 5 Stück.

Der 6 .Parameter ist null deshalb fehlt Er.
Muss Ich selber nochmal nachschauen.(in deinem Link sind Es auch nur 5)

>TFT_WR_REG(0xC5);  //SETDISPLAYFRAME
Das Register "Frame Rate and Inversion Control (C5h)" schreibst du auf
0x08 (Bit D3 = 1), es hat aber nur die Bits D0-D2.

Da hast Du Recht aber der geplante Parameter war Null (ps.:war zu 
faul,hatte an dem Parameter herumgespielt)
und die 0x08 ist genauso viel wert wie eine Null.
Die Bits D3-D7 haben keine Funktion und die 0x08 spricht D3 an.
Habe Es aber auf die frequenz 85 Hz geändert.


>Ich schlage vor zu gehst nochmal zurück zu dem Code wo er abgeschrieben
wurde und vergleichst es nochmal.

Ich Würde gerne abschreiben,finde aber nichts das die READ-Funktion 
unterstützt.
Die meisten Codes beruhen auf die Write-Funktion


Wir können aber gerne Enige Register besprechen.
Ich habe den init Code etwas bearbeitet und die Parameter wo ich noch 
nicht genauer angeschaut habe
mit ??? gekennzeichnet.

MFG

von Walter T. (nicolas)


Lesenswert?

Egal wie die Adressierung beim Schreiben aussieht: Beim Lesen hast Du 24 
Bit und das erste gelesene Byte ist Müll.

Um einen Bildschirminhalt zu kopieren, muß man nach dem Auslesen wieder 
von 24 Bit auf 16 Bit rekodieren.

von ungres66 (Gast)


Lesenswert?

Hallo,
@Walter Tarpan

>Egal wie die Adressierung beim Schreiben aussieht: Beim Lesen hast Du 24
Bit und das erste gelesene Byte ist Müll.


Ich benutze beim Lesen den Befehl "Read_memory_start (2Eh)" und habe
einen 16Bit-Port.(siehe Foto)

So lese ich aus:

 1.Sende Befehl "Read_memory_start (2Eh)"
 2.Sende DUMMY_READ
 3.Beim nächsten Read erhalte einen 16Bit Wert aus dem GRAM

Und beim nochmaligen Read ist der Adress-Counter um 1 incrementiert und 
erhalte
wieder einen 16Bit Wert(nächstes Pixel_Color) aus dem GRAM. usw.....

--------------------------------------------------
Set_address_mode (36h)
#######################

‘0’ = Pixels sent in RGB order

Bit 4 auf LOW  >> ROT =0xF800 ins Gram >> TFT=BLAU
Aber beim auslesen kommt der richtige Wert=0xF800 für ROT

################################

Beispiel fom Foto im Anhang:
‘1’ = Pixels sent in BGR order

Bit 4 auf HIGH >> ROT =0xF800 ins Gram >> TFT=ROT
Aber beim auslesen kommt Wert=0x001F

############################################


Meintest Du eventuel den Befehl "Read_Memory_Continue (3Eh)" ?
Dort glaube ich etwas gelesen zu haben über einen 24Bit-Wert.

mfg

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.