while komutu farkli sonuclar verme

Başlatan selvi, 14 Ağustos 2013, 14:26:26

selvi

  oncesinden pbp ile program yaziyordum.bir suredir c ile program yaziyorum.bazi komutlarin kullanimindan sorunlarla karsilasiyorum.
  while komutuna iliskin bir iki sorum olacak.programda while(input(pin_a4)) seklinde kullaniyorum.simulasyonda normal calisiyor.gercek devrede cozdugum kadar farkli calisiyor.
  tus takiminda tusa basili oldugu surece islem yapma seklinde komut yaziyorum ama gercek devrede farkli sonuclar cikiyor.bazi testler yaptim.tusa bastigimda program onu defalarca basilmis kabul edip yanlis sonuclar ortya cikiyor.
  programda while komutunu cikartip 500ms lik gecikme yazdim.bu seferde eskisi gibi hata vermesede ama istenen sonuclari alamiyorum.
    ornegin;sirasiyla 1-2-3 tuslarina bastigimda sanki defalarca sadece 1 tusuna basildigini kabulediyor.ekranda hep 1 tusu yaziyor.
Yaşam anlamlandırıldıkça kutsaldır....

Gökhan BEKEN

Gecikme koymadığınız için oluyor. Normalde siz 1 kere bassanızda, pic anlık olarak sürekli kontrol ettiğinden bir kaç kez hatta 10-20 kez basıp bırakmışsınız gibi algılar.
while(input(pin_a4))
{
delay_ms(20);
kodlar();
}

Süreyi değiştirerek en iyi sonucu bulmaya çalışınız.
Özel mesaj okumuyorum, lütfen göndermeyin.

selvi

Alıntı yapılan: meftun - 14 Ağustos 2013, 14:32:17
Gecikme koymadığınız için oluyor. Normalde siz 1 kere bassanızda, pic anlık olarak sürekli kontrol ettiğinden bir kaç kez hatta 10-20 kez basıp bırakmışsınız gibi algılar.
while(input(pin_a4))
{
delay_ms(20);
kodlar();
}

Süreyi değiştirerek en iyi sonucu bulmaya çalışınız.

  while(input(pin_a4)) komutunun gorevi buton basili oldugu surece islem yapma.hem while komutunu hem de en uygun gecikme olusturmak while komutunun kullanmanin bir mantigi yok.
  cunku belirttiginiz sekilde gecikmeler olusturdum.elin hizliligina gore sonuc veriyor.ben 500ms kadar gecikme olusturdum ama istikrarli bir sonuc yok.eger elin hizli olursa bir kac tusu algiliyor.eger yavas davranirsan tek tus olarak algiliyor.
   yanlis da dusunuyor olabilirim.while komutunu kullanmamin sebebi gecikme komutlarini kullanmamak.ama gecikme komutlari ile olsaydi kullanilirdim tabi.
   simulasyonda ilk mesajimda belirtigim herhangi bir sorun yok.ben de ona guvenerek devresini yaptim denedim.belirttigim sorunla karsilasinca sasirdim.iki gundur bu sorunu gidermeye calisiyorum.bir turlu olmuyor.o kadar emek verdigim icin de birakmak istemiyorum.tabi birakmak iyi bir aliskanlikda olmaz.
Yaşam anlamlandırıldıkça kutsaldır....

ziyaretci

#3
Pin a4 e basılı tutuğun sürece çift tuşları tarayacak. Ama bu döngünün içine bir tane daha döngü kurman gerekli. A4 lojik 1 olduğu sürece bir tuşa basıldığında o döngüye girecek ve işleri bitirdikten sonra o döngünün kapılarını kapatacak. Bu şekilde sadece 1 defa algılar.


selvi

Alıntı yapılan: erkantr67 - 14 Ağustos 2013, 19:45:37
Pin a4 e basılı tutuğun sürece çift tuşları tarayacak. Ama bu döngünün içine bir tane daha döngü kurman gerekli. A4 lojik 1 olduğu sürece bir tuşa basıldığında o döngüye girecek ve işleri bitirdikten sonra o döngünün kapılarını kapatacak. Bu şekilde sadece 1 defa algılar.

    cift dongu olarak tam nasil yaziliyor.komut olarak nasil somutlastirilabilir.

    while komutunun oyle davranmasi normal mi?oda bir muamma olarak kaldi.
Yaşam anlamlandırıldıkça kutsaldır....

ECHO

Kendi yazdığım ve gerçekde de sorunsuz çalışan kodlardır . pin_a2 ye bir kez bastıkdan sonra mühürleme yapıyoruz. while pin_a2 döngüsüyle

