Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

TFT Kontroller Hk.

Başlatan kartal0689, 31 Ağustos 2015, 10:05:52

kartal0689

Arkadaşlar Merhaba,

Öncelikle herkese iyi çalışmalar dilerim. Sormak istediğim bir konu var.
SSD1963 kontrollü 7'' TFT ekranı dsPIC33FJ256GP710 işlemcisi ile 120Mhz de kontrol ediyorum.
Fakat ekran yinelemelerinde, örneğin ekranda bir sayıcı var 0-9 arası. Bu sayıcıda karakterler değişirken üzerine yazıyor yani 1 in üzerini silmeden 2 yi yazıyor.
İşte bu durumda ben her yeni veriyi yazmadan önce yazılacak yerin arka plan rengiyle aynı renke boyayıp yeni veriyi yazıyorum. Bu sayede eski değer üzerine yazmamış oluyor.
Ancak 7'' gibi büyük ekranda bu arka plana boyarken(büyük fontlu karakterler için örn:36punto) gözle görebiliyorum. Oysaki bu ekranlarda video grafik v.b oynatabiliyorlar.
Bunun önüne nasıl geçebilirim. Neler kullanabilirim. Bu konuyla ilgili arkadaşlar rica etsem tecrübelerini aktarabilirler mi? Bu arada bende MikroPascal dsPIC derleyicisini kullanıyorum.

kimlenbu

Bu ekranı sürdün ama nasıl sürdün ? Data hattın kaç bit ? Bağlantı şeman nerde, kodların nerde ?

kartal0689

Ekli Resimlerde İşlemci ve TFT ekran bağlantısı var. TFT bit olarak kontrol ediliyor. Touch şu anda aktif değildir. Kodlar ve TFT Library aşağıdadır.

TFT Init Code
procedure TFT_Init_SSD1963_Custom(display_width : word; display_height : word);
begin
  if (Is_TFT_Set() <> 1) then
    begin
      TFT_Set_Index_Ptr := @TFT_Set_Index;
      TFT_Write_Command_Ptr := @TFT_Write_Command;
      TFT_Write_Data_Ptr := @TFT_16bit_Write_Data;
    end;

  TFT_DISP_WIDTH := display_width;
  TFT_DISP_HEIGHT := display_height;
  if (display_width >= display_height) then
    TFT_Disp_Rotation := 0
  else
    TFT_Disp_Rotation := 90;

  TFT_Set_Pen(CL_BLACK, 1);
  TFT_Set_Brush(0, 0, 0, 0, 0, 0);

  TFT_Move_Cursor(0, 0);
  TFT_Clear_Fonts();
  // Reset device
  TFT_Reset_SSD1963();
  TFT_SSD1963_Set_Address_Ptr := @TFT_Set_Address_SSD1963II;
end;


