STM32F4x Çalışmalarım

Başlatan Mucit23, 02 Aralık 2013, 00:01:25

bocek

#15
hocam UTFT library 'deki ssd1963 için 480x272 ayarları seninkinden farklı biraz. istersen bir de bu ayarlara göre dene:

SSD1963 480x272 UTFT library için initlcd.h dosyası:
case SSD1963_480:
	LCD_Write_COM(0xE2);		//PLL multiplier, set PLL clock to 120M
	LCD_Write_DATA(0x23);	    //N=0x36 for 6.5M, 0x23 for 10M crystal
	LCD_Write_DATA(0x02);
	LCD_Write_DATA(0x54);
	LCD_Write_COM(0xE0);		// PLL enable
	LCD_Write_DATA(0x01);
	delay(10);
	LCD_Write_COM(0xE0);
	LCD_Write_DATA(0x03);
	delay(10);
	LCD_Write_COM(0x01);		// software reset
	delay(100);
	LCD_Write_COM(0xE6);		//PLL setting for PCLK, depends on resolution
	LCD_Write_DATA(0x01);
	LCD_Write_DATA(0x1F);
	LCD_Write_DATA(0xFF);

	LCD_Write_COM(0xB0);		//LCD SPECIFICATION
	LCD_Write_DATA(0x20);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x01);		//Set HDP	479
	LCD_Write_DATA(0xDF);
	LCD_Write_DATA(0x01);		//Set VDP	271
	LCD_Write_DATA(0x0F);
	LCD_Write_DATA(0x00);

	LCD_Write_COM(0xB4);		//HSYNC
	LCD_Write_DATA(0x02);		//Set HT	531
	LCD_Write_DATA(0x13);
	LCD_Write_DATA(0x00);		//Set HPS	8
	LCD_Write_DATA(0x08);
	LCD_Write_DATA(0x2B);		//Set HPW	43
	LCD_Write_DATA(0x00);		//Set LPS	2
	LCD_Write_DATA(0x02);
	LCD_Write_DATA(0x00);

	LCD_Write_COM(0xB6);		//VSYNC
	LCD_Write_DATA(0x01);		//Set VT	288
	LCD_Write_DATA(0x20);
	LCD_Write_DATA(0x00);		//Set VPS	4
	LCD_Write_DATA(0x04);
	LCD_Write_DATA(0x0c);		//Set VPW	12
	LCD_Write_DATA(0x00);		//Set FPS	2
	LCD_Write_DATA(0x02);

	LCD_Write_COM(0xBA);
	LCD_Write_DATA(0x0F);		//GPIO[3:0] out 1

	LCD_Write_COM(0xB8);
	LCD_Write_DATA(0x07);	    //GPIO3=input, GPIO[2:0]=output
	LCD_Write_DATA(0x01);		//GPIO0 normal

	LCD_Write_COM(0x36);		//rotation
	LCD_Write_DATA(0x22);

	LCD_Write_COM(0xF0);		//pixel data interface
	LCD_Write_DATA(0x03);


	delay(1);

	setXY(0, 0, 479, 271);
	LCD_Write_COM(0x29);		//display on

	LCD_Write_COM(0xBE);		//set PWM for B/L
	LCD_Write_DATA(0x06);
	LCD_Write_DATA(0xf0);
	LCD_Write_DATA(0x01);
	LCD_Write_DATA(0xf0);
	LCD_Write_DATA(0x00);
	LCD_Write_DATA(0x00);

	LCD_Write_COM(0xd0); 
	LCD_Write_DATA(0x0d);	

	LCD_Write_COM(0x2C); 
	break;

setxy.h dosyası:
case SSD1963_480:
	swap(word, x1, y1);
	swap(word, x2, y2);
	LCD_Write_COM(0x2a); 
  	LCD_Write_DATA(x1>>8);
  	LCD_Write_DATA(x1);
  	LCD_Write_DATA(x2>>8);
  	LCD_Write_DATA(x2);
	LCD_Write_COM(0x2b); 
  	LCD_Write_DATA(y1>>8);
  	LCD_Write_DATA(y1);
  	LCD_Write_DATA(y2>>8);
  	LCD_Write_DATA(y2);
	LCD_Write_COM(0x2c); 
	break;
1 ya da 0. işte 'bit'ün mesele..