if(input(pin_a2))
      {
         lcd_putc("\f");
         printf(lcd_putc,"MAXIMUM");
         delay_ms(500);       
         max=0.0;
         erase_program_eeprom(0);
         
     
//MAXIMUM SICAKLIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIK
            while(input(pin_a2))
          {
                     if(max<50.0)
                  { 
                     
                     max+=0.5;
                     delay_ms(100);
                     lcd_putc("\f");
                     printf(lcd_putc,"%2.1f",max);
                     delay_ms(100);
                   
                     while(!input(pin_a2))
                     {
                     
                      if(input(pin_a3))
                     {
                       max-=0.5;
                       delay_ms(100);
                       lcd_putc("\f");
                       printf(lcd_putc,"%2.1f",max);
                       delay_ms(100);
                     }
                       if(input(pin_a1))
                       {     
                         
                         lcd_putc("\f");
                         printf(lcd_putc,"MAXIMUM %2.1f 'C",max);
                         delay_ms(1000);
                         a=(int8)max;
                         write_eeprom(0,a);
                         goto basla;
                                                 
                       }
                     }
                     
                  }
          }
         
      }

muhittin_kaplan

selvi,
eğer devamlı kontroledeceksen butonları başka çaren yok
main()
{
    while (1)
     {
        while(buton1)
          {
              kodlar...()
              delay
           } 


        while(buton2)
          {
              kodlar...()
              delay
           } 

      }
}

şeklinde yapmalısın. Yok arkadaş böyle olmuyor diyorsan, interrupt ı incele.


sadogan

#7
Mekanik kontaklarda debouncing (sıçrama) oluşuyor.
Bu konuyu araştırmanızı öneririm her yerde karşınıza çıkacak.


Ben bu devreyi kullanıyorum sizede öneririm.
R1 4K7
R2 10K
C2 100nF

selvi

   devrede buton yok.dtmf(cm8870) entegresinin 15 nolu pini(std) 16f628a islemcisinin pin_a4 ayagina bagli.herhangi bir tusa basilmadiginda bu pin daima lojik 0 dadir.tusa basildiginda bu pin lojik 1 oluyor.
Yaşam anlamlandırıldıkça kutsaldır....

muhittin_kaplan

Yani bu pini kontrol edip gidip birşey mi yapacaksın ?

sadogan

Alıntı yapılan: selvi - 14 Ağustos 2013, 22:41:28
   devrede buton yok.dtmf(cm8870) entegresinin 15 nolu pini(std) 16f628a islemcisinin pin_a4 ayagina bagli.herhangi bir tusa basilmadiginda bu pin daima lojik 0 dadir.tusa basildiginda bu pin lojik 1 oluyor.
Sorunun while ilgili deyil donanımsal bir problemin var .
Osilakop un varsa std pininde neler oluyor gözlemle. tus bilgisi geldiğinde 1 kesildiğinde 0 oluyor
diyorsun 1 olduğu süre boyunca sankı 0 gidip geliyor. Anlattıklarından bunu anlıyorum.

selvi

Alıntı yapılan: sadogan - 14 Ağustos 2013, 22:57:13
Sorunun while ilgili deyil donanımsal bir problemin var .
Osilakop un varsa std pininde neler oluyor gözlemle. tus bilgisi geldiğinde 1 kesildiğinde 0 oluyor
diyorsun 1 olduğu süre boyunca sankı 0 gidip geliyor. Anlattıklarından bunu anlıyorum.

  std pinini avometre ile kontrol ettim normal sonuclar veriyor.

bu pini kontrol edip ekrana tus bilgisini yaziyorum.ama bir kez tusa basildigi halde o defalarca basilmis kabul edip ekrana o sekilde yaziyor.normalde "while(input(pin_a4));" komutu tusa basildigi surece  islem bu dongude kalmasi gerekiyor.
   bu komut simulasyonda normal calisiyor.gercek devrede farkli hareket ediyor.
Yaşam anlamlandırıldıkça kutsaldır....

sadogan

#12
Alıntı yapılan: selvi - 14 Ağustos 2013, 23:06:19
  std pinini avometre ile kontrol ettim normal sonuclar veriyor.

bu pini kontrol edip ekrana tus bilgisini yaziyorum.ama bir kez tusa basildigi halde o defalarca basilmis kabul edip ekrana o sekilde yaziyor.normalde "while(input(pin_a4));" komutu tusa basildigi surece  islem bu dongude kalmasi gerekiyor.
   bu komut simulasyonda normal calisiyor.gercek devrede farkli hareket ediyor.
Avo metre ile pindeki sıçramaları görmen imkansiz.
a4 pine std bağlı demiştiniz 8870 q1...q4 uçları nereye bağlı tuş 1 mi tuş 2 mi nasıl ayırıyorsunuz.
kodunuz ve şemanız olsa daha sağlıklı yorumlar olur.

selvi

q1...q4 uclari porta.0,1,2,3 pinlerine bagli.telefon bagli.
Yaşam anlamlandırıldıkça kutsaldır....

muhittin_kaplan

selvi portb.0 a bağlasan ve EXTI kesmesini kullansan daha iyiolmaz mı ?