Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

B4-B7 Kesme sorunu

Başlatan _MeRKeZ_, 21 Aralık 2013, 11:34:04

_MeRKeZ_

Merhaba arkadaşlar,

Programımda B4-B7 kesmesini kullanıyorum (Daha doğrusu sadece B6 ve B7 girişlerini). Sistem istediğim gibi çalışmıyor.

#int_RB
void Ayarla()
{
   if(input(PIN_B6))
   {
      delay_ms(20);
      while(input(PIN_B6));
      
      Sayi++;
      
      if(Sayi>5)
         Sayi=5;
   }
   
   else if(input(PIN_B7))
   {
      delay_ms(20);
      while(input(PIN_B7));
      
      Sayi--;
      
      if(Sayi<1)
         Sayi=1;
   }
}

..
   set_tris_b(0xC0);
   output_b(0x00);

   enable_interrupts(int_rb);
   enable_interrupts(GLOBAL);



Sayı değişkenini LCD üzerinde gösteriyorum. Örneğin, sayı değeri 1 iken B6 butonuna basıyorum. Bir anda 3 oluyor,5 oluyor. Aynı durum B7 için de geçerli. Bir anda 2-3 sayı birden azaltıyor. Bazen düzgün çalışıyorlar ama çoğunlukla dengesiz.

      delay_ms(20);
      while(input());


kısımlarını silerek de çalıştırdım ama daha da kötüleşti.

Sizce ne yapmalıyım? Hata nerededir?

Teşekkürler

Kabil ATICI

Butonlar mekanik araçlardır. Yani sen butonu bastığın zaman ve bıraktığın zaman keskin bir şekilde geçiş yapmaz.
delay_ms(20) zaten bu sıçramaları filtre etmek için konmuştur. Ama yeterli gelmeyebilir. Ya tuşularını değiştirebilir yada tuş bağlantı uçları arasına 10nf-100nf aralığında bir kondansatör bağlayabilirsin.

ambar7


_MeRKeZ_

@Ambar7

Hocam bu kondansatörleri tam olarak nereye bağlamak gerekir? Butonun iki ucu arasına mi?

@selimkoc

Kaynak için teşekkürler

Kabil ATICI

ambar7

_MeRKeZ_

Peki bu kondansatörlerden hangisi daha iyi sonuç verir? 10 nf mi 100 nf mi?

_MeRKeZ_

Hocam, sorun kesme içerisine girdiğimde kesmeyi etkisiz hale getirmememmiş.

Çalışır hali

#int_RB
void Ayarla()
{
   
   disable_interrupts(int_rb);

   if(input(PIN_B6))
   {
      delay_ms(20);
      while(input(PIN_B6));
      
      Sayi++;
      
      if(Sayi>5)
         Sayi=5;
   }
   
   else if(input(PIN_B7))
   {
      delay_ms(20);
      while(input(PIN_B7));
      
      Sayi--;
      
      if(Sayi<1)
         Sayi=1;
   }
}

..
   set_tris_b(0xC0);
   output_b(0x00);

   enable_interrupts(GLOBAL);

   while(1)
   {
        enable_interrupts(int_rb);
        ...
   }