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
Schonmal über das Get_address_mode Register nachgedacht? Get_address_mode (0Bh) - Bit D3 – RGB/BGR Order
Ich dachte dies wäre nur ein Register zum auslesen ! Kann mann diesen auch beschreiben ??
Habe gerade versucht einen Wert ins Register Get_address_mode (0Bh) zu schreiben aber dies funktioniert nicht . Ich kann Es leider nur auslesen.
> 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!!!
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
Wenn ich den Gram auslese bekomme ich alle Werte in BGR anstatt RGB !!
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
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.
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
ungres66 schrieb: > Display reagiert nur auf die ersten 3 Bits. Bist Du evtl. im IDLE-Mode (39h)? Da gibt es nur 8 Farben...
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.
@ 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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.