Buton tekrar bastığında işlem yapmıyor

Başlatan sercanaydin, 09 Şubat 2015, 21:41:42

sercanaydin

Merhaba arkadaşlar

Butona bastığımda kodlar çalışıyor herşey oluyor ancak bütün işlemler bittikten sonra tekrar butona bastığımda program yeniden başlamıyor hiç bir işlem olmuyor yardımlarınız için şimdiden teşekkür ederim.

#include <12F675.h>
#fuses INTRC_IO,NOWDT,NOCPD,NOPROTECT,PUT,NOMCLR,NOBROWNOUT
#use delay(clock=4000000)
#use standard_io(A) 
#define analog   PIN_A0
#define buton   PIN_A3
#define led1   PIN_A5
#define led2   PIN_A4
#use FIXED_IO( A_outputs=PIN_A5,PIN_A4 )


void main()
{
   set_tris_a(0b00001001);
   output_a(0);
   setup_adc_ports(sAN0);
   setup_adc(ADC_CLOCK_INTERNAL);
   int16 deger;
   float volt; 

   while(TRUE)
   {
   
      if(input(buton))
      {
         output_high(led1);     
  
          for(;;)
          {
            delay_ms(500);   
             set_adc_channel(0);
            deger = read_adc();
            volt=deger * 0.0048;
               
           if(volt>1)
           {    
                output_low(led1);
                delay_ms(2000);
                output_high(led2);
                output_high(led1);
                delay_ms(10000);
                 output_low(led1);
                 output_low(led2); 
                 delay_ms(1000);
                 output_high(led1);
                 delay_ms(10000);
                 output_low(led1);
            }  

         }
         delay_ms(10000);
         output_low(led1);
      }
    }
}

elektronart

ya for(;;) döngüsünü iptal et ya da  if(input(buton)) kontrolünü bu döngünün içinde yap. o da olmazsa for(;;) içine break sağlayacak bir kontrol koy.
kodun while içinde dönerken butona basıldığında for içine giriyor ve orada kalıyor, tekrar buton kontrol edebileceğin yere dönemiyor.
Açık Elektronik

sercanaydin

#2
For döngüsünü iptal edersem read_adc() değerini sürekli  okuyabilir miyim ?

mir_as82

Hocam sen While(TRUE) diyerek zaten programı sonsuz döngüye sokmuşsun. İkinci bir sonsuz döngüye gerek yok.

baran123

Alıntı yapılan: sercanaydin - 10 Şubat 2015, 10:49:01
For döngüsünü iptal edersem read_adc() değerini sürekli  okuyabilir miyim ?
Hayır okuyamassın butona basman gerekir okumak için sürekli okumak istiyorsan if'in dışana almalısın

sercanaydin

Hocam yapmam gereken butona basılınca led1 in yanması volt 1den fazla gelirsede led1'i kapatıp ardından led1 ve led2 yi açmak volt fazla gelmesse bir süre sonra led1'in kapanması bu şekilde yazdığım kodlar çalışıyor ancak işlemler bittikten sonra tekrar buton bastığımda çalışmıyor. Şu an iş yerindeyim deneyemiyorum akşam bakıcam aşağıdaki şekilde for döngüsünü kaldırıp adc işleminide if dışına aldığımda istediğimi elde edebilir miyim ? Teşekkürler.

while(TRUE)
{
            delay_ms(500);   
             set_adc_channel(0);
            deger = read_adc();
            volt=deger * 0.0048;   

      if(input(buton))
      {
         output_high(led1);     
  
           if(volt>1)
           {    
                output_low(led1);
                delay_ms(2000);
                output_high(led2);
                output_high(led1);
                delay_ms(10000);
                 output_low(led1);
                 output_low(led2); 
                 delay_ms(1000);
                 output_high(led1);
                 delay_ms(10000);
                 output_low(led1);
            }  

         delay_ms(10000);
         output_low(led1);
      }
 }


sercanaydin

