STM32F407 ile 7" TFT 800x480 SSD1963 Sürme

Başlatan M_B, 27 Mart 2013, 11:30:06

respected

(SSD1963 XPT2046)
M_B hocam sizin kodlar üzerine touch eklemeye çalıştım. IRQ  pinin A15 ayarladığım da ekranın herhangi bir yerine dokunsam da tepki veriyor. Kaanx hocam epeyce fikir verdi ama bir türlü beceremedim. Acaba yanlış bir ayar mı yapıyorum? Proje dosyasını aşağıdaki linke koydum. Rica etsem bakabilir misiniz?

http://rapidshare.com/files/3631787352/ResimBasma.rar

M_B

Merhaba bu aralar yogunum kitle ilgilenemiyorum.
Onumuzdeki günlerde  calısan kod koyacam.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

matador

Türkiyede bu lcd'yi alabileceğim bir yer var mı?

respected

Karaköyde epeyce gezdim bulamadım. Çin'den getirttim.

OptimusPrime

stellarisware içerisinde açık kaynak kodlu lcd sürücü kütüphanesi ve grafik kütüphanesi mevcut.
ssd1993 ile gerçekleştirilmiş fakat kolayca kodlar ssd1963 e çevrilebiliyor. stellarisware ile gelen çeşitli toollar sayesinde resmi sıkıştırarak koda eklemekte mümkün. açık kaynak kodlu olduğu için kolayca stm32 için uyarlanabilir diye düşünüyorum.

https://www.picproje.org/index.php/topic,34330.0.html
ti cortex m3 ü için yukarıdaki linkte konuyla ilgili muhabbet etmiştik.

lcd içinse özdisana telefon edin derim...
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

8051-ARM

Merhaba arkadaşlar aranıza yeni katıldım bugüne kadar 8051 tabanlı işlemcilerle çalıştım çizgi elektronikten stm32f4-discovery kit ve 5.7 " tft lcd ssd1963  sürücü ile arm ye merhaba dedim FSMC kullanmadan tft sürüp resim bastırmayı başardım fakat projemde 2 adet 320x240  resim var resimler arası geçiş çok yavaş oluyor kodlarda gördüğünüz beklemeleri yapmazsam lcd çalışmıyor FSMC ile bu sorunu aşabilir miyim yardımlarınızı bekliyorum .

#include <stm32f4xx.h>

extern u8 resim1[];
extern u8 resim2[];

void SystemInit()
{
		unsigned int i;

    (*((int*)0xE000ED88))|=0x0F00000;  
    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin        
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000001F;    // GPIO A,B,C,D clock'u aktif edelim 
    GPIOD->MODER = 0x55001155;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
    GPIOD->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 		
		
		GPIOE->MODER = 0x00005555;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi 
    GPIOE->OTYPER= 0x00005555;
		GPIOE->OSPEEDR= 0xFFFFFFFF;   // GPIOD nin tum cikislari en yuksek hizda kullanacagiz 
		GPIOE->PUPDR= 0x00005555;
		GPIOE->PUPDR= 0x00005555;
} 