TFT Code
procedure TFT_Reset_SSD1963();
begin
  // Hold in reset
  TFT_RST := 0;
  // Set reset pin as output
  TFT_RST_Direction := 0;

  // Enable data access
  TFT_RS := 1;
  // Set RS pin as output
  TFT_RS_Direction := 0;

  // Disable LCD
  TFT_CS := 1;
  // Set LCD CS pin as output
  TFT_CS_Direction := 0;

  TFT_RD_Direction := 0;
  TFT_WR_Direction := 0;
  TFT_RD := 1;
  TFT_WR := 1;

  Delay_100ms();
  TFT_RST := 1;
  Delay_100ms();
  Delay_100ms();

  TFT_CS := 0;
  TFT_Set_Index_Ptr(0x01);     //Software Reset
  TFT_Set_Index_Ptr(0x01);
  TFT_Set_Index_Ptr(0x01);

  TFT_Set_Index_Ptr(0xE2);
  TFT_Write_Command_Ptr(0x21);    // PLLclk = REFclk * 36 (360MHz)  35
  TFT_Write_Command_Ptr(0x02);     // SYSclk = PLLclk / 3  (120MHz)
  TFT_Write_Command_Ptr(0x54);  // validate M and N
  Delay_ms(100);

  // SSD1963 needed to switch to PLL output as system clock after PLL is locked. The following is the program sequence.
  // WRITE COMMAND "0xE0"
  // WRITE DATA "0x01"
  TFT_Set_Index_Ptr(0xe0);
  TFT_Write_Command_Ptr(0x01); // START PLL
  // Wait 100us to let the PLL stable
  Delay_50us(); Delay_50us();
  // WRITE DATA "0x03"
  TFT_Set_Index_Ptr(0xe0);
  TFT_Write_Command_Ptr(0x03); // LOCK PLL

  TFT_Set_Index_Ptr(0xB0);          //SET LCD MODE  SET TFT 18Bits MODE
  TFT_Write_Command_Ptr(0x20);      //SET TFT MODE & hsync+Vsync+DEN MODE
  TFT_Write_Command_Ptr(0x00);      //SET TFT MODE & hsync+Vsync+DEN MODE
  TFT_Write_Command_Ptr(0x01);      //SET horizontal size=480-1 HightByte
  TFT_Write_Command_Ptr(0xDF);      //SET horizontal size=480-1 LowByte
  TFT_Write_Command_Ptr(0x01);      //SET vertical size=272-1 HightByte
  TFT_Write_Command_Ptr(0x0F);      //SET vertical size=272-1 LowByte
  TFT_Write_Command_Ptr(0x00);      //SET even/odd line RGB seq.=RGB
  Delay_ms(1);

  TFT_Set_Index_Ptr(0xf0);
  TFT_Write_Command_Ptr(0x03);      //3 -16bit,0 -8bit        //SET pixel data I/F format=8bit
  TFT_Set_Index_Ptr(0x3A);
  TFT_Write_Command_Ptr(0x60);      // SET R G B format = 6 6 6

  TFT_Set_Index_Ptr(0xE6);          //SET PCLK freq=10MHz  ; pixel clock frequency
  TFT_Write_Command_Ptr(0x01);
  TFT_Write_Command_Ptr(0x45);
  TFT_Write_Command_Ptr(0x47);

  TFT_Set_Index_Ptr(0xB4);          //SET HBP,
  TFT_Write_Command_Ptr(0x02);      //SET HSYNC Tatol 525
  TFT_Write_Command_Ptr(0x0C);
  TFT_Write_Command_Ptr(0x00);      //SET HBP 43
  TFT_Write_Command_Ptr(0x28);
  TFT_Write_Command_Ptr(0x00);      //SET VBP 41=40+1
  TFT_Write_Command_Ptr(0x00);      //SET Hsync pulse start position
  TFT_Write_Command_Ptr(0x00);
  TFT_Write_Command_Ptr(0x00);      //SET Hsync pulse subpixel start position

  TFT_Set_Index_Ptr(0xB6);          //SET VBP,
  TFT_Write_Command_Ptr(0x01);      //SET Vsync total 286=285+1
  TFT_Write_Command_Ptr(0x21);
  TFT_Write_Command_Ptr(0x00);      //SET VBP=12
  TFT_Write_Command_Ptr(0x08);
  TFT_Write_Command_Ptr(0x00);      //SET Vsync pulse 10=9+1
  TFT_Write_Command_Ptr(0x00);      //SET Vsync pulse start position
  TFT_Write_Command_Ptr(0x00);

  TFT_Set_Index_Ptr(0x36);     // memory access control
  if (TFT_Disp_Rotation = 90) then
    begin
      if (Is_TFT_Rotated_180() = 1) then
        TFT_Write_Command_Ptr(0x60)
      else
        TFT_Write_Command_Ptr(0xA0);
    end
  else
    begin
      if (Is_TFT_Rotated_180() = 1) then
        TFT_Write_Command_Ptr(0xC0)
      else
        TFT_Write_Command_Ptr(0x00);
    end;


  TFT_Set_Index_Ptr(0x29);                //SET display on
  TFT_CS := 1;
end;


TFT Example Code

Procedure ClearScreen(X_Start, X_End, Y_Start, Y_End : word);
  begin
        TFT_Set_Pen(CL_black,1);
        ClearWord := X_Start;
        For ClearWord := X_Start to X_End do
          begin
               TFT_V_Line(Y_Start, Y_End, ClearWord);
          end;

  end;


