Arduino Mega 2560 ve SSD1289 sürücülü TFT ile ilgili

Başlatan atomx, 09 Aralık 2013, 17:48:52

atomx

Merhabalar. Zaman harcamak ve basit de olsa Micro kontroller'i  öğrenmek adına arduino mega ve 3.2" TFT LCD aldım. Biraz baktım didindim.
Ben analog girişi okuyup TFT'ye basmak istedim ve öyle böyle hallettim( Oscilloscope gibi). Fakat bilmek istediğim bir şey var ya da yardımınızı dilediğim ekrana grafiği taradıktan sonra, ekranda ki grafiği siliyorum. Bu silme işleminin hızı gözle görülecek kadar yavaş ve sinir bozucu. İzlediğim çoğu videolarda bu işlemi bayağı bir hızlı gerçekleştirmekteler. Koduma baktığımda for döngülerinden kaynaklandığı da aşikar. Kesmeler ile de ilgili çok bilgim olmadığından affınıza sığınarak bu kodlarla nasıl bir optimize yapabilirim? Şimdiden teşekkürler.

#include <UTFT.h>

extern uint8_t Sinclair_S[];
extern uint8_t various_symbols[];

UTFT myGLCD(ITDB32S,38,39,40,41);

float buff[318];
float z;

void setup()
{
  
  pinMode(12,OUTPUT);
  tone(12,100);
  
  myGLCD.InitLCD();
  myGLCD.setFont(Sinclair_S);
  
  myGLCD.clrScr();
  
  float x = 1023;
  float y = 199;
  z = x/y;

  // ÜST BAR

  myGLCD.setColor(32, 70, 101);
  myGLCD.fillRect(0, 0, 319, 20);

  myGLCD.setColor(255,255,255);
  myGLCD.setBackColor(32, 70, 101);
  
  myGLCD.print(" CH1",LEFT,5);
  myGLCD.print(" 2V/DIV",51,5);
  myGLCD.print(" 500uS/DIV",145,5);
  
  myGLCD.setFont(various_symbols);
  myGLCD.setColor(255,201,14);
  myGLCD.print("g",32,2);
  myGLCD.print("g",125,2);
  myGLCD.print("g",240,2);
  
  // ALT BAR
  myGLCD.setColor(32, 70, 101);
  myGLCD.fillRect(0, 222, 319, 239);
  
  myGLCD.setFont(Sinclair_S);
  myGLCD.setColor(255,255,255);
  myGLCD.setBackColor(32, 70, 101);
  
  myGLCD.print("jHsynTCR- Oscilloscope 0v1 alpha",CENTER,227);
  
  
  
    // YAN BAR
  myGLCD.setColor(64,64,64);
  myGLCD.drawRect(241,21,319,221);
  
  myGLCD.setColor(10, 50, 80);
  myGLCD.fillRect(242,22,318,220);
  
  myGLCD.drawLine(50,5,50,15);
  myGLCD.drawLine(143,5,143,15);
}

void loop() 
{
      myGLCD.setColor(0,0,0);
 
for(int i = 0; i < 239; i++)
  {

    myGLCD.drawLine(i,buff[i]+21,i+1,buff[i+1]+21);  
   }
 

 
 
   for(int i = 0; i < 317; i++)
  {
    buff[i]=0;
  }
  
  DrawCursors();

  
  for(int j = 0; j < 318;j++)
  {
    buff[j] = analogRead(0)/z;
 
  }
  
    myGLCD.setColor(0,125,125);

  for(int i = 0; i < 239; i++)
  {
    myGLCD.drawLine(i,buff[i]+21,i+1,buff[i+1]+21);  
  }


  delay(100);
 
}


void DrawCursors()
{
   // Yatay Çizgiler (dot)
  
  myGLCD.setColor(21, 21, 21);
  
  for(int i = 21; i<230;i+=20)
  {
    for(int j = 0; j < 239; j+=3)
    {
    myGLCD.drawLine(j,i,j+2,i);
    }
  }
  
  // Yatay Kesitler
  
  for(int i = 21; i<220;i+=5)
  {
    myGLCD.drawLine(117,i,122,i);
  }
  
  // Dikey Çizgiler (dot)
  for(int i = 0; i<260;i+=20)
  {
    for(int j = 21; j < 220; j+=3)
    {
    myGLCD.drawLine(i,j,i,j+2);
    }
    
  }
  
  //Dikey Kesitler
  for(int i = 0; i<240;i+=5)
  {
    myGLCD.drawLine(i,119,i,124);
  }
}
Hüseyin TECER

Kabil ATICI

Bu tür işlemleri hızlandırmak için,
ekrana göndereceğin görüntüyü  ram üzerinde oluşturuyorsun. Sonra bu ram'deki bilgiyi ekrana gönderiyorsun. Ekran görüntü daha hızlı oluşturacaktır.

Ram'de oluşturulan görüntüde sabit (örneğin  osilaskop görüntüsü) şekiller varsa bu doğrudan ram'e aktarılır. Böylece çizdirmek için uğraşmana gerek kalmaz.
Sadece bu (osilaskop görüntüsü )görüntü flash üzerinde yer işgal eder.
ambar7

atomx

Cevabiniz için tesekkur ederim. Ben konuya baya bodoslama daldigimi farkettim. Biraz uzun sure kafa yormak gerekecek. Ama mühim olan ne yol takip etmem iyigunler
Hüseyin TECER

Kabil ATICI

hız istiyorsun bu kesin. Bunun için iki yol var;
birincisi aynı kodu kullanan daha yüksek hızlı bir işlemci;
ikincisi kodunu daha hızlı çalıştırmak.

Kodunu daha hızlı çalıştırmak için;
kodundaki fazla işlemleri atmak.
Örneğin; döngüler ve dallanmalar seni yavaşlatır. Döngüleri açabilirsin ama bu çok ciddi miktarda tekrarlayan kod yazmanı gerektirir.

Çok hesaplama gerektiren işler sonucu belirli bir aralıkta ise tablolar kullanılabilir.

LCD ekrana sabit görüntüler için doğrudan resim gönderme işlemi uygulanabilir.
Yada görüntü ram üzerinde oluşturulup bu görüntü ekrana gönderilir. Bu iyi bir ram gerektirebilir.
ambar7

atomx

Öncelikle zaman ayirdiginiz için teşekkürü borç bilirim. RAM konusunu araştırmak tayin TFT shield üzerinde bos birakilmis bir flash ic soketi var. Linkten görüldüğü gibi. Bana düsen bir uygun flash bulup biraz uğraşmak. tekrar teşekkürler.

http://www.elecfreaks.com/wiki/index.php?title=3.2%22_TFT_LCD_Screen_Module
Hüseyin TECER