void Delay()
{
unsigned int i;

    for(i=0;i<0x800000;i++); 
}
void delay_ms(unsigned long Bekle)
{
    Bekle = Bekle * 42008;
    while(Bekle>0){Bekle--;}
} 
void delay_us(unsigned long Bekle)
{
    Bekle = Bekle * 42;	
    while(Bekle>0){Bekle--;}
}
void delay_uss(unsigned long Bekle)
{
    Bekle = Bekle * 14;	
    while(Bekle>0){Bekle--;}
}
void lcd_data(unsigned char data)
{  
			unsigned int i;
			GPIOE->ODR = data;
			//delay_uss(1);
			for(i=0;i<0x10;i++);
			GPIOD->BSRRH=0x0010; // PD4 RESET LCD_WR
			for(i=0;i<0x20;i++);
			//delay_uss(2);
			GPIOD->BSRRL=0x0010; // PD4	SET LCD_WR
			//delay_uss(1);
}
void lcd_cmd(unsigned char cmd)
{
			unsigned int i;
			GPIOD->BSRRH=0x0004; // PD2 RESET LCD_RS
			//delay_uss(1);
			for(i=0;i<0x10;i++);
			GPIOE->ODR = cmd;
			for(i=0;i<0x8;i++);
			//delay_uss(1);
			GPIOD->BSRRH=0x0010; // PD4 RESET LCD_WR
			for(i=0;i<0x20;i++);
			//delay_uss(2);
			GPIOD->BSRRL=0x0010; // PD4	SET LCD_WR
			//delay_uss(1);
			GPIOD->BSRRL=0x0004; // PD2 SET LCD_RS
	    //delay_uss(1);
}
void lcd_clr()
{
 unsigned long y ;
	
			lcd_cmd(0x2A);
			lcd_data(0x0);
			lcd_data(0x0);
			lcd_data(0x1);
			lcd_data(0x3F);
			
			lcd_cmd(0x2B);
			lcd_data(0x0);
			lcd_data(0x0);
			lcd_data(0x0);
			lcd_data(0xEF);
		
			lcd_cmd(0x2C);


			for(y=0;y<76800;y++)	    
		
		{
			lcd_data(0x00);
			lcd_data(0x00);
			lcd_data(0x00);
		}
}

 void resim_bas(const uint8_t * bmp_)
{       
  volatile uint32_t index;
  uint8_t *bmp =  (uint8_t*)bmp_;
   
	    lcd_cmd(0x2A);
			lcd_data(0x0);
			lcd_data(0x0);
			lcd_data(0x1);
			lcd_data(0x3f);
			
			lcd_cmd(0x2B);
			lcd_data(0x0);
			lcd_data(0x0);
			lcd_data(0x0);
			lcd_data(0xef);
			
			lcd_cmd(0x2C);	

	for(index = 0; index < 230400; index++)
  		{
		lcd_data(*bmp++);
  		}
}
void lcd_init(void)	
{
			GPIOE->ODR= 0xFF;  // 
			GPIOD->BSRRL= 0x7E; // PD0 //GPIOD->BSRRL= 0x3E; // PD0
			delay_ms(100);
      GPIOD->BSRRH=0x0008; // PD3 RESET LCD_RST
      delay_ms(100);
      GPIOD->BSRRL=0x0008; // PD3 SET LCD_RST
			delay_ms(120);

      GPIOD->BSRRH=0x0002; // PD1 RESET LCD_CS
      
			lcd_cmd(0x1);
	    delay_ms(5);
	
			lcd_cmd(0xE0);
			lcd_data(0x1);
			delay_ms(120);
			lcd_cmd(0xE0);
			lcd_data(0x3);
	
      lcd_cmd(0xB0);
			lcd_data(0xc);
			lcd_data(0x0);
			lcd_data(0x1);
			lcd_data(0x3F);
			lcd_data(0x0);
			lcd_data(0xEF);
	    lcd_data(0x0);

      lcd_cmd(0x36);
			lcd_data(0x0);
			
			lcd_cmd(0xF0);
			lcd_data(0x0);
			
			lcd_cmd(0x3A);
			lcd_data(0x60);


	
      lcd_cmd(0xE2);
			lcd_data(0x22);
			lcd_data(0x3);
			lcd_data(0x4);			

			lcd_cmd(0xE6);
			lcd_data(0x00);
			lcd_data(0xEA);
			lcd_data(0xEC);
			
			lcd_cmd(0xB4);
			lcd_data(0x1);
			lcd_data(0xB8);
			lcd_data(0x0);
			lcd_data(0x44);
			lcd_data(0xF);
			lcd_data(0x0);
	    lcd_data(0x0);
			lcd_data(0x0);
			
			lcd_cmd(0xB6);
			lcd_data(0x1);
			lcd_data(0x8);
			lcd_data(0x0);
			lcd_data(0x12);
			lcd_data(0x7);
			lcd_data(0x0);
	    lcd_data(0x0);
			
			lcd_cmd(0x2A);
			lcd_data(0x0);
			lcd_data(0x0);
			lcd_data(0x1);
			lcd_data(0x3F);
			
			lcd_cmd(0x2B);
			lcd_data(0x0);
			lcd_data(0x0);
			lcd_data(0x0);
			lcd_data(0xEF);
					
			lcd_cmd(0x13);
			lcd_cmd(0x29);
      lcd_clr()  ;

			GPIOD->BSRRL=0x0001; // PD0	SET LCD_BCK_L
}			     

