SSD1289 vs. SSD2119 RAM Address Position farkı..?

Başlatan fgokcegoz, 03 Aralık 2013, 11:14:49

fgokcegoz

SSD2119 un register tablosunu incelediğimizde,

0x44 : Vertical RAM Address Position (8 bit Start Address + 8 bit End Address)
0x45 : Horizontal RAM Address Start Position (9 bit)
0x46 : Horizontal RAM Address End Position (9 bit)

320x240 px ebatlarında bir tft için (landscape kullanımda), bir window oluşturduğumuzda bir problem yok, zira  horizontal adres en fazla 320 olacağından 9 bit bunun için yeterli. Aynı şekilde vertical adreste en fazla 240 olacağından 8 bit te bunun için yeterli.


Fakat SSD1289 a geldiğimizde,

0x44 : Horizontal RAM Address Position (8 bit Start Address + 8 bit End Address)
0x45 : Vertical RAM Address Start Position (9 bit)
0x46 : Vertical RAM Address End Position (9 bit)

Bu lcd driver da ise horizontal başlangıç ve bitiş adresi için 8 er bit ayırmışlar. Vertical adresler için 9 ar bit. Vertical adres zaten en fazla 240 olduğundan 9 bit yeterli. Ama horizontal adresler için 8 er bit yetmiyor. Mesela ben 300,0 koordinatından itibaren 15x15 bir window açmak istesem, bunu yapamayağım anlamına geliyor, öyle değil mi ? Eğer öyle ise SSD1289 için bu bir hata değil midir ?
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

yamak

Hocam 240 olan horizontal,320 olan vertical oluyo.SSD 2119 da ise tam tersi.ssd1289 240x320 çözünürlüklü ekranları sürüyo ssd2119 ise 320x240 öndeki sayı horizontalı diğeri ise vertical ı temsil ediyo.SSD1289 un datasheet inin 29. sayfasında gösteriliyo.

fgokcegoz

Sağolasın hocam, gördüm şimdi. O zaman şöyle düşünebiliriz. SSD1289 portrait moda (dikey kullanıma) uygundur, SSD2119 ise landscape moda (yatay kullanıma) uygundur.
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

yamak

Evet hocam öyle oluyo.Ama her ikisi de istenilen şekilde sürülebilir.Fakat biraz daha meşakatli olur.

fgokcegoz

Evet hocam, her ikiside istenilen şekilde sürülebilir. Ben kullanıma uygunluk açısından o şekilde değerlendirdim...
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

Mucit23

Arkadaşlar aynı sıkıntıyı yaşıyorum.

SSD1289'u yatay kullanıma göre init etmem gerekiyor. Daha önce bayağı bi SSD1963 ile uğraştım. Datasheeti gerçekten anlaşılırdı ama bununki berbat.

Mümkünse kullandığınız driver'in init kodlarını paylaşabilirmisiniz. 


yamak

Hocam init fonksiyonu aşağıdaki gibi:
void GLCD_Init (void) { 

  /* Configure the LCD Control pins                                           */
  LPC_GPIO0->FIODIR   |= 0x03f80000;
  LPC_GPIO0->FIOSET    = 0x03f80000;	

        delay(5);             
        wr_reg(0x03, 0x1038);       delay(5);  
	wr_reg(0x07, 0x0173);       delay(5);            
	wr_reg(0x0000,0x0001);    delay(5);  
    	wr_reg(0x0003,0xA8A4);    delay(5);   
    	wr_reg(0x000C,0x0000);    delay(5);   
    	wr_reg(0x000D,0x080C);    delay(5);   
    	wr_reg(0x000E,0x2B00);    delay(5);   
    	wr_reg(0x001E,0x00B0);    delay(5);   
    	wr_reg(0x0001,0x2b3F);    delay(5);        
    	wr_reg(0x0002,0x0600);    delay(5);
    	wr_reg(0x0010,0x0000);    delay(5);
    	wr_reg(0x0011,0x6078);    delay(5);     
    	wr_reg(0x0005,0x0000);    delay(5);
    	wr_reg(0x0006,0x0000);    delay(5);
    	wr_reg(0x0016,0xEF1C);    delay(5);
    	wr_reg(0x0017,0x0003);    delay(5);
    	wr_reg(0x0007,0x0233);    delay(5);               
    	wr_reg(0x000B,0x0000);    delay(5);
    	wr_reg(0x000F,0x0000);    delay(5);        
    	wr_reg(0x0041,0x0000);    delay(5);
    	wr_reg(0x0042,0x0000);    delay(5);
    	wr_reg(0x0048,0x0000);    delay(5);
    	wr_reg(0x0049,0x013F);    delay(5);
    	wr_reg(0x004A,0x0000);    delay(5);
    	wr_reg(0x004B,0x0000);    delay(5);
    	wr_reg(0x0044,0xEF00);    delay(5);
    	wr_reg(0x0045,0x0000);    delay(5);
    	wr_reg(0x0046,0x013F);    delay(5);
    	wr_reg(0x0030,0x0707);    delay(5);
    	wr_reg(0x0031,0x0204);    delay(5);
    	wr_reg(0x0032,0x0204);    delay(5);
    	wr_reg(0x0033,0x0502);    delay(5);
    	wr_reg(0x0034,0x0507);    delay(5);
    	wr_reg(0x0035,0x0204);    delay(5);
    	wr_reg(0x0036,0x0204);    delay(5);
    	wr_reg(0x0037,0x0502);    delay(5);
    	wr_reg(0x003A,0x0302);    delay(5);
    	wr_reg(0x003B,0x0302);    delay(5);
    	wr_reg(0x0023,0x0000);    delay(5);
    	wr_reg(0x0024,0x0000);    delay(5);
    	wr_reg(0x0025,0x8000);    delay(5);
    	wr_reg(0x004f,0);    
    	wr_reg(0x004e,0);      
}

