SSD1963 5" 480x272 TFT - Siyah renk sorunu

Başlatan JKramer, 19 Kasım 2014, 15:22:12

JKramer

Merhaba,

Başlıkta belirttiğim gibi SSD1963'lü bir modül üzerinde 5" 480x272 çözünürlüklü bir ekran var. Kırmızı, yeşil, mavi, beyaz, vb. renkleri düzgün gösterip siyah rengi (0x0000) koyu kırmızı şeklinde gözüktüğü bir durumla karşılaştınız mı? Siyah renk düzgün basılmayınca resim de aşağıdaki gibi görünüyor:
[IMG]http://i.imgur.com/yzYdjNvl.jpg[/img]

Bu da orjinali:
[IMG]http://i.imgur.com/AIqabeCl.png[/img]

Siyah renk. Aslında daha koyu, fotoğrafı çekerken düz renkte odaklayamadım:
[IMG]http://i.imgur.com/eSZ6y1jl.jpg[/img]

Dediğim gibi; kırmızı, yeşil ve mavi olması gerektiği gibi basılıyor. Mesela mavi renk (0x001F) şöyle:
[IMG]http://i.imgur.com/VqUjjTfl.jpg[/img]

16bit - 565 şeklinde kullanıyorum. Gecikmeler milisaniye. Değerlerle oynadığım için açıklama kısımlarını dikkate almayın. En son SSD1963'ün v1.1 kataloğuna göre hız en fazla 110MHz olabilir dediği için onu 100MHz, pixel clock hızını da yaklaşık 8MHz yaptım. Aşağıda SSD1963 init kodları mevcut:
unsigned int  HDP = 479;
unsigned int  HT = 525;
unsigned int  HPS = 43;
unsigned int  LPS = 1;
unsigned char   HPW = 42;

unsigned int  VDP = 271;
unsigned int  VT = 286;//288
unsigned int  VPS = 12;
unsigned int  FPS = 1;
unsigned char   VPW = 11;
void SSD1963_Initial( void )
{
    delay( 100 );
    write_command( 0x00E2 );	//PLL multiplier, set PLL clock to 120M
    Write_Data_int( 0x001D );	  //N=0x36 for 6.5M, 0x23 for 10M crystal 0x0023
    Write_Data_int( 0x0002 ); //0x0002
    Write_Data_int( 0x0004 );
    write_command( 0x00E0 ); // PLL enable
    Write_Data_int( 0x0001 );
    delay( 1 );
    write_command( 0x00E0 );
    Write_Data_int( 0x0003 );		// now, use PLL output as system clock
    delay( 5 );
    write_command( 0x0001 ); // software reset
    delay( 5 );
    write_command( 0x00E6 );	//PLL setting for PCLK, depends on resolution
//	Write_Data_int(0x0001);  //OTA5180
//	Write_Data_int(0x00ff);  //OTA5180
//	Write_Data_int(0x0000);  //OTA5180

//    Write_Data_int( 0x0001 ); //HX8257C 0x0001 8.99=~9MHz pixel clock
//    Write_Data_int( 0x0070 ); //HX8257C 0x0033
//    Write_Data_int( 0x00A2 ); //HX8257C 0x0033

    Write_Data_int( 0x0001 ); //HX8257C 0x0001 8.99=~9MHz pixel clock
    Write_Data_int( 0x0048 ); //HX8257C 0x0033
    Write_Data_int( 0x009E ); //HX8257C 0x0033


    write_command( 0x00B0 );	//LCD SPECIFICATION
    Write_Data_int( 0x0020 );
    Write_Data_int( 0x0000 );
    Write_Data_int( ( HDP >> 8 ) & 0X00FF ); //Set HDP
    Write_Data_int( HDP & 0X00FF );
    Write_Data_int( ( VDP >> 8 ) & 0X00FF ); //Set VDP
    Write_Data_int( VDP & 0X00FF );
    Write_Data_int( 0x0000 );
    delay( 5 );
    write_command( 0x00B4 );	//HSYNC
    Write_Data_int( ( HT >> 8 ) & 0X00FF ); //Set HT
    Write_Data_int( HT & 0X00FF );
    Write_Data_int( ( HPS >> 8 ) & 0X00FF ); //Set HPS
    Write_Data_int( HPS & 0X00FF );
    Write_Data_int( HPW );			 //Set HPW
    Write_Data_int( ( LPS >> 8 ) & 0X00FF ); //SetLPS
    Write_Data_int( LPS & 0X00FF );
    Write_Data_int( 0x0000 );

    write_command( 0x00B6 );	//VSYNC
    Write_Data_int( ( VT >> 8 ) & 0X00FF ); //Set VT
    Write_Data_int( VT & 0X00FF );
    Write_Data_int( ( VPS >> 8 ) & 0X00FF ); //Set VPS
    Write_Data_int( VPS & 0X00FF );
    Write_Data_int( VPW );			 //Set VPW
    Write_Data_int( ( FPS >> 8 ) & 0X00FF ); //Set FPS
    Write_Data_int( FPS & 0X00FF );

    write_command( 0x00B8 );
    Write_Data_int( 0x000f );  //GPIO is controlled by host GPIO[3:0]=output   GPIO[0]=1  LCD ON  GPIO[0]=1  LCD OFF
    Write_Data_int( 0x0001 );  //GPIO0 normal

    write_command( 0x00BA );
    Write_Data_int( 0x0001 );  //GPIO[0] out 1 --- LCD display on/off control PIN

    write_command( 0x0036 ); //rotation
    Write_Data_int( 0x0008 ); //RGB=BGR
//    Write_Data_int( 0x0000 ); //RGB=RGB

    write_command( 0x003A ); //Set the current pixel format for RGB image data
    Write_Data_int( 0x0050 ); //16-bit/pixel

    write_command( 0x00F0 ); //Pixel Data Interface Format
    Write_Data_int( 0x0003 ); //16-bit(565 format) data

    write_command( 0x00BC );
    Write_Data_int( 0x0040 ); //contrast value
    Write_Data_int( 0x0080 ); //brightness value
    Write_Data_int( 0x0040 ); //saturation value
    Write_Data_int( 0x0001 ); //Post Processor Enable

    delayus( 5 );

    write_command( 0x0029 ); //display on



    write_command( 0x00BE ); //set PWM for B/L
    Write_Data_int( 0x0006 );
    Write_Data_int( 0x0080 );
    Write_Data_int( 0x0001 );
    Write_Data_int( 0x00f0 );
    Write_Data_int( 0x0000 );
    Write_Data_int( 0x0000 );

    write_command( 0x00d0 );
    Write_Data_int( 0x000d );

}