int main()
{	
	    lcd_init();
	
	while(1)
{
	    unsigned long x ;		

      resim_bas(resim1);
	    GPIOD->BSRRL=0x1000;
			delay_ms(5000);
	    resim_bas(resim2);
	    GPIOD->BSRRH=0x1000;
			delay_ms(5000);
 
}		   
}

z

R/W, CS, Enb gibi pinler barindiran harici cihazlara erisirken cihazin dokumaninda zamanlama tablolarinda belirtilen min-max surelere harfiyen uymak gerekiyor.

Bu degerlere sadik kalarak sinyaller uretiyor olsan da eger MCU ile harici cihaz arasindaki kablo uygun sekilde sonlandirilmamissa yansima olaylari sonucu harici cihaza ulasan sinyallerin dalga sekli MCUda uretildigi sekilden cok farkli sekle donusebilir ve kritik zamanlama degerlerinden farkli sinyaller olusabilir. Bu yuzden baglantilari olabildigince kisa tutmakta fayda var.

Ote yandan yaziliminizda for(i=0;i<.....) seklinde soft gecikme rutinleri optimizasyon nedeniyle hic isleme alinmayabilir ve bunu telefi etmek adina daha baska satirlarda  ekstra buyuk gecikmeler veriyor olabilirsiniz.

Eger iyi bir scopunuz varsa;

Sinyal isimlerini atiyorum

CS yi aktif edin
ardindan R/W i aktif edin.

Scop ile LCD pinlerinde CS ve R/W sinyallerini gozleyin. Ardindan katalogdaki zamanlama degerlerine sadik kalarak CS ve R/W arasinda gecikme saglayacak sayma degerini deneysel olarak tespit edin ve bu degere bir miktar daha pay ekleyin.

Ardindan ayni islemi CS ve data sinyalleri icin deneyerek datalarin ne kadar gecikme ile yola cikacagini tespit edin.

Bir de for tipi soft gecikme rutinlerinde for'a ait degisken tanimina volatile ekini getirin. Optimizasyonu da hiz acisindan en iyi degere ayarlayin.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

pisayisi

FSMC modülünü kullanarak olabilcek en yüksek hızda LCD yi sürebilirsiniz. FSMC konfigürasyon ayarlarındaki aşağıdaki ilk üç değişkenle oynayarak em uygun hızı yakalayabilirsiniz. Çok düşük seçilen değerler LCD de genelde karlanma türü bozuk bir görüntü üretir. Z hocamın önerdiği bilgiler ise LCD nizin çalışabilceği minimum gecikme değerlerini koda eklemek için ideal olabilir. Ben fsmc ayarlarında birkaç deneme yanılma ile en uygun ayarın yakalanabilceğini düşünüyorum...

/* FSMC_Bank1_NORSRAM4 configuration */
  Timing_read.FSMC_AddressSetupTime = 0x9;
  Timing_read.FSMC_AddressHoldTime = 0;  
  Timing_read.FSMC_DataSetupTime = 0x8; 
  Timing_read.FSMC_BusTurnAroundDuration = 0;
  Timing_read.FSMC_CLKDivision = 0;
  Timing_read.FSMC_DataLatency = 0;
  Timing_read.FSMC_AccessMode = FSMC_AccessMode_B;   