M_B

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

Mucit23

Ben ilk başlarda STM32F407 ile ilgili olabileceğini düşünüyordum(fsmc veya controllines ayarları) Ama onlarda problem yok. Sorun bence LCD'nin init edilememesinden kaynaklanıyor.Belkide işlemci çok hızlı çalışıyor.İşleri Biraz yavaşlatmayı düşünüyorum. init kodlarında komutların arasına delaylar koyayım. Birde öyle deneyeyim.

Kaynaklar için Teşekkür ederim. Akşam Tekrardan ayrıntılı olarak bakacağım. Bu sefer çalışacağını umuyorum ::)

M_B

Mucit23 hocam;
İşlemci ne kadar hızlı çalışırsa çalışsın Sorun olmaz.
Eger SSD1963 init fonksiyonu na istediğin kadar delay koy farkeden bir şey olmaz.
Önemli olan initin doğru kurulmasıdır.
Örneğin ben 7" Lcd ile uğraşırken başıma geldi. SSD1963 PLL kısmını aktif etmedim. Ekrana yazılar o kadar çok yavaş geldi ki
dedim bu böyleyse işimiz var ;) Sonra verdiğim dokuman ve Datasheeti inceleyerek yapılması gereken init işlemlerini yaptım.
Bu işleri yaparken güzel bir not tutmuş olsaydım şimdi bu senin sorunlarını yaşamazdık.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

handybest06

@M_B

SSD1289 bir LCD' yi sürmeye çalışıyorum.Ama sizin dediğiniz gibi çok yavaş .3-4 sn de ekranı doldurabiliyor.Bunu nasıl çözebilirim ?

M_B

Alıntı yapılan: handybest06 - 03 Aralık 2013, 12:26:09
@M_B

SSD1289 bir LCD' yi sürmeye çalışıyorum.Ama sizin dediğiniz gibi çok yavaş .3-4 sn de ekranı doldurabiliyor.Bunu nasıl çözebilirim ?
ssd1289 hangi işlemci ile suruyorsunuz?
Eger Stm32F407 ile suruyorsanız.
stm322xg_eval_lcd.c
stm322xg_eval_lcd.h
işinizi görecektir. En azından ordaki init kısımlarını kontrol edersiniz.

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

Mucit23

#21
Hocam İnit Winstarın Kodlarını Aynen Geçirdim. Ekranda Canlanma var. :) Heyecanlandım  :D

yükle resim
Çekmeyen Televizyonlar gibi görüntü veriyor şuanda. Mainde Yaptığım Tek şey Ekranı init ettikten sonra LCD Clear Komutuyla Ekranı Kırmızıya boyamak. Sanırsam Vertical ve Horizontal Tarama ayarlarında sıkıntı var. 




M_B

Alıntı yapılan: Mucit23 - 03 Aralık 2013, 14:25:03
Hocam İnit Winstarın Kodlarını Aynen Geçirdim. Ekranda Canlanma var. :) Heyecanlandım  :D

yükle resim
Çekmeyen Televizyonlar gibi görüntü veriyor şuanda. Mainde Yaptığım Tek şey Ekranı init ettikten sonra LCD Clear Komutuyla Ekranı Kırmızıya boyamak. Sanırsam Vertical ve Horizontal Tarama ayarlarında sıkıntı var.
Devam et hocam olacak bu iş.
İstersen yaparkende not al ilerde bir gun gene lazım olabilir. İnsan o an unutmam sanıyor ama unutuyor. ;)
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

Mucit23

Deniyorum hocam bakalım. Donanımsal olarak bir problem yok. Sorun LCD yi init etmede. Fakat Hazır kodlarla olacak iş değil bu. Winstarınkide düzgün çalışmadı. UTF de düzgün çalışmadı. Anlaşılan Datasheete gömüleceğiz.

Mucit23

#24
Hocam işi %80 Çözdüm.

