Haberler:

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

Ana Menü

LCD dalgalanma sorunu

Başlatan _MeRKeZ_, 21 Aralık 2013, 19:06:42

_MeRKeZ_

Merhaba arkadaşlar,

Devre üzerinde basılan butonların sonucunu LCD üzerinde gösteriyorum. Ancak Lcd üzerinde dalgalanma oluyor. İlk önce A ve B portundaki girişler okunuyor daha sonra bunlar LCD'ye yansıyor. İlk satırda herhangi bir sorun yok. İkinci satır dalgalanıyor sadece

#include <16f877.h> 

#device ADC=10

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000)

#use fast_io(a)
#use fast_io(b)
#use fast_io(c)

#use rs232(baud=2400, xmit=PIN_C6, rcv=PIN_C7, parity=N, stop=1)

#include <benim_LCD.c>

#define Vites_Ileri PIN_B6
#define Vites_Geri  PIN_B7

int1 Sol,Sag,Ileri,Geri;
int Vites=1;
int Hareket_Durumu=0;
long Deger_1,Deger_2;
float V1,V2;

#int_RB
void Vites_Belirle()
{
   disable_interrupts(int_rb);
   
   if(input(Vites_Ileri))
   {
      delay_ms(20);
      while(input(Vites_Ileri));
      
      Vites++;
      
      if(Vites>5)
         Vites=5;
   }
   
   else if(input(Vites_Geri))
   {
      delay_ms(20);
      while(input(Vites_Geri));
      
      Vites--;
      
      if(Vites<1)
         Vites=1;
   }
}


void Deger_Oku()
{
   set_adc_channel(0);
   delay_us(20);
   Deger_1=read_adc();
   V1=0.0048828125*Deger_1;
   
   delay_ms(60);
   
   set_adc_channel(1);
   delay_us(20);
   Deger_2=read_adc();
   V2=0.0048828125*Deger_2;
   
   delay_ms(60);
   
   Sol=0;
   Sag=0;
   Ileri=0;
   Geri=0;
   
}

void Degerlendir()
{
   if((V1<1.5) && (V1>=0))
   {
       Sol=1;
       Sag=0;
   }
              
   else if((V1<=5) && (V1>3.5))
   {
       Sol=0;
       Sag=1;
   }
               
   else
   {
       Sol=0;
       Sag=0;
   }
               

   if((V2<1.5) && (V2>=0))
   {
       Ileri=1;
       Geri=0;
   }
               
   else if((V2<=5) && (V2>4))
   {
       Ileri=0;
       Geri=1;
   }
               
   else
   {
       Ileri=0;
       Geri=0;
   }
   
   if((Ileri==1)&&(Sol==1))
   {
      lcd_komut(0x01);
      printf(lcd_veri," Yon: Kuzeybati ");
      imlec(2,1);
      printf(lcd_veri,"Hiz seviyesi: %d",Vites);
      Hareket_Durumu=180;
   }
   
   else if((Ileri==1)&&(Sag==1))
   {
      lcd_komut(0x01);
      printf(lcd_veri," Yon: Kuzeydogu ");
      imlec(2,1);
      printf(lcd_veri,"Hiz seviyesi: %d",Vites);
      Hareket_Durumu=120;
   }
   
   else if((Geri==1)&&(Sag==1))
   {
      lcd_komut(0x01);
      printf(lcd_veri," Yon: Guneydogu ");
      imlec(2,1);
      printf(lcd_veri,"Hiz seviyesi: %d",Vites);
      Hareket_Durumu=140;
   }
   
   else if((Geri==1)&&(Sol==1))
   {
      lcd_komut(0x01);
      printf(lcd_veri," Yon: Guneybati ");
      imlec(2,1);
      printf(lcd_veri,"Hiz seviyesi: %d",Vites);
      Hareket_Durumu=160;
   }
   
   else if(Ileri==1)
   {
      lcd_komut(0x01);
      printf(lcd_veri,"   Yon: Kuzey   ");
      imlec(2,1);
      printf(lcd_veri,"Hiz seviyesi: %d",Vites);
      Hareket_Durumu=110;
   }
   
   else if(Sag==1)
   {
      lcd_komut(0x01);
      printf(lcd_veri,"   Yon: Dogu    ");
      imlec(2,1);
      printf(lcd_veri,"Hiz seviyesi: %d",Vites);
      Hareket_Durumu=130;
   }
   
   else if(Geri==1)
   {
      lcd_komut(0x01);
      printf(lcd_veri,"   Yon: Guney   ");
      imlec(2,1);
      printf(lcd_veri,"Hiz seviyesi: %d",Vites);
      Hareket_Durumu=150;
   }
   
   else if(Sol==1)
   {
      lcd_komut(0x01);
      printf(lcd_veri,"   Yon: Bati    ");
      imlec(2,1);
      printf(lcd_veri,"Hiz seviyesi: %d",Vites);
      Hareket_Durumu=170;
   }
   
   else if((Sol==0)&&(Sag==0)&&(Ileri==0)&&(Geri==0))
   {
      lcd_komut(0x01);
      printf(lcd_veri,"Arac durduruldu ");
      imlec(2,1);
      printf(lcd_veri,"Hiz seviyesi: %d",Vites);
      Hareket_Durumu=100;
   }
}


