Haberler:

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

Ana Menü

grafik lcd yardım

Başlatan huskapukaya, 30 Ekim 2008, 01:06:08

huskapukaya

merhaba arkadaşlar;
ben 16f877 nin analog portunu kullanarak okuduğum değeri grafik lcd de göstermek istiyorum. Grafik lcd de şöyle bir problemim var;
lcd verdiğim 100 ms lik gecikmeyle sürekli kendini yeniliyor. Yani her bir döngüde lcd ekranı silinip yenide yazılıyor(en azından ben öyle anladım)
Yani sürekli bir titreşim görülüyor.
bu sorunu nasıl aşabilirim?
kullandığım lcd k0108 tabanlı 128x64 grafik lcd
yazdığım kod ise
#include <16F877A.h>
#device ADC=10
 
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=20000000)
#use fast_io(e)

#include <HDM64GS12.c> 
#include <graphics.c> 
#include <math.h>

#int_ad
void ADC_Kesmesi()
{
output_high(pin_c5);
delay_ms(250);
output_low(pin_c5);
}



char bil[5];


unsigned long int bilgi;
float birim,volt;


/********* ANA PROGRAM FONKSİYONU********/


void main ()
{
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);

set_tris_e(0x0F);

setup_adc(adc_clock_div_32);
setup_adc_ports(ALL_ANALOG);

enable_interrupts(int_ad);
enable_interrupts(GLOBAL);





   while(1)
   {
   
set_adc_channel(6);


bilgi=read_adc();
volt=0.0048875855*bilgi;
birim=volt*4;


sprintf(bil,"%f",birim);

      glcd_init(ON);
     
       
       
        
      
      glcd_line(0,30,128,30,ON);
      
      glcd_text57(0, 35, bil, 4, ON); 
      
      
      delay_ms(100);
      
}
}
    
    

f_machine

gecikmeyi kaldırıp bi dene bakalım,belki düzelir...

parda

Merhaba
Gecikmeyi uzatmanız gerekmekte gibi görünüyor.
Birde glcd_init fonksiyonu lcd yi temizliyorsa titreme ondan olur yani lcd yi temizlemeden veriyi güncelleyiniz.
Bildiğim tek şey, hiç bir şey bilmediğimdir.

cemilkendir

grafik lcdler biraz yavaş çalışıyor aynı sorunu bende yaşamıştım
yeni veriy ekrana yazdırmadan önce eski veriyi tekrar ekrana yazdır ama bu sefer beyaz olarak yazdır sonrada yeni veriyi ekrana tekrar yazdır
#include <16F877A.h> 
#device ADC=10 
  
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD 

#use delay (clock=20000000) 
#use fast_io(e) 

#include <HDM64GS12.c> 
#include <graphics.c> 
#include <math.h> 

#int_ad 
void ADC_Kesmesi() 
{ 
output_high(pin_c5); 
delay_ms(250); 
output_low(pin_c5); 
} 



char bil[5]="     "; 


unsigned long int bilgi; 
float birim,volt; 


/********* ANA PROGRAM FONKSİYONU********/ 


void main () 
{ 
setup_psp(PSP_DISABLED); 
setup_spi(SPI_SS_DISABLED); 
setup_timer_1(T1_DISABLED); 
setup_timer_2(T2_DISABLED,0,1); 
setup_CCP1(CCP_OFF); 
setup_CCP2(CCP_OFF); 

set_tris_e(0x0F); 

setup_adc(adc_clock_div_32); 
setup_adc_ports(ALL_ANALOG); 

enable_interrupts(int_ad); 
enable_interrupts(GLOBAL); 

glcd_init(on);
glcd_line(0,30,128,30,ON); 
set_adc_channel(6); //neden sürekli  döngü içerisinde sürekli aynı adc yi 
//seçiyorsun bu döngünün tamamlanma süresini uzatır bir defa kanalı 
//seçmen yeterli

   while(1) 
   { 
    



bilgi=read_adc(); 
volt=0.0048875855*bilgi; 
birim=volt*4; 

glcd_text57(0, 35, bil, 4, OFF);
sprintf(bil,"%f",birim); 
glcd_text57(0, 35, bil, 4, ON); 
delay_ms(100); 
      
} 
}


birde böyle dene bu işini görebilir eğer olmazsa ekrana yazacağın veriyi karakter karakter yazmalısın şöyleki
senin adc ölçümün 125.3 olsun bir sonraki ölçümün de 125.8 olsun
böyle bir veri güncellenmesi durumunda tüm ekranı tekbir karakter değiştirmek için silip baştan yazmak yerine sadece  değişen karakteri silip yerine yeni karakteri yazmalısın böylece ekrandaki titreme tamamen yok olacaktır.

mikromuh

Slm, bazen ks0108 chipli grafik lcd ler arasinda fark olabiliyor.Bende bu tarz bir sorun yasadim.Cesitli derleyiciler denedim ama bir turlu ekrandaki gecikmeyi engelleyemedim.Kutuphaneye mudahale ettim gene olmadi.En sonunda siyah fontlu bir grafik lcd kullandim ve sorunun lcd chipinden kaynaklandigini gordum.Bosa kurek sallamisim yani.Piyasada 1 ton grafik lcd var cogunda ks0108 chipin muadili kullaniliyor.Ve hepsi derleyicilerin standartina uymuyor malesef.

huskapukaya

Cevaplarınız için teşekür ederim arkadaşlar. Gecikmeyi kaldırınca titreme çok hızlı oluyor ama görüntü daha fazla bozuluyor. O yüzden gecikmeyi arttıtrmak daha mantıklı oluyor. Ama ozamanda gene koyduğum gecikme süresi içerisinde titreme oluyor.
Ayrıca adc portunu döngünün içerisine koymamın sebebi ben aslında 2 farklı adc portu kullanmayı düşünüyorum. Yani önce 6. porttan sonrada 5. porttan okuma yapacağım. O yüzden döngüye koymuştum. Ayrıca lcd de veriyi yazdığım yeri temizlemezsem eski verinin üzerine yazıyor vede karakterler üst üste görünüyor.
Diğer arkadaşların önerilerinide deneyeceğim.
Gerçekten herkese çok teşekür ederim. Denemelerim bitince buradan sonuçları yazarım.

cemilkendir

benim yazdığım kodu denedinmi eğer yazdığımı anladıysan yada denediysen yazıların  üstüste binmediğini görürsün incelemeni tavsiye ederim

huskapukaya

sorunu çözdüm. cemilkendir arkadaşımızın gönderdiği kodun rehberliği sayesinde oldu gerçekten teşekürederim. Şöyle birşey yaptım:
if(br!=birim)
   {
glcd_text57(0, 35, bil, 3, off);
sprintf(bil,"%f",birim);
glcd_text57(0, 35, bil, 3, on); 
   }
    else
      {
          sprintf(bil,"%f",birim);
          glcd_text57(0, 35, bil, 3, on);
      }
             
    br=birim;
    


böylece sadece yeni bir değer geldiğinde bir silme yapıp yeni değeri yazıyor titreme sorunu kalktı.
Çok teşekür ederim :D

kostebek


cemilkendir

bunu biraz daha ileriye götürüp sadece değişen haneyi yeniden yazman dahi iyi sonuçlar verir