4.3" için Doğru init kodları bunlar

            
            LCD_WriteCommand(0x0001);	 // software reset
            LCD_WriteCommand(0x0001);	 // software reset
	    LCD_WriteCommand(0x0001);	 // software reset
	
	    LCD_WriteCommand(0x00E2);  //SET PLL freq=120MHz ;
	    LCD_WriteData(0x0023);     //N=0x36 for 6.5M, 0x23 for 10M crystal
            LCD_WriteData(0x0001);
            LCD_WriteData(0x0004);
            
            LCD_WriteCommand(0x00E0); // Start PLL 
            LCD_WriteData(0x0001);
	    _delay_(5);
            LCD_WriteCommand(0x00E0); // Lock PLL 
            LCD_WriteData(0x0003);
            _delay_(5);
	    LCD_WriteCommand(0x0001);	 // software reset
						
	    LCD_WriteCommand(0xE6);    ///PLL setting for PCLK, depends on resolution
            LCD_WriteData(0x0001);
            LCD_WriteData(0x0033);
            LCD_WriteData(0x0032);

            LCD_WriteCommand(0x00B0);   // Set Lcd_Mode 
            LCD_WriteData(0x0020);
            LCD_WriteData(0x0000);
            LCD_WriteData((HDP>>8)&0X00FF);  //Set HDP
            LCD_WriteData(HDP&0X00FF);
            LCD_WriteData((VDP>>8)&0X00FF);  //Set VDP
            LCD_WriteData(VDP&0X00FF);
            LCD_WriteData(0x0000);

            LCD_WriteCommand(0x00B4);		     //HSYNC Set_hori_period.
            LCD_WriteData((HT>>8)&0X00FF);   //Set HT         
            LCD_WriteData(HT&0X00FF);
            LCD_WriteData((HPS>>8)&0X00FF);  //Set HPS
            LCD_WriteData(HPS&0X00FF);
            LCD_WriteData(HPW);			         //Set HPW 			
            LCD_WriteData((LPS>>8)&0X00FF);  //Set HPS
            LCD_WriteData(LPS&0X00FF);      
            LCD_WriteData(0x0000);

            LCD_WriteCommand(0x00B6);				 //VSYNC  Set_Vrt_period.
            LCD_WriteData((VT>>8)&0X00FF);   //Set VT 
            LCD_WriteData(VT&0X00FF);
            LCD_WriteData((VPS>>8)&0X00FF);  //Set VPS
            LCD_WriteData(VPS&0X00FF);
            LCD_WriteData(VPW);			         //Set VPW			   		
            LCD_WriteData((FPS>>8)&0X00FF);
            LCD_WriteData(FPS&0X00FF);
			
            LCD_WriteCommand(0x002A);      //SET column address
            LCD_WriteData(0x0000);         //SET start column address=0
            LCD_WriteData(0x0000);
            LCD_WriteData(0x0001);         //SET end column address=479
            LCD_WriteData(0x00df);
						
            LCD_WriteCommand(0x002B);      //SET page address
            LCD_WriteData(0x0000);         //SET start page address=0
            LCD_WriteData(0x0000);
            LCD_WriteData(0x0001);         //SET end page address=271
            LCD_WriteData(0x000f);

            LCD_WriteCommand(0x00F0);       //Pixel data interface
            LCD_WriteData(0x0003);          //16Bit RGB565 Format
            LCD_WriteCommand(0x003A);       //Pixel RGB Format 
	    LCD_WriteData(0x0050);          //16Bit RGB Format
						
	    LCD_WriteCommand(0x00BC);       //Set image post processor
            LCD_WriteData(0x001F);          //Set the contrast value
	    LCD_WriteData(0x0080);          //Set the brightness value
	    LCD_WriteData(0x0020);          //Set the saturation value
	    LCD_WriteData(0x0001);          //Enable Post Processor

            LCD_WriteCommand(0x0029);       //Display on


LCD Parametreleri

unsigned int  HDP=479;  //Horizontal Display Period
unsigned int  HT=531;   //Horizontal Total
unsigned int  HPS=43;   //LLINE Pulse Start Position
unsigned int  LPS=8;    //Horizontal Display Period Start Position
unsigned char HPW=10;   //LLINE Pulse Width


unsigned int  VDP=271;	//Vertical Display Period
unsigned int  VT=285;	  //Vertical Total
unsigned int  VPS=12;	  //LFRAME Pulse Start Position
unsigned int  FPS=4;	  //Vertical Display Period Start Positio
unsigned char VPW=10;	  //LFRAME Pulse Width


Renkleri ve Kontrast Ayarlarını elden geçirmem gerekecek. Bunlarla biraz oynadım daha beter ettim. Kırmızı pembe gibi çıkıyor.  :D