Procedure ScreenView();
var Temp_Word: word;

 Adc_Real2 : longint;
 Adc_Real, i : word;
 begin
       //TFT_Set_Font(@Arial_Bold_26x35,CL_WHITE,FO_HORIZONTAL);
       TFT_Set_Font(@Tahoma_Bold_29x44,CL_WHITE,FO_HORIZONTAL);
       DcOutVoltTemp4 := DcOutVoltMeasurement mod 10;
       temp_word      := DcOutVoltMeasurement mod 100;
       DcOutVoltTemp2 := temp_word div 10;
       DcOutVoltTemp1 := DcOutVoltMeasurement div 100;

       An_CS1     := 0; Wait_Us(100);

       MultiPlexer_A := 1;Wait_Us(100);
       MultiPlexer_B := 0;Wait_Us(100);
       MultiPlexer_C := 0;Wait_Us(100);

       i        := 0;

       ADC_HAM_Volt    := 0;
       Adc_Volt_Real   := 0;

       
       for i:= 1 to 1000 do
         begin
             ADC_HAM_Volt := ADC_HAM_Volt + ADC1_Read(3);
             Delay_Cyc_Long(20);
         end;

       Adc_Volt_Real    := ADC_HAM_Volt div 1000;
       
       if (Adc_Volt_Real < 1638) then Adc_Volt_Real := 0;
       
       DcOutVoltAdcReal1       := ((Adc_Volt_Real * 60) / 3276);
       DcOutVoltMeasurement    := DcOutVoltAdcReal1 * 10;

       DcOutVoltChn4 := DcOutVoltMeasurement mod 10;
       temp_word     := DcOutVoltMeasurement mod 100;
       DcOutVoltChn2 := temp_word div 10;
       DcOutVoltChn1 := DcOutVoltMeasurement div 100;


       DcOutVoltText[4] := (DcOutVoltMeasurement mod 10)+48;  Wait_Us(1);
       DcOutVoltText[3] := '.'; Wait_Us(1);
       Temp_Word        := (DcOutVoltMeasurement mod 100);  Wait_Us(1);
       DcOutVoltText[2] := (Temp_Word div 10)+48;  Wait_Us(1);
       DcOutVoltText[1] := (DcOutVoltMeasurement div 100)+48;Wait_Us(1);

     
             
             ClearScreen(390,440,50,90);
             ClearScreen(340,366,50,90);
             ClearScreen(362,397,50,90);
       TFT_Write_Text(DcOutVoltText,340,50);








       DcOutAmpTemp4 := DcOutAmpsMeasurement mod 10;
       temp_word     := DcOutAmpsMeasurement mod 100;
       DcOutAmpTemp2 := temp_word div 10;
       DcOutAmpTemp1 := DcOutAmpsMeasurement div 100;

       An_CS1     := 0; Wait_Us(100);

       MultiPlexer_A := 0;Wait_Us(100);
       MultiPlexer_B := 1;Wait_Us(100);
       MultiPlexer_C := 0;Wait_Us(100);

       i        := 0;

       Adc_Amps_Real   := 0;
       ADC_HAM_Amps    := 0;

       for i := 1 to 1000 do
         begin
              ADC_HAM_Amps := ADC_HAM_Amps + ADC1_Read(3);
              Delay_Cyc_Long(20);
         end;

       Adc_Amps_Real := ADC_HAM_Amps div 1000;
       
      { if (Adc_Real < 5) then ADC_Real := 0; }

      { if (Adc_Real < 440) then
         begin
              ADC_Real2 := 0;
         end else
       if (Adc_Real > 440) then
         begin
              ADC_Real2 := ADC_Real - 440;
         end; }
         
       Adc_Real2 := Adc_Amps_Real - 408;
       
       if (Adc_Real2 < 5) then Adc_Real2 := 0;

       if (Adc_Real2 > 246) then
         begin
              Adc_Real2 := ADC_Real2 + 100; //82
         end;


       DcOutAmpAdcReal1        := ((ADC_Real2 * 0.1) / 2);
       DcOutAmpsMeasurement    := DcOutAmpAdcReal1 * 10;

       DcOutAmpChn4 := DcOutAmpsMeasurement mod 10;
       temp_word    := DcOutAmpsMeasurement mod 100;
       DcOutAmpChn2 := temp_word div 10;
       DcOutAmpChn1 := DcOutAmpsMeasurement div 100;
       An_CS1       := 1;


      DcOutAmpsText[4] := (DcOutAmpsMeasurement mod 10)+48;
      DcOutAmpsText[3] := '.';
      Temp_Word        := (DcOutAmpsMeasurement mod 100);
      DcOutAmpsText[2] := (Temp_Word div 10)+48;
      DcOutAmpsText[1] := (DcOutAmpsMeasurement div 100)+48;

    
             ClearScreen(340,366,94,134);
             ClearScreen(362,397,94,134);
             ClearScreen(390,440,94,134);
             
      TFT_Write_Text(DcOutAmpsText,340,94);

 end;





