debouncing

Başlatan muahaha, 03 Aralık 2005, 10:26:23

muahaha

Slm ben menu yapıyorum ama buttonlar bazen normal calisiyor bazende cok hızlı calisiyor ilgili fonkisiyonu asagida veriyorum sorun acaba scakey() mı?

[code]
scankey()

{

  while(1)
  {

     if(s2==1)
     {
        delay_ms(200);
        if(s2==1)

 

     

       return 1;

      }

     if(s3==1)
     {
        delay_ms(200);
        if(s3==1)


       return 2;
     }

   }

}
asagidaki kısım mainden bir parca

while(1)

{
       
        while(s2&&!s3)
                    {
                       hour=hour+1;
                       if(hour==24)
                       hour=0;
                       lcd_gotoxy(1,1);
                       printf(lcd_putc,"Saati gir");
                       
                          lcd_gotoxy(1,2);
                        printf(lcd_putc,"%02d",hour);
                        scankey();
                       
                        }

yani ekranda saati bazen normal arttırıyor bazenden 5er 5 er falan arttıyor

simdeden hrkeze tsk

Salih

Benim yazdığım bir buton fonksiyonu.

void f_saat(){
      if (!bsaat){
      delay_ms(3);
         if (++but0 > 25) { but0 = 0;if (++saat>23) saat=0;goto son;}
         if (!bb_saat) {if (++saat>23) saat=0;}
         bb_saat = 1;
                  } else{
                           But0 = 0;
                           bb_saat = 0;}
son:;
}


Burada
bsaat    -> butonun bağlı olduğu pin
bb_saat  -> dahili bir bit butonun önceki durumunu saklıyor
but0  -> int8 tipinde bir değişken. butona daima basılınca otomatik artma
hızını belirliyor.
Bu fonksiyonu ana program döngüsüne koyarsanız çalışır.

Petek

Alıntı yapılan: "muahaha"Slm ben menu yapıyorum ama buttonlar bazen normal calisiyor bazende cok hızlı calisiyor ilgili fonkisiyonu asagida veriyorum sorun acaba scakey() mı?

[code]
scankey()
{ while(1)
  {if(s2==1)
     {delay_ms(200);
        if(s2==1) return 1;
      }
    if(s3==1)
     {delay_ms(200);
       if(s3==1) return 2;
     }
  }
}
asagidaki kısım mainden bir parca

while(1)
{
        while(s2&&!s3)
                    {
                       hour=hour+1;
                       if(hour==24)
                       hour=0;
                       lcd_gotoxy(1,1);
                       printf(lcd_putc,"Saati gir");
                       
                        lcd_gotoxy(1,2);
                        printf(lcd_putc,"%02d",hour);
                        scankey();
                     }
yani ekranda saati bazen normal arttırıyor bazenden 5er 5 er falan arttıyor

scankey içerisinde dondürmek istediğin sayıyı bir değişkene aktar. 200 ms bekledikten sonra tuşu tekrar kontrol etmenin anlamı yok. saten o tuş bir kere aktiflendimi debounce süresini beklemene gerek yok çünkü o tuşa basıldı. altprogramdan çıkmadan önce bir delay koyman yeterli. Delay rutinleri genelde fazla stack space kullanırlar ve o nedenle mümkünse scankey alt rutinini çağırdıktan sonra (bu rutinden dönünce) kullanman daha sağlıklı olur.

ana programda saati arttırdığının döngüye giriş şartın while(s2&&!s3) ile. Ama scankeyi fonksiyon tanımlamışsın ve dönüş değerini ana programda kullanmamışsın. s2 yada s3 durumu scankeyde ne olmuş ise ana programda onu kullanmışsın. O while döngüsüne de de ancak s2 1 yapıldığında girersin.

onun yerine
while (s2 || s3)
 { deger = scankey(); delay_ms(200);
    if (deger==1) hour++; if(hour==24) hour=0;
   LCD yazdırma işlemleri
 }

scankey deki while(1) de gereksiz. Tuşa basılmışsa çağır scankey i.
“Önyargıları yıkmak atomu parçalamaktan zordur” A.Einstein