Aldığım Sonuçlar Böyle


resim


hızlı resim yükle

Fakat Kütüphaneyi Değiştirmeyi düşünüyorum. Birçok fonksiyon şuanda çalışmıyor. Renkler doğru düzgün çıkmıyor. Biraz elden geçirmem gerekecek. Neyse İşin En önemli kısmını yaptık. Yazıda çıktığına göre gerisi cilalama. Ama biraz uğraşacağım. 

@Mehmet Hocam özellikle Size ve diğer yardımcı olan arkadaşlara teşekkür ederim

M_B

@Mucit23 hocam ;
Renk işi RGB sıralamasından kaynaklanıyordur. Oda gene init kısmından ayarlanıyor.
Datasheette Page 38 olsa gerek ordan bakarak duzenleme yapabilirsin.
Benimde başıma gelmişti. ;) Doğru yoldasınız.

Kolay gelsin.


Yardımcı olabildiysem/sek ne mutlu bize.


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

Mucit23

Merhaba Arkadaşlar

Şuanda stm3240f_lcd.c dosyasında ssd1289 için hazırlanmış olan Text Basma Rutinlerini SSD1963 Kütüphaneme adapte etmeye çalışıyorum. Aslında Bu kütüphanenin tümünü SSD1963'de çalışacak şekilde ayarladığımı söylesem daha yerinde olur.

Normalde SSD1289 için GRAM X ve Y Counterleri Vardır. Bu Counterleri Bir kere ayarladığınız zaman RAM Her yazışınızda Bu counter değerleri artarak sonraki kordinata gelinmiş olur. Yanlışım yoksa böyle olması gerekiyordu.

Orjinal Kütüphanede Bu iş için  aşağıdaki fonksiyon var

void LCD_SetCursor(uint8_t Xpos, uint16_t Ypos)
{
  LCD_WriteReg(0x004E, Xpos);
  LCD_WriteReg(0x004F, Ypos);
}


0x4E ve 0x4F GRAM Counter Adresleri oluyor.

Bu işlemin Aynısının SSD1963de nasıl yapacağımı çözemedim. Ben karakterin basılacağı noktaya LCD_SetDisplayWindow fonksiyonu ile karakter boyutunda pencere açayıp dedim ama olmadı. İşlemci Fonksiyonda takılıp kalıyor şuanda. Peşi Sıra data göndermeyi Çözmem lazım. Yoksa başka bir yöntem bulmam gerekecek.

Şuanda text basma fonksiyonuyla uğraşıyorum. SSD1289 programında Text Basmak için şu 3 Fonksiyon kullanılıyor.
void LCD_DrawChar(uint8_t Xpos, uint16_t Ypos, const uint16_t *c)
{
  uint32_t index = 0, i = 0;
  uint8_t  Xaddress = 0;
  Xaddress = Xpos;
  
    
  //GPIO_ResetBits(GPIOD, GPIO_Pin_11);
  LCD_SetCursor(Xaddress, Ypos);
  
  for(index = 0; index < LCD_Currentfonts->Height; index++)
  {
    LCD_WriteRAM_Prepare(); /* Prepare to write GRAM */
	
  	 //GPIO_SetBits(GPIOD, GPIO_Pin_11);
    for(i = 0; i < LCD_Currentfonts->Width; i++)
    {
  
      if((((c[index] & ((0x80 << ((LCD_Currentfonts->Width / 12 ) * 8 ) ) >> i)) == 0x00) &&(LCD_Currentfonts->Width <= 12))||
        (((c[index] & (0x1 << i)) == 0x00)&&(LCD_Currentfonts->Width > 12 )))

      {
        LCD_WriteRAM(BackColor);
      }
      else
      {
        LCD_WriteRAM(TextColor);
      } 
    }
    Xaddress++;
	//if(index!=LCD_Currentfonts->Height-1&&i!=LCD_Currentfonts->Width-1)
    LCD_SetCursor(Xaddress, Ypos);
  }
}


void LCD_DisplayChar(uint8_t Line, uint16_t Column, uint8_t Ascii)
{
  Ascii -= 32;
  LCD_DrawChar(Line, Column, &LCD_Currentfonts->table[Ascii * LCD_Currentfonts->Height]);
}

