LCD ekran görüntüsü yenileme ile ilgili

Başlatan abdullahmk, 29 Şubat 2012, 15:35:56

abdullahmk

Selamunaleykum arkadaşlar.
LM35 ile çalışan çok basit bir sıcaklık ölçüm programı yazdım. Merak ettiğim şu ki her printf komutu işlendiğinde ekrandaki görüntü anlık olarak gidip geliyor. Dolayısıyla görüntüde süreklilik oluşmuyor ve hoş görünmüyor. Bunun sebebi nedir sizce?

#include <18F2520.h>
#device ADC=10
#fuses XT
#use delay(clock=4000000)
#define use_portb_lcd TRUE
#include <lcd.c>

float32 bilgi,voltaj,sicaklik;

void main()
{
   setup_adc(adc_clock_div_32);
   setup_adc_ports(AN0);
   set_adc_channel(0);
   delay_us(30);
   lcd_init();
   
   while(1)
   {
      bilgi=read_adc();
      voltaj=0.00488125*bilgi*1000;
      sicaklik=(voltaj/10);
      printf(lcd_putc,"\fVOLTAJ  =%3.0f mV\nSICAKLIK=%3.0f'C",voltaj,sicaklik);
      delay_ms(1000);
   }
}




AsHeS

#1
Aleykümselam,
%100 emin olarak yazmıyorum ama durmadan lcd de ki görüntüyü yenilemeniz sıkıntı yapıyor olabilir ya ne yapacağım diye soracak olursanız eski değer ile yeni değeri karşılaştırın eğer eski değer ile yeni değer arasında meselea +-0.3 lük bir fark varsa ekranı yenilesin.

abdullahmk

Alıntı yapılan: AsHeS35 - 29 Şubat 2012, 15:49:10
%100 emin olarak yazmıyorum ama durmadan lcd de ki görüntüyü yenilemeniz sıkıntı yapıyor olabilir ya ne yapacağım diye soracak olursanız eski değer ile yeni değeri karşılaştırın eğer eski değer ile yeni değer arasında meselea +-0.3 lük bir fark varsa ekranı yenilesin.

Cevap için teşekkürler. Fakat öyle bile olsa yine de yenileneceği zaman ekran gidip gelecek. Benim merak ettiğim yenileme sırasında git gel yapmamasını sağlayacak herhangi bir şey yapılabilir mi?

AsHeS

bu ekranın yenilenmesini c dilinde nasıl yapıyor arkada bilmiyorum fakat asm de kendi yazdığım kod da harfler ekrana tek tek basılıyor ve bu basım sırasında hızlıca olduğu için proteus da topluca bekleme süresi oluyordu eğer ccs c de farklı bir yöntem keşfedilmemişse senin yazdığın kodlar mutlaka sekecektir.Çünkü lcd o kadar çok karakteri anında ekrana basamaz çünkü arada kontrol yapıları var.Ayrıca durmadan yenileme yapmak istiyorsanız 2-3 lü toplu sürülebilen 7 segment yapılarından alın onunla biraz daha hızlanacağını düşünüyorum.

mozkan87

Bunun nedeni yüksek ihtimalle lcd'ye her veri göndermeden önce lcd'nin ekranın silinmesidir. lcd.c dosyasının içini bir kontrol edin. Tüm lcd ye veri gönderileceği zaman ekranın silinmesi gereksiz oluyor. Doğrudan veriyi göndermek daha mantıklı. Ayrıca devreyi sadece proteusta açlıştırdıysanız yani gerçekte kurmadıysanız, proteusta böyle gözükmesi normal olabilr. Gerçekte bu silinmeyi fark edemezsiniz.

AsHeS

Alıntı yapılan: mozkan87 - 29 Şubat 2012, 16:24:08
Bunun nedeni yüksek ihtimalle lcd'ye her veri göndermeden önce lcd'nin ekranın silinmesidir. lcd.c dosyasının içini bir kontrol edin. Tüm lcd ye veri gönderileceği zaman ekranın silinmesi gereksiz oluyor. Doğrudan veriyi göndermek daha mantıklı. Ayrıca devreyi sadece proteusta açlıştırdıysanız yani gerçekte kurmadıysanız, proteusta böyle gözükmesi normal olabilr. Gerçekte bu silinmeyi fark edemezsiniz.
Gerçekte olursa da zaten programın ana mantığı oynanmıyor yani pin giriş çıkışları sabit olacak şekilde algoritmayı kurcalar arkadaş böylece en hızlı çalışanını bulur.

abdullahmk

Gerçek ve simulasyonun farklılıklar gösterebileceğini bildiğim için devreyi gerçekte hazırlayıp denedim fakat sonuç tam olarak Proteus'daki ile aynı. Her yenilemede ekran \f ile veya lcd_send_byte(1) ile zaten silinmek zorunda yoksa ekran saçmalar.

AsHeS