Mucit23

Denedim hocam. LCD açılıyor LCD_Clear fonksiyonu çalışıyor. Ama nokta basmada sıkıntı var.

Aşağıdaki kodlarla nokta basmayı deniyorum.

   LCD_SetCursor(0,0);
   LCD_WriteRAM_Prepare();
   LCD_WriteRAM(Red);

Normalde 0,0 noktasına Kırmızı nokta koyması gerekirken 319,0(Sağ Üst Köşe) noktasına gidip nokta koyuyor. Kordinatı ne verirsem vereyim 319,0 noktasına nokta koyuyor. Bu neden kaynaklanabilir?

ercan_t

merhaba

ilk üç wr_reg yerine  şunları yaz dene...
birde delay fonksiyonun zamanlaması doğrumu test et delay(1) 10ms mi :)


       wr_reg(0x0007, 0x0021);
      // R00h = 0001h (OSCEN=1)
      wr_reg(0x0000, 0x0001);
      // R07h = 0023h (GON = 1,DTE = 0,D[1:0] = 11)
      wr_reg(0x0007, 0x0023);
      // R10h = 0000h (Exit sleep mode)
      wr_reg(0x0010, 0x0000);
      // Delay 30ms
      delay(3);
      // R07h = 0033h (GON = 1,DTE = 1,D[1:0] = 11)
      wr_reg(0x0007, 0x0033);
      // R11H = 0x6070 Entry mode
      // vsmode DFM1 DFM0 TRANS OEDef WMode DMode1 DMode0 TY1 TY0 ID1 ID0 AM LG2 LG2 LG0
      //   0     1    1     0     0     0     0      0     0   1   1   1   1  0   0   0
      wr_reg(0x0011, 0x6028);  //6068
      // R02h = 0x0600 LCD driver AC setting
      wr_reg(0x0002, 0x0600);

Mucit23

Hocam dediğinizi yaptım

Test etmek için aşağıdaki kodları kullanıyorum

LCD_WriteRAM_Prepare();
	LCD_WriteRAM(Red);
	LCD_WriteRAM(Red);
	LCD_WriteRAM(Red);


Biraz değişiklik oldu. Şimdi LCD Sağ üst köşeden başlayıp sola doğru 3 adet pixeli kırmızı yapıyor. Kursorü ayarlamada sıkıntı çekiyorum. Yukarıdaki kodların başına LCD_SetCursor(0,0); gibi bir komut eklesem dahi değişen birşey olmuyor. SetCursor fonksiyonu çalışmıyor.

Set_Cursor fonksiyonu böyle

void LCD_SetCursor(uint8_t Xpos, uint16_t Ypos)
{
  LCD_WriteReg(LCD_REG_32, Xpos);
  LCD_WriteReg(LCD_REG_33, Ypos);
}


Kursörü istediğim yere getirip istediğim yere nokta koysam işi bitiririm. Anahtar nokta şuanda burası

fgokcegoz

Bende bir süre SSD1289 ile uğraştım. Hiç mi hiç memnun kalmadım. Beyaz renk ile birlikte siyah renk basamayan saçma sapan bir driver işte, ssd1289. Daha önce ILI93xx serisi ile ve SSD2119 ile uğraştım. Onlarda hiçbir sıkıntı ile karşılaşmadım... Bu SSD1289'un bu problemi tüm şevkimi kırdı, sağolsun..
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

Mucit23

LCD_Cursör sorununu felan şözdüm. İnternetten SSD1289 için indirdiğim driver'de Set_Cursor fonksiyonundaki X ve Y değerlerini 0x20 ve 0x21 registerlerine yazıyordu. Ama datasheeti inceledimki baktım bendeki ssd1289 da böyle bir register yok. 0x4E, 0x4F registerlerine yazmak gerekiyor.

Ayrıca ekranda pencere açmak için kullanılan fonksiyondada problem vardı. Onuda düzelldim. Registerler felan yanlışdı.