void LCD_DisplayStringLine(uint8_t Line, uint8_t *ptr)
{
  uint16_t refcolumn = LCD_PIXEL_WIDTH - 1;

  /* Send the string character by character on lCD */
  while ((*ptr != 0) & (((refcolumn + 1) & 0xFFFF) >= LCD_Currentfonts->Width))
  {
    /* Display one character on LCD */
    LCD_DisplayChar(Line, refcolumn, *ptr);
    /* Decrement the column position by 16 */
    refcolumn -= LCD_Currentfonts->Width;
    /* Point on the next character */
    ptr++;
  }
}

Bu kodları ssd1963 driverine bu şekilde geçirdim.
void LCD_DrawChar(uint8_t Xpos, uint16_t Ypos, const uint16_t *c)
{
  uint32_t index = 0, i = 0;
  
  LCD_SetDisplayWindow(Xpos, Ypos, Xpos+(LCD_Currentfonts->Width-1), Ypos+(LCD_Currentfonts->Height-1));
  
  for(index = 0; index < LCD_Currentfonts->Height; index++)
  {
		
    for(i = 0; i < LCD_Currentfonts->Width; i++)
    {
  
      if((((c[index] & ((0x80 << ((LCD_Currentfonts->Width / 12 ) * 8 ) ) >> i)) == 0x00) &&(LCD_Currentfonts->Width <= 12))||
        (((c[index] & (0x1 << i)) == 0x00)&&(LCD_Currentfonts->Width > 12 )))

      {
        LCD_WriteData(BackColor);
      }
      else
      {
        LCD_WriteData(TextColor);
      } 
    }
  }
}

void LCD_DisplayChar(uint8_t Line, uint16_t Column, uint8_t Ascii)
{
  Ascii -= 32;
  LCD_DrawChar(Line, Column, &LCD_Currentfonts->table[Ascii * LCD_Currentfonts->Height]);
}

void LCD_DisplayStringLine(uint8_t Line, uint8_t *ptr)
{
  uint16_t refcolumn = LCD_PIXEL_WIDTH - 1;

  /* Send the string character by character on lCD */
  while ((*ptr != 0) & (((refcolumn + 1) & 0xFFFF) >= LCD_Currentfonts->Width))
  {
    /* Display one character on LCD */
    LCD_DisplayChar(Line, refcolumn, *ptr);
    /* Decrement the column position by 16 */
    refcolumn -= LCD_Currentfonts->Width;
    /* Point on the next character */
    ptr++;
  }
	
}


Fark LCD_DrawChar Fonksiyonunda. Zaten özellikle burada sıkıntı çekiyorum.
Bu konuda ne yapabilirim. Fikri olan varmı?

tekosis

maşallah güzel gidiyor çalışmalarınız kısmetse yakında ben de tft ile çalışmaya başlayacağım. bu arada hangi derleyiciyi kullanıyorsunuz acaba? anlayamadım da.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

Mucit23

#28
Text Fonksiyonları beni bayağı uğraştıracak anlaşılan.   :o

Edit: Text basma İşini Çözmek üzereyim.Bunun dışında bir sorun var. LCD çok hassas. Mesela Ekrana beyaz renkte bir harf basayım LCD donuyor ve yavaşça ekran beyazlamaya başlıyor. Birtek beyaz değil. Başka renklerdede böyle yapıyor. Bu acaba SSD1963 init ayarlarıylamı ilgilidir. Anlam veremedim? Normalde Yeşil Kırmızı veya mavi düzgün çıkıyor. Diğer renkler ise problemli

yamak

Alıntı yapılan: Mucit23 - 04 Aralık 2013, 10:35:27
Text Fonksiyonları beni bayağı uğraştıracak anlaşılan.   :o

Edit: Text basma İşini Çözmek üzereyim.Bunun dışında bir sorun var. LCD çok hassas. Mesela Ekrana beyaz renkte bir harf basayım LCD donuyor ve yavaşça ekran beyazlamaya başlıyor. Birtek beyaz değil. Başka renklerdede böyle yapıyor. Bu acaba SSD1963 init ayarlarıylamı ilgilidir. Anlam veremedim? Normalde Yeşil Kırmızı veya mavi düzgün çıkıyor. Diğer renkler ise problemli
Hocam neden emwin kullanmıyorsunuz?