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);
}
}
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.
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ı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.
Ö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 (http://www.elecfreaks.com/wiki/index.php?title=3.2%22_TFT_LCD_Screen_Module)