#7
Alıntı yapılan: abdullahmk - 29 Şubat 2012, 16:36:58
Gerçek ve simulasyonun farklılıklar gösterebileceğini bildiğim için devreyi gerçekte hazırlayıp denedim fakat sonuç tam olarak Proteus'daki ile aynı. Her yenilemede ekran \f ile veya lcd_send_byte(1) ile zaten silinmek zorunda yoksa ekran saçmalar.
o zaman pek hoşlanmasanızda :) benim önerdiğim çözümü deneyin eğer yine atlama yapıyorsa sizin kod da bambaşka bir yerde arıza var demektir.

Klein

Alıntı yapılan: abdullahmk - 29 Şubat 2012, 16:36:58
Gerçek ve simulasyonun farklılıklar gösterebileceğini bildiğim için devreyi gerçekte hazırlayıp denedim fakat sonuç tam olarak Proteus'daki ile aynı. Her yenilemede ekran \f ile veya lcd_send_byte(1) ile zaten silinmek zorunda yoksa ekran saçmalar.
LCD silinmediği zaman neden saçmalıyor?

kaypic38

Hocam senin yaptığın ölçüm anlık ama sen süreyi 1 sn olarak vermişsin renk algılayıcı yaptığımda aynı sorun bende de olmuştu anlık olabilmesi için sürenin çok kısa olması lazım tabi ki sıcaklık değişimi sürekli olursa bu durumda da değerler durmadan değişir süreyle oynayarak ayarlayabilirsin ben öyle yapmıştım RGB değerleri titreterek veya değişimlerde ekran siliniyor sonra yeni değer ekrana basılıyordu programın yapısını hiç değiştirmeden süreleri değiştirerek gidermiştim belkide aynı sorun ile karşı karşıyasın dır.
Bir şeyi gerçekten öğrenmek, yapmak istiyorsan o şeyi yapmışsın, öğrenmişsin demektir...

mcan

Programındaki
printf(lcd_putc,"\fVOLTAJ  =%3.0f mV\nSICAKLIK=%3.0f'C",voltaj,sicaklik);

\f kullanmışsın bu ekranı komple siler. Komple silipde son karakteri basana kadarki sürede senin göze kötü görünüyor. Bunun yerine ekranın 2x16 olduğunu varsayarsak mesela ilk satıra her zaman 16 haneli bir şey yaz.Ve imleci ekranın başına silerek değil de direk komutla atlat.Ya da imleci direk değiştireceğin kısma taşıyıp sadece orayı değiştir.

cemilkendir

lcd_gotoxy(1,1);
printf(lcd_putc,"VOLTAJ  =%3.0f mV",voltaj);
lcd_gotoxy(2,1);
printf(lcd_putc,"SICAKLIK=%3.0f'C",sicaklik);


ekranı her defasında önce silip sonra tekrar yazıyorsun ondan kıpraşıyor ekran bu verdiğim şekilde ise yeni karakterleri üzerine yazıyor

CLR

Ekranı, sadece değişkenlerin değiştiği zaman silip (veya sadece değişen kısımlarını) yazmalısın, her döngüde yazarsa lcdnin zamanla digitleri bozulur.
Knowledge and Experience are Power

cemilkendir

Alıntı yapılan: uicroarm - 29 Şubat 2012, 23:57:42
Ekranı, sadece değişkenlerin değiştiği zaman silip (veya sadece değişen kısımlarını) yazmalısın, her döngüde yazarsa lcdnin zamanla digitleri bozulur.
böyle bir bilgiyi nerden aldınız kaynağı nedir. ben projelerimde böyle bir şeye dikkat etmiyorum hiç

CLR

Alıntı yapılan: cemilkendir - 01 Mart 2012, 01:07:28
böyle bir bilgiyi nerden aldınız kaynağı nedir. ben projelerimde böyle bir şeye dikkat etmiyorum hiç

Aşağıda ki yazdıklarım şahsi görüşümdür.

1) Hayatta bu iki şey herşeyi(insan, madde vs) bozar, etkiler, bunlar stres(voltaj) ve frekans(tekrarlılık). Mesela bir kondansatörü 50hz'de 100000 saat kullanıyorsan, 100khz'de 5000 saat gibi ömrü olur. LCD segmentleri ise çok daha hassastır. Her loop arası en iyi ihtimalle 1ms olsa, 1khz'de bir lcd'ye yazıyor olursun.Yani saniyede 1000kez lcd'ye yazarsın, oysa ben o 1000 kez yazmayı projeye göre 1ayda, 1haftada,1 günde bazen 1saatte yazabilirim.

2) Sürekli üzerine yazarsanız, programınız büyüdükçe kırpışma artar. Hele ekranı silip yazarsanız, kırpışma daha çok artar. Silmeden üzerine yazarsanız eski görüntüler ile yeni görüntüler birbirine karışır.

3) Ekran verilerinin kararsız durumlararında ekranınız sürekli değişecektir.

İşte bunlardan dolayı, yukarıdaki 3 durumda bana göre hem elektroniçlilik bağlamında hemde programcılık olarak yanlıştır. Sadece değişim olduğunda lcd ekranın tazelenmesi sade, mantıklı ve tasarrufludur.

Knowledge and Experience are Power