M_B

Merhaba;
Beyaz zemin üzerine siyah olarak font basıp denediniz mi ?

İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

HexfeT

#2
Write_Data_int( 0x0008 ); //RGB=BGR

Koddaki şu satır 16 bitlik renk bilgisinin BGR şeklinde sıralandığını gösteriyor. Bu durumda "0x001F" gönderdiğinizde ekranın mavi değil kırmızı olması lazım.

Bir de ekrana bastığınız görüntüyü pc de hazırlarken 16bit 565 formatında ve RGB, BGR vs. renk sıralamasına dikkat ederek hazırlamanız lazım. Eğer LCD yi RGB olarak konfigüre edip, imaj verisini pc de BGR yaparsanız ya da bu ayrıntıya dikkat etmezseniz olmaz. Bana sorun bu gibi geldi. İmaj verisindeki renk sıralaması ile lcd nin konfigüre edildiği renk sıralaması farklı bence.

M_B

Alıntı yapılan: HexfeT - 19 Kasım 2014, 16:30:04
Write_Data_int( 0x0008 ); //RGB=BGR

Koddaki şu satır 16 bitlik renk bilgisinin BGR şeklinde sıralandığını gösteriyor. Bu durumda "0x001F" gönderdiğinizde ekranın mavi değil kırmızı olması lazım.

Bir de ekrana bastığınız görüntüyü pc de hazırlarken 16bit 565 formatında ve RGB, BGR vs. renk sıralamasına dikkat ederek hazırlamanız lazım. Eğer LCD yi RGB olarak konfigüre edip, imaj verisini pc de BGR yaparsanız ya da bu ayrıntıya dikkat etmezseniz olmaz. Bana sorun bu gibi geldi. İmaj verisindeki renk sıralaması ile lcd nin konfigüre edildiği renk sıralaması farklı bence.
Bende o yuzden beyaz zemin uzerinde siyah font basabiliyormu diye sordum.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

serdararikan

bence renk bağlantılarından birisi temas etmiyor.muhtemelen yeşil renk bağlantılarından birisi.

JKramer

0x0000 basmana rağmen bir renge kayıyorsa, doğal olarak o rengin bir veya birkaç bit'inin set olması lazım. En başta yapmam gereken şeyi en son yapıp portu okuyunca DB15'in kabak gibi set edilmiş olduğunu gördüm. Bu programı, sd kart okuduğum programın üzerine devam ettiğim için, sd kart detect pin tanımlamaları kalmış. Tahmin edileceği üzere, o pin ile DB15'in aynı pin olduğu ortaya çıktı. Tanımlamaları iptal edince sorun çözüldü.

Yalnız HexfeT'in bahsettiği RGB-BGR kısmı ters oluyor. Benim data portum ile SSD1963'ün portları aynı sırada;

PB0-TFT_D0
PB1-TFT_D1
...
PB15-TFT_D15

şeklinde. Little endian, 0x001F gönderdiğimde portlarda da 0x001F görüyorum. Acaba modülü yapanlar TFT <--> SSD1963 bağlantılarını ters mi yapmış olabilir mi? Modül şu: http://www.buydisplay.com/default/5-tft-ssd1963-lcd-module-touch-screen-display-480x272-mcu-arduino Demo kodda BGR olduğundan, HexfeT söyleyene kadar hiç dikkat etmemiştim buna.

JKramer

Aynen dediğim gibiymiş, modülde TFT <--> SSD1963 arasında B ve R data hatları ters.