SSD1289 GDDRAM Counter Sorunu

Başlatan Mucit23, 06 Aralık 2015, 11:36:53

Mucit23

Selamlar,

SSD1289 GDDRAM counteri x ekseninde otomatik arttırmasını nasıl yaparım?

Şöyle anlatayım. Ben ekranı yatay kullanmak istiyorum. Yani ekranın sol üst köşesi 0,0 noktası, Sağ üst köşesi 319,0 noktası sağ alt köşesi ise 319,239 noktası olacak

Ekrana 20x20 boyutunda bir pencere açıyorum.

LCD_WindowMax(0,0,20,20);
Bundan sonra kursörü 0,0 noktasına alıyorum.
LCD_SetCursor(0,0);
Bundan sonra sürekli veri göndereceğimi belirtim döngü içerisinde renk datası gönderiyorum.

        wr_cmd(0x22);   

   for(i=0;i<20*20;i++)
   {
      wr_dat(TextColor);
       delay(5);
   }

Döngüyü yavaşlatmak için gecikme koydum. Ekranı incelediğimde GGDRAM adres sayacının Y eksenine doğru arttığını görüyorum.
Yani sırasıyla ilk başta birinci sütün yukarıdan aşağı dolduruluyor, Sonra ikinci sütün yukarıdan aşağı dolduruluyor. Sonra 3 vs derken açtığım pencere doldurulmuş oluyor.

Ben bu işlemi yatay olarak yapmak istiyorum. Yani ilk önce birinci satır baştan sona doldurulacak sonra alt satıra geçecek. Adres sayacının Y ekseninde değilde öncelikli olarak X ekseninde artması lazım.

Bu nasıl yapılır? Hangi ayarları değiştirmem lazım datashete bakıyorum o kısmı anlayamadım.



serdararikan


Mucit23

Evet sanırım tarama yönüyle ilgili bir problem var. Sorunu çözdüm gibi. Son olarak başka bir problem var.

SSD1289'dan veri okumam lazım. Yani Gram'dan pixel datasını okumak istiyorum. Bunun için GetPixel gibi fonksiyonlar var kütüphanelerde ama çalıştıramadım.

STM32 için low level haberleşme fonksiyonlarım aşağıdaki gibi.

/*******************************************************************************
* Write data to LCD controller                                                 *
*   Parameter:    c:      data to be written                                   *
*   Return:                                                                    *
*******************************************************************************/

__inline void wr_dat (unsigned short c) {

	Set_Rs;
	Set_nRd;
  	GPIOE->ODR = c;
	Clr_nWr;
	Set_nWr;
}

/*******************************************************************************
* Write command to LCD controller                                              *
*   Parameter:    c:      command to be written                                *
*   Return:                                                                    *
*******************************************************************************/

__inline void wr_cmd (unsigned char c) {

	Clr_Rs;
	Set_nRd;
	GPIOE->ODR = c;
	Clr_nWr;
	Set_nWr;
}

/*******************************************************************************
* Read data from LCD controller                                                *
*   Parameter:                                                                 *
*   Return:               read data                                            *
*******************************************************************************/

__inline unsigned short rd_dat (void) {
  unsigned short val = 0;

	Set_Rs;
	Set_nWr;
	Clr_nRd;
  GPIOE->CRH = 0x44444444;
	GPIOE->CRL = 0x44444444;
	val = GPIOE->IDR;
	val = GPIOE->IDR;
	GPIOE->CRH = 0x33333333;
	GPIOE->CRL = 0x33333333;
	Set_nRd;
	return val;
}

/*******************************************************************************
* Write to LCD register                                                        *
*   Parameter:    reg:    register to be read                                  *
*                 val:    value to write to register                           *
*******************************************************************************/

__inline void wr_reg (unsigned char reg, unsigned short val) {

  	Clr_Cs;
	wr_cmd(reg);      
	wr_dat(val);    
	Set_Cs; 
}


/*******************************************************************************
* Read from LCD register                                                       *
*   Parameter:    reg:    register to be read                                  *
*   Return:               value read from register                             *
*******************************************************************************/

unsigned short rd_reg (unsigned short reg) {

  Clr_Cs;
	wr_cmd(reg);     
	reg = rd_dat();      	
	Set_Cs;
	return reg;
}


Pixel okuması yapmak için aşağıdaki fonksiyonu kullanıyorum.

uint16_t LCD_GetPixel(unsigned int x, unsigned int y)
{
  LCD_SetCursor(x, y);
  return rd_dat();
}
 
İlk önce kordinatları verip ardından okuma yapıyorum. Fakat olması gerekenden renk dataları geliyor.

Okuma işleminin doğruluğunu anlamak için rd_reg fonksiyonu ile register okuması yapayım dedim oda düzgün çalışmadı. Mesela LCD_init işlemi sırasında 0x0001 adresine 0x293F yazıyorum ama aynı adresi okurken 0x8989 okuyorum. Başka registerlar'da da denedim hep aynı değer geliyor.

Acaba kullandığım kodlarmı yanlış. Elinizde çalışan kod var mı?

Mucit23