Murat

8051-ARM

#68
Alıntı yapılan: z - 17 Eylül 2013, 08:28:24
R/W, CS, Enb gibi pinler barindiran harici cihazlara erisirken cihazin dokumaninda zamanlama tablolarinda belirtilen min-max surelere harfiyen uymak gerekiyor.

Bu degerlere sadik kalarak sinyaller uretiyor olsan da eger MCU ile harici cihaz arasindaki kablo uygun sekilde sonlandirilmamissa yansima olaylari sonucu harici cihaza ulasan sinyallerin dalga sekli MCUda uretildigi sekilden cok farkli sekle donusebilir ve kritik zamanlama degerlerinden farkli sinyaller olusabilir. Bu yuzden baglantilari olabildigince kisa tutmakta fayda var.

Ote yandan yaziliminizda for(i=0;i<.....) seklinde soft gecikme rutinleri optimizasyon nedeniyle hic isleme alinmayabilir ve bunu telefi etmek adina daha baska satirlarda  ekstra buyuk gecikmeler veriyor olabilirsiniz.

Eger iyi bir scopunuz varsa;

Sinyal isimlerini atiyorum

CS yi aktif edin
ardindan R/W i aktif edin.

Scop ile LCD pinlerinde CS ve R/W sinyallerini gozleyin. Ardindan katalogdaki zamanlama degerlerine sadik kalarak CS ve R/W arasinda gecikme saglayacak sayma degerini deneysel olarak tespit edin ve bu degere bir miktar daha pay ekleyin.

Ardindan ayni islemi CS ve data sinyalleri icin deneyerek datalarin ne kadar gecikme ile yola cikacagini tespit edin.

Bir de for tipi soft gecikme rutinlerinde for'a ait degisken tanimina volatile ekini getirin. Optimizasyonu da hiz acisindan en iyi degere ayarlayin.

Öncelikle cevabınız ve tavsiyeleriniz için teşekkürler zamanlamalara uyuyordum ama bir türlü olmuyordu hatamı da buldum şu kod yüzünden sorun çıkıyormuş  fsmc kullanmadan hızlı bir şekilde tft ekrarı sürüyorum artık .

hatalı kodum: GPIOE->OTYPER= 0x00005555;

Alıntı yapılan: pisayisi - 17 Eylül 2013, 10:45:45
FSMC modülünü kullanarak olabilcek en yüksek hızda LCD yi sürebilirsiniz. FSMC konfigürasyon ayarlarındaki aşağıdaki ilk üç değişkenle oynayarak em uygun hızı yakalayabilirsiniz. Çok düşük seçilen değerler LCD de genelde karlanma türü bozuk bir görüntü üretir. Z hocamın önerdiği bilgiler ise LCD nizin çalışabilceği minimum gecikme değerlerini koda eklemek için ideal olabilir. Ben fsmc ayarlarında birkaç deneme yanılma ile en uygun ayarın yakalanabilceğini düşünüyorum...

/* FSMC_Bank1_NORSRAM4 configuration */
  Timing_read.FSMC_AddressSetupTime = 0x9;
  Timing_read.FSMC_AddressHoldTime = 0;  
  Timing_read.FSMC_DataSetupTime = 0x8; 
  Timing_read.FSMC_BusTurnAroundDuration = 0;
  Timing_read.FSMC_CLKDivision = 0;
  Timing_read.FSMC_DataLatency = 0;
  Timing_read.FSMC_AccessMode = FSMC_AccessMode_B;   


Fsmc yi denedim ama bazı hatalar aldım eksik kütüphane var herhalde vakit bulunca tekrar deneyeceyim fsmc için kullanılması gereken kütüphaneleri nelerdir belirtirseniz sevinirim.