Arkadaşlar her türlü denedim çalıştıramadım  :(

elektronart

adc verisi sadece butona basıldığına işine yarayacaksa sürekli kontrol etmenin gereği yok. Onu da ifin içine alabilirsin. Led1 söndürmeden önce 10sn bekletiyorsun. Görünüşe göre bu süre bitmeden tekrar düğmeye basamazsın, bassan da algılamaz. Ama led1 söndükten sonra yeniden çalışması lazım kodunun. Eğer volt 1den küçükse bu süre 20saniye sürüyor. Zira hem if(v>1) içinde 10sn bekleyip söndürüyorsun sonra çıkıp 10sn bekleyip tekrar söndürüyorsun. if'in dışında kalan bölüme bir else koyarsan bu sorun ortadan kalkar. Muhtemelen son yazdığın kod çalışıyor ama sen Volt 1den büyük olduğu durumda led1 söndükten sonraki 10sn lik bekleme süresi içinde butona basıyorsun. 10sn daha bekleyip bassan çalıştığını göreceksin. Her durumda led1 söndükten sonra çalışması için. adc yi de if(buton) içine koymayı unutma.
else{
   delay_ms(10000);
   output_low(led1);
}
Açık Elektronik

sercanaydin

#8
Hocam şöyle bir durum var Butona bastığımda Led1 10 sn bekliyecek ancak bu 10 sn içinde volt 1 den fazla gelirse beklemeyi durduracak direk adc kodlarına geçecek onları uygulayacak bu yüzden ben for döngüsüne giriyorum ve sürekli olarak adc okumam lazım ne zaman fazla volt geleceği belli olmuyor. Hiç gelmezze 10 sn sonra Led1 kapanıyor. Yapmak istediğimde tam olarak bu kodlarım düzgün çalışıyor tek sıkıntım işlemler bittikten sonra butona tekrar bastığımda programın tekrar çalışması. Sizin dediğinize göre for döngüsünden çıkmıyor program işlemleri bitirdikten sonra break; denedim ama yinede döngü sonlanmadı  >:(

sercanaydin


Cemre.

#10
Hocam anladığım kadarıyla yazdığınız kodun istediğiniz şeyi yapması pek mümkün değil. Sizin istediğinizi kendi anladığım gibi anlatıyorum,

Butona basacaksınız, 10 saniyelik bir ölçüm süreci başlamış olacak,
bu süre içerisinde okunan değer sınırın üzerindeyse ledlerle kullanıcıyı uyaracaksınız.

Eğer bu şekildeyse yazdığınız kodda hatalar var. (ikinci kod)
Öncelikle siz döngünün başında bir kez ölçüm yapıyorsunuz, değeri kontrol ediyorsunuz eğer sınırın üzerindeyse ledler yanıyor sönüyor vs, eğer sınırın altındaysa veya üstündeyse ama if'ten çıkılmışsa 10 saniyelik bir beklemeye geçiliyor. Yani her türlü anlamsız bir şekilde 10 saniye bekleme yapıyorsunuz.
Ancak sizin istediğiniz bu değil.
Bu yüzden sizin 10 saniye boyunca belirli aralıklarla (bunu siz belirleyeceksiniz) ölçüm alıp değer herhangi bir ölçüm anında sınırı geçmişse ledler yakıp söndürülecek ve döngüden çıkılacak şekilde kodunuzu tekrardan yazmanız gerekiyor. Bu kodu düzeltmeye çalışmak yerine önceki cümlemi anlamaya çalışarak tekrardan bir kod yazmanızı tavsiye ederim. Daha sonra paylaşırsanız başka arkadaşların önerileriyle de daha iyi hale getirilebilir.
İyi çalışmalar.

vitruvius

Merhaba, yardım etmek için bir şeyler karalayacağım ancak bir sorum var. Mesela volt değeriniz 1 voltu geçtiğinde 23 saniyelik bir led yanma sönme rutini var. Bu 23 saniye boyunca volt 1 volt'un altına düşerse ne olacak? Rutin devam mı edecek yoksa rutinden çıkıp başka bir iş mi yaptırılacak?

Devre şemanızı da paylaşır mısınız?

Kolay gelsin.

nagaoka

#12
Anladigim kadariyla devrede bitane buton var ve bu A3 é bağlı buna bir kerebasıldıgında A4 pınıne bağlı led yanıyor  süre olarak 23 saniye yansın ve bu 23 sn içinde adc İf <1   eşitliği bozulmazsa  23 sn sonra sönsûn ve ikinci  bi butona basılmayı  beklesın  eğer eşitlik hep 1 in altında ise hep  A4 pınıne bağlı led yansın eğer butona basıldığında 23 sn nin  herhangi bir saniyesinde İf>1 volt eşitliği olursa A4 pınıne bağlı led sönsûn  1 sn beklesın  ve A0 (adc)  pınıne bağlı olan A5 pınındekı led 2 ve A4 pınıne bağlı olan led aynı anda yansın ve 10 sn sonra ikiside sönsûn  ve sonra butona basılınca bu işlemleri aynı şekilde baştan aşağı tekrarlasın  anlatmak istediğiniz bumu..? :-)