94onur94

Bende http://www.mikroe.com/mikromedia/7/stm32f4/ bu kartı kullanıyorum. Üzerinde LCD controller SSD11963 var ekranda 7". Ekranda ki yazı değişimlerini bende dediğin gibi yapıyorum. Yazı yenilenirken kırpılmalar oluyor gözle çok rahat görülebiliyor bunun nedeni SSD1963 entegresinin yüksek çözünürlüklerde yavaş kalması. Daha hızlı LCD controller kullanmalısın. MCU STM32F407ZG 150MHz'de çalışıyor.

AsHeS

Yüksek çözünürlüklü LCD ler için frame bufferlı, RGB interface li MCU şart. Parallel interface can sıkıcı olabilir yüksek çözünürlükte.

kartal0689

Arkadaşlar TFT hakkında çok fazla araştırma yapamadım. Hızlı kontrol için Frame Buffer mı gerekiyor.
Bir de PIC32MX serilerinde sanırım RGB kontrol yapılabiliyor. Bu arada Frame Buffer dediğimiz olay nedir?

kimlenbu

İlk önce init kodlarını bir kontrol et, sen 7 inch kullanıyorsun (800x480).


  TFT_Set_Index_Ptr(0xf0);
  TFT_Write_Command_Ptr(0x03);      //3 -16bit,0 -8bit        //SET pixel data I/F format=8bit
  TFT_Set_Index_Ptr(0x3A);
  TFT_Write_Command_Ptr(0x60);      // SET R G B format = 6 6 6


Şu kısımda pixel data interface'i ilk önce 0xF0 / 0x03 ile 16 bit RGB565 olarak ayarlamışsın, arkasından 0x3A / 0x60 ile ne yapmak istedin ?

"000 Reserved
001 3-bit/pixel
010 8-bit/pixel
011 12-bit/pixel
100 Reserved
101 16-bit/pixel
110 18-bit/pixel
111 24-bit/pixel"

bir de TFT_Write_Text fonksyionu nerde ya göremedim ya gözümden kaçtı

AsHeS

Alıntı yapılan: kartal0689 - 31 Ağustos 2015, 12:15:02
Arkadaşlar TFT hakkında çok fazla araştırma yapamadım. Hızlı kontrol için Frame Buffer mı gerekiyor.
Bir de PIC32MX serilerinde sanırım RGB kontrol yapılabiliyor. Bu arada Frame Buffer dediğimiz olay nedir?
Frame buffer frame i ram de tutabileceğiniz alan. RGB888 formatlı 320*240 bir resim için gereken alan 320*240*3 byte olmaktadır.

Mnemonic

bir kaç sene önce bende 7" ssd1963 ile uğraşmıştım ve aynı sorunu yaşamıştım.
datasheetden incelersen  system clock olarak geçeni bir başlık var register değerleri ile pll'lere müdhale ederek cpu hızını yükseltebiliyorsun ve bu sayede sorun ciddi oranda azalıyor.
bunu bir inceyeyin. benim internetten bulduğum datasheetde 7.2 bölüme anlatmış

kartal0689

Alıntı yapılan: kimlenbu - 31 Ağustos 2015, 12:23:17
İlk önce init kodlarını bir kontrol et, sen 7 inch kullanıyorsun (800x480).


  TFT_Set_Index_Ptr(0xf0);
  TFT_Write_Command_Ptr(0x03);      //3 -16bit,0 -8bit        //SET pixel data I/F format=8bit
  TFT_Set_Index_Ptr(0x3A);
  TFT_Write_Command_Ptr(0x60);      // SET R G B format = 6 6 6


Şu kısımda pixel data interface'i ilk önce 0xF0 / 0x03 ile 16 bit RGB565 olarak ayarlamışsın, arkasından 0x3A / 0x60 ile ne yapmak istedin ?

"000 Reserved
001 3-bit/pixel
010 8-bit/pixel
011 12-bit/pixel
100 Reserved
101 16-bit/pixel
110 18-bit/pixel
111 24-bit/pixel"

bir de TFT_Write_Text fonksyionu nerde ya göremedim ya gözümden kaçtı

Bu kod MikrPascal dsPIC Pro içerisindeki hazır kütüphane. Dolayısıyla bu fonksiyonu bende anlamadım datashette Reserved olarak belirtilmiş hiçbir açıklama yok.
Ayrıca Write_Text hazır bir fonksiyon sanırım. Onu direkt olarak kullandım.