Arm için çok geç kalmışım 8051 ve asm denden sonra hem c hemde Arm biraz zor geliyor ama yılmak yok  Allah'ın izni ve sizlerin yardımı ile inşallah başaraçağım .

8051-ARM

Alıntı yapılan: z - 17 Eylül 2013, 08:28:24
R/W, CS, Enb gibi pinler barindiran harici cihazlara erisirken cihazin dokumaninda zamanlama tablolarinda belirtilen min-max surelere harfiyen uymak gerekiyor.

Bu degerlere sadik kalarak sinyaller uretiyor olsan da eger MCU ile harici cihaz arasindaki kablo uygun sekilde sonlandirilmamissa yansima olaylari sonucu harici cihaza ulasan sinyallerin dalga sekli MCUda uretildigi sekilden cok farkli sekle donusebilir ve kritik zamanlama degerlerinden farkli sinyaller olusabilir. Bu yuzden baglantilari olabildigince kisa tutmakta fayda var.

Ote yandan yaziliminizda for(i=0;i<.....) seklinde soft gecikme rutinleri optimizasyon nedeniyle hic isleme alinmayabilir ve bunu telefi etmek adina daha baska satirlarda  ekstra buyuk gecikmeler veriyor olabilirsiniz.

Eger iyi bir scopunuz varsa;

Sinyal isimlerini atiyorum

CS yi aktif edin
ardindan R/W i aktif edin.

Scop ile LCD pinlerinde CS ve R/W sinyallerini gozleyin. Ardindan katalogdaki zamanlama degerlerine sadik kalarak CS ve R/W arasinda gecikme saglayacak sayma degerini deneysel olarak tespit edin ve bu degere bir miktar daha pay ekleyin.

Ardindan ayni islemi CS ve data sinyalleri icin deneyerek datalarin ne kadar gecikme ile yola cikacagini tespit edin.

Bir de for tipi soft gecikme rutinlerinde for'a ait degisken tanimina volatile ekini getirin. Optimizasyonu da hiz acisindan en iyi degere ayarlayin.

Öncelikle cevabınız ve tavsiyeleriniz için teşekkürler zamanlamalara uyuyordum ama bir türlü olmuyordu hatamı da buldum şu kod yüzünden sorun çıkıyormuş  fsmc kullanmadan hızlı bir şekilde tft ekrarı sürüyorum artık .

hatalı kodum: GPIOE->OTYPER= 0x00005555;

Alıntı yapılan: pisayisi - 17 Eylül 2013, 10:45:45
FSMC modülünü kullanarak olabilcek en yüksek hızda LCD yi sürebilirsiniz. FSMC konfigürasyon ayarlarındaki aşağıdaki ilk üç değişkenle oynayarak em uygun hızı yakalayabilirsiniz. Çok düşük seçilen değerler LCD de genelde karlanma türü bozuk bir görüntü üretir. Z hocamın önerdiği bilgiler ise LCD nizin çalışabilceği minimum gecikme değerlerini koda eklemek için ideal olabilir. Ben fsmc ayarlarında birkaç deneme yanılma ile en uygun ayarın yakalanabilceğini düşünüyorum...

/* FSMC_Bank1_NORSRAM4 configuration */
  Timing_read.FSMC_AddressSetupTime = 0x9;
  Timing_read.FSMC_AddressHoldTime = 0;  
  Timing_read.FSMC_DataSetupTime = 0x8; 
  Timing_read.FSMC_BusTurnAroundDuration = 0;
  Timing_read.FSMC_CLKDivision = 0;
  Timing_read.FSMC_DataLatency = 0;
  Timing_read.FSMC_AccessMode = FSMC_AccessMode_B;   


Fsmc yi denedim ama bazı hatalar aldım eksik kütüphane var herhalde vakit bulunca tekrar deneyeceyim fsmc için kullanılması gereken kütüphaneleri nelerdir belirtirseniz sevinirim.