Bendeki kütüphane ekranı dikey kullanacak şekilde ayarlanmıştı. Onuda yatay çalışacak şekilde düzelltim. Şimdi Ekranın 0,0 noktası sol üst köşe, 319,239 noktası sağ alt köşe oluyor.

Alıntı yapılan: fgokcegoz - 07 Ocak 2014, 20:53:19
Bende bir süre SSD1289 ile uğraştım. Hiç mi hiç memnun kalmadım. Beyaz renk ile birlikte siyah renk basamayan saçma sapan bir driver işte, ssd1289. Daha önce ILI93xx serisi ile ve SSD2119 ile uğraştım. Onlarda hiçbir sıkıntı ile karşılaşmadım... Bu SSD1289'un bu problemi tüm şevkimi kırdı, sağolsun..

Baştan sona kadar haklısın. Bu SSD1289 gerçektende sıkıntılı. Dediğin gibi Beyaz ile siyahı veya beyaz ile mavi basmakta sıkıntı var. Sebebini bilmiyorum ama beyaz siyah yan yana koyulduğu zaman sıralı yazmada kordinatları kaydırıyor. Örneğin X. pixeli beyaz yapacaksa X inci pixel ile hemen sağındaki pixelde beyaz yapıyor. Dolayısıyla herşey birbirine giriyor.

Bunu çözümü aslında basit. Ne olursa olsun herhangi bir pixele renk göndermeden önce LCD_SetCursor ile kordinat vermemiz gerekiyor. Yani ne oluyorsa sıralı yazmada sıkıntı oluyor.  Ama buda işleri yavaşlatıyor tabi.

SSD2119 ic'li LCD leri nereden alıyorsunuz. Ebayda var fakat 3.5" ayrıca PCB side çok büyük. 3.2" yokmudur.

fgokcegoz

Alıntı yapılan: Mucit23 - 08 Ocak 2014, 23:46:07
Baştan sona kadar haklısın. Bu SSD1289 gerçektende sıkıntılı. Dediğin gibi Beyaz ile siyahı veya beyaz ile mavi basmakta sıkıntı var. Sebebini bilmiyorum ama beyaz siyah yan yana koyulduğu zaman sıralı yazmada kordinatları kaydırıyor. Örneğin X. pixeli beyaz yapacaksa X inci pixel ile hemen sağındaki pixelde beyaz yapıyor. Dolayısıyla herşey birbirine giriyor.

Bunu çözümü aslında basit. Ne olursa olsun herhangi bir pixele renk göndermeden önce LCD_SetCursor ile kordinat vermemiz gerekiyor. Yani ne oluyorsa sıralı yazmada sıkıntı oluyor.  Ama buda işleri yavaşlatıyor tabi.

SSD2119 ic'li LCD leri nereden alıyorsunuz. Ebayda var fakat 3.5" ayrıca PCB side çok büyük. 3.2" yokmudur.

Dediğinizi anladım. İlk müsait zamanımda deneyeceğim... SSD2119 lu LCD leri bir zamanlar EMPA dan numune olarak almıştık... Ampire marka, 3.5" ebatında idiler... Onunda dökümanında, driver ic numarası verilmemişti, 0.register ından okuduk hangi driver ı olduğunu. Ondan da vazgeçtik pahalı olduğu için. Şimdilerde Shenzen Mex marka, driver sız 3.5" TFT lerle uğraşıyorum. Bakalım netice ne olacak...
"Vicdanın ziyası, ulûm-u diniyedir. Aklın nuru, fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder." (Bediüzzaman Said Nursi)

Mucit23

#13
Hocam Beyaz pixel sorununu tamamiyle çözdüm. Daha önceden Beyaz pixel bastığımda verdiğim kordinatla birlikte verdiğim kordinatın yanındaki pixel'de beyazı oluyordu. Yani yan yana iki adet pixel beyaz oluyordu. Bu anladığım kadarıyla tamamiyle FSMC ayarları ile ilgili.

FSMC Hız parametlerelerini düşürdüm.

  p.FSMC_AddressSetupTime = 0;
  p.FSMC_AddressHoldTime = 0;
  p.FSMC_DataSetupTime = 5;
  p.FSMC_BusTurnAroundDuration = 0;
  p.FSMC_CLKDivision = 0;
  p.FSMC_DataLatency = 0;
  p.FSMC_AccessMode = FSMC_AccessMode_A;


Bu değerlerle oynayınca doğrudan sonuç değişiyor. Bu ayarlarla şekilde Sıkıntı yok.

Başka birşey sorayım. PutPixel Fonksiyonu yazdım. Çalışmasında sıkıntı yok. Bunun dışında birde GetPixel Fonksiyonu yazmam lazım. İstediğim kordinatın RGB datasını nasıl okurum.

Aslında bende örnek var fakat FSMC kullanılmadan yapılmış. FSMC 'den okuma yapılıyormu?