void Hareket_Yonu_Gonder(int veri)
{
   putc(0x55);
   putc(0x55);
   putc(0x55);
   putc(0x55);
   putc(0x55);
   putc(0x00);
   putc(0x00);
   putc(0x00);
   putc(0x00);
   putc(0x00);
   putc(0xFF);
   putc(0xFF);
   putc(0xFF);
   putc(0xFF);
   putc(0xFF);
   putc('A');
   putc('A');
   putc('A');
   putc(veri);
   putc(veri);
   putc(veri);
}

void Vites_Bilgisi_Gonder(int veri)
{
   putc(0x55);
   putc(0x55);
   putc(0x55);
   putc(0x55);
   putc(0x55);
   putc(0x00);
   putc(0x00);
   putc(0x00);
   putc(0x00);
   putc(0x00);
   putc(0xFF);
   putc(0xFF);
   putc(0xFF);
   putc(0xFF);
   putc(0xFF);
   putc('B');
   putc('B');
   putc('B');
   putc(veri);
   putc(veri);
   putc(veri);
}

void main()
{
   setup_psp(PSP_DISABLED); 
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   
   setup_adc_ports(AN0_AN1_AN3);
   setup_adc(ADC_CLOCK_INTERNAL);   
   
   
   set_tris_a(0x03);
   set_tris_b(0xC0);
   set_tris_c(0x00);
   
   output_a(0x00);
   output_b(0x00);
   output_c(0x00);
   
   lcd_hazirla();
   
   enable_interrupts(GLOBAL);
   
   while(1)
   {
      enable_interrupts(int_rb);
      Deger_Oku();
      Degerlendir();
      Hareket_Yonu_Gonder(Hareket_Durumu);
      Vites_Bilgisi_Gonder(Vites);
   }
   
}

Kabil ATICI

birinci satırda da vadır ama birinci satırın değişimi fazla olmadığı için algılanmıyor olabilir.

Ekrandaki bilgiler çok fazla güncelleniyor. Zaten lcd'nın belirli bir gösterme kapasitesi var. Fazlası kırpışma veya dalgalanma olarak algılanıyor.

Sabit bilgi "yön" ve "Hiz seviyesi:" bunlar sabit yazılıp yanındaki bilgi güncellenebilir. Böylece dalgalanmanın lcd'den olmadığı görülür. Sadece sonradan eklenen bilgi kırpışacaktır.
ambar7

selimkoc

LCD'ye bilgi gönderirken sadece değişiklik olduğunda gönder. aynı bilgiyi tekrar göndermenin anlamı yok.

Bunu bayraklarla yapabilirsin veya eski değeri bir değişkene alıp yenisiyle karışılaştırıp değişiklik durumunda lcdye yazdırırsan daha stabil olur.