Haberler:

Eposta uyarılarını yanıtlamayınız ( ! ) https://bit.ly/2J7yi0d

Ana Menü

Glcd neden titrer

Başlatan vardal57, 28 Ekim 2016, 17:20:39

vardal57

Arkadaşlar merhaba
Glcd ye değişken yazdırıyorum fakat sürekli titriyor
gecikme koyamıyorum döngüme adc vs gibi şeyleri etkiliyor

glcd_text57(9,30,yazi,4,0);

sprintf(yazi,"%6lu",value);
glcd_text57(9,30,yazi,4,1);


Başka türlü bu işi nasıl becerebilirim ?

ErsinErce

genelde bir timer ayarlayıp 100ms de bir lcd işleri halledilir.
saniyede 10 frame çoğu iş için fazla bile

vardal57

Timerların hepsını kullanıyorum keşke boş olsada kullanabılsem ?

Zoroaster

Bir sürü yolu var. En pratik olanı şöyle,

LCD'ye yazdığın textin bir örneğini sakla. LCD'ye yeni bir text yazacağın zaman, yazmak istediğin text ile sakladığın text aynımı kontrol et.
Eğer aynı ise boşu boşuna yazma. LCD'de titremesin.

Seytan deliginden kacti.

ErsinErce

#4
sabit zamanlı olan birine ek bir değişken daha ekle atıyorum 15ms de bir interrupt veriyorsa

x = x+15 yaz

sonra aşağıdaki gibi kullan

if (x >= 100) {
print ...;
x=0
}

vardal57

Son bir soru daha printf de titremeyen değişken neden sprintf de titriyor ? printf de yazıyorum değiştiriyorum hiç sorun yok sılmeme bıle gerek kalmıyor
ama sprintf de silmediğim zaman karakterin ağzı burnu bırbırıne gırıyor ?

Zoroaster

printf ile GLCD'ye nasıl yazıyorsun?
Seytan deliginden kacti.

vardal57

glcd_gotoxy(5,10,1);
printf(glcd_putc,"ADC %6lu",hamvolt);
bu şekilde yazdırıyorum ve titreme yok ama böylede karakterin büyüküğünü ayarlayamıyorum

Zoroaster

glcd_gotoxy(5,10,1);
sprintf(yazi,"%6lu",value);
printf(glcd_putc,"ADC %6lu",hamvolt);

Bu şekilde araya laf olsun diye konan sprintf de durum ne oluyor deneyebilirimisin?
Seytan deliginden kacti.

vardal57

sadece printf i görüyor sprintf i görmüyor

Zoroaster

#10
Yok elbette sprintfli satır ekrana bir şey yazmayacak fakat titreşim durumu oluştu mu onu merak etmiştim. (Eğer oluyorsa TFT ekranın kendi tarama süresi ile ekrana erişim zamanlaması şansına stroskopik etki oluşturuyordur yani sprintf çalışma süresi ile ekran bir ahenk sağlıyor diyebilirdik)

Eğer titreşim oluşmadı ise o zaman tek mantıklı açıklama kalıyor. Printf LCDye basmadan önce low level komutları sayesinde baskı alanını hızlıca temizler ve ardından yeni şablonu ekrana basar.
Fakat sprintf baskı alanındaki daha önceki görüntüye karışmaz ve baskı alanına yeni şablonu yerleştirir dolayısı ile eski baskı ile yeni baskı kombine görüntü oluşturur.

Buna engel olmak için bir komutla önce ekranın o bölgesini silip ardından yine bir komutla baskı yaparsan ekrana peşpeşe ve aralıklı olarak ekrana iki erişim yapmış olursun. Bu da ekranda titremeye neden oluyor olabilir.

Tabiki bu bir tahmin sadece. Fakat CRTC kartları zamanında yüksek hızlı grafik çizimlerde bu işleri gelişi güzel zamanlarda yapmazdık. Eğer yaparsak ekranda karıncalamalar olurdu. İşte bu nedenle Display ram update işlerini CRTC Vetical Sync. interrurpt rutininde ekranın karartıldığı anlarda yapardık.

Alternatif çözüm olarak çirft bufferlı CRTC kartları tasarlardık. Bu yapıda ekran gösterim modunda iken ramlardan birini kullanır ve işlemci diğer rama erişip yazboz yapardı.
Ekran taraması bittiğinde iki ram yer değiştirirdi. Dolayısı ile hiç bir zaman gösterimde olan ramda yaz boz yapılmaz hali ile flicker etkileri oluşmazdı.

Sırf TV kamerası ile ekran görüntüsü çekilen monitör cihazlarımızda TV deki görüntüde, monitördeki görüntünün düşeyde/yatayda akmaması için CRTC pixel frekansının baz alındığı osilatörü xtal ile yapmaz 50Hz den PLL yoluyla çoğullama yoluyla yaparak her türlü kötü duruma çözüm getirirdik.
Seytan deliginden kacti.

int32

#11
Yazdıracağın değer değiştiği zaman ekrana yeni değeri yazdırırsın, değişmemişse hiç yazdırmazasın.
Aşağıdaki gibi olabilir;

glcd_text57(9,30,yazi,4,0); 

sprintf(yazi,"%6lu",value);
glcd_text57(9,30,yazi,4,1);


yerine
int value0;

if(value != value0)
{
    glcd_text57(9,30,yazi,4,0); 

    sprintf(yazi,"%6lu",value);
    glcd_text57(9,30,yazi,4,1); 

    value0 = value;
}