Arm için çok geç kalmışım 8051 ve asm denden sonra hem c hemde Arm biraz zor geliyor ama yılmak yok  Allah'ın izni ve sizlerin yardımı inşallah başaraçağım .

Mnemonic

Alıntı yapılan: respected - 28 Mayıs 2013, 15:54:13
(SSD1963 XPT2046)
M_B hocam sizin kodlar üzerine touch eklemeye çalıştım. IRQ  pinin A15 ayarladığım da ekranın herhangi bir yerine dokunsam da tepki veriyor. Kaanx hocam epeyce fikir verdi ama bir türlü beceremedim. Acaba yanlış bir ayar mı yapıyorum? Proje dosyasını aşağıdaki linke koydum. Rica etsem bakabilir misiniz?

http://rapidshare.com/files/3631787352/ResimBasma.rar


respected hocam selamlar,
bu mesajınızda yazdığınız dosyaya erişemiyorum. sakıncası yoksa yeniden yükleyebilirmisiniz bende xpt ile çalışacağım bir incelemek düzeltmek isterim

Mnemonic

Arkadaşlar GCC için uygun(bulduğum hepsi keil uyumluydu sıkıntı yaşadım) stm32f4 için ssd1963 driveri varmı ?
günlerdir sorunsuz derlenen bir kod bulamadım

respected

@Mnemonic
Kusura bakmayın mesajınızı fark etmedim.  pm yazsaydınız keşke kodları yeniden upload ederdim. Sanırım silinmiş.
M_B hocamın kodları.. Ben bu kodlarla lcd yi çalıştırdım.

http://rapidshare.com/share/4D586F2339E197C4AEAA41A3968E2F68

Mnemonic

Cevabınız için çok teşekkür ederim.
ancak yazmış olduğum bir kaç mesaja cevap gelmeyince bir kaç gün uğraşarak çalıştırmayı başarmıştım
şu anda da xpt2046 ile uğraşıyorum

Mucit23

@M_B

Hocam Merhaba

STM32F407 de Verdiğiniz ssd1963 kütüphanesini kullanarak 4.3" TFT süreceğim. Kütüphaneyi Keilde derlemeye çalıştığım zaman Birkaç Hata alıyorum.

Build target 'Target 1'
compiling fonts.c...
compiling ssd1963.c...
linking...
.\Output\Discovery.axf: Error: L6218E: Undefined symbol ASCII12x12_Table (referred from fonts.o).
.\Output\Discovery.axf: Error: L6218E: Undefined symbol ASCII16x24_Table (referred from fonts.o).
.\Output\Discovery.axf: Error: L6218E: Undefined symbol ASCII8x12_Table (referred from fonts.o).
.\Output\Discovery.axf: Error: L6218E: Undefined symbol ASCII8x8_Table (referred from fonts.o).
".\Output\Discovery.axf" - 4 Errors, 0 Warning(s).
Target not created


Sebebi hatada bahsedilen font dosyalarının bulunmaması. ssd1963.c içerisindede 12x12 font kullanılıyor sanırım. Bu yüzden hata alıyorum.

Ben fonts.h içerisinde aşağıdaki tanımlamaları yaptım.

extern const uint16_t ASCII8x8_Table[];
extern const uint16_t ASCII8x12_Table[];
extern const uint16_t ASCII16x8_Table[];
extern const uint16_t ASCII16x24_Table[];
extern const uint16_t ASCII12x12_Table[];


Bunların bazıları hiç yoktu ben ekledim.

fonts.c içerisinde ise sadece 16x8 in data tablosu var.

const uint16_t ASCII16x8_Table [] = {
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x18,0x18,0x00,0x00,
0x00,0x48...........


Diğerleri Yok. Bunlar sizde bulunuyormu? Siz verdiğiniz halde nasıl derliyordunuz?