Butonun basıl tutulması

Başlatan Yasin, 22 Temmuz 2014, 03:10:37

Yasin

PBP'de örneğin PORTB.0'a bağlı bir butona 5 sn. basılı tutulduğunda sayıya 1 eklensin, 10 sn. basılı tutulduğunda sayıdan 1 çıkartılsın gibi bir şeyi nasıl yaptırabilirim?

ete

Alıntı YapPBP'de örneğin PORTB.0'a bağlı bir butona 5 sn. basılı tutulduğunda sayıya 1 eklensin, 10 sn. basılı tutulduğunda sayıdan 1 çıkartılsın gibi bir şeyi nasıl yaptırabilirim?

5 sn=5000 ms ve 10sn=10000ms dir. Komut gecikmesi etkili olmasın diye bekletme komutunu pause 10 olarak kullanacağız.
Böylece sayac değerimiz 5000/10=500 olunca 5 sn geçmiiş olacak , 1000 olunca da 10 sn geçmiş olacaktır.
Ama unutma 500 sayısı 1000 den küçüktür. Butonu basılı tutunca önce 500 sayısına ulaşıp sayıya 1 ekleyecek basmaya devam edince 1000 sayısına ulaşıp sayıdan 1 çıkartılmasını sağlamış olacaksın yapmak istediğinin bu olduğundan eminmisin?

IF PORTB.0=0 THEN
SAYAC=0
WHILE (PORTB.0=0)
   SAYAC=SAYAC+1
   PAUSE 10
   IF SAYAC=500 THEN SAYI=SAY+1
   IF SAYAC=1000 THEN SAYI=SAYI-1
  ENDIF
Bir tedbir almaz isen butonada basmaya devam edersen sayac saymaya devam edecektir. Bu nedenle programa kısıtlama getirebilirsin. Mesela sayma işlemi 1001 olunca bitsin program başka işlere baksın dersen;

IF PORTB.0=0 THEN
SAYAC=0
WHILE (PORTB.0=0) AND SAYAC<1001
   SAYAC=SAYAC+1
   PAUSE 10
   IF SAYAC=500 THEN SAYI=SAY+1
   IF SAYAC=1000 THEN SAYI=SAYI-1
  ENDIF
şeklinde bir kod işini görecektir.

Ete

kartal_0689

#2

Var
Buton : sbit at RB0_bit;
Buton_Counter : word;
SAYI            : word;



begin
    While (TRUE) Do
      begin   
              if (Buton = 0) then
                 begin
                    Inc(Buton_Counter);
                    Delay_Ms(10); //10ms bekleme yap
                  end
                  else
                  Buton_Counter := 0;

                 if (Buton_Counter = 500) then
                    begin                   
                         Inc(SAYI)  // sayıyı artır
                    end
                    else
                 if (Buton_Counter = 1000) then
                    begin
                         Dec(SAYI);  // Sayıyı azalt
                     end;     


      end;

end;


TURKEY/ANK

Yasin

Alıntı yapılan: ete - 22 Temmuz 2014, 09:32:11

Ama unutma 500 sayısı 1000 den küçüktür. Butonu basılı tutunca önce 500 sayısına ulaşıp sayıya 1 ekleyecek basmaya devam edince 1000 sayısına ulaşıp sayıdan 1 çıkartılmasını sağlamış olacaksın yapmak istediğinin bu olduğundan eminmisin?


Mesela butona 5 sn. basılı tuttum ve sayıya 1 eklendi. Butondan elimi çektim. Bu sefer 10 sn. boyunca basılı tuttum. 10 sn. sonunda sayıdan 1 çıkardı. Yani 10 sn. basılı tutunca 5. saniyede işlem yapmayacak.

Yasin

Alıntı yapılan: kartal_0689 - 22 Temmuz 2014, 09:35:38

Var
Buton : sbit at RB0_bit;
Buton_Counter : word;
SAYI            : word;



begin
    While (TRUE) Do
      begin   
              if (Buton = 0) then
                 begin
                    Inc(Buton_Counter);
                    Delay_Ms(10); //10ms bekleme yap
                  end
                  else
                  Buton_Counter := 0;

                 if (Buton_Counter = 500) then
                    begin                   
                         Inc(SAYI)  // sayıyı artır
                    end
                    else
                 if (Buton_Counter = 1000) then
                    begin
                         Dec(SAYI);  // Sayıyı azalt
                     end;     


      end;

end;



Bu programda da 10 sn. basılı tutunca 5. sn.'de işlem yapacak. Ben 10 sn. basılı tutulduğunda 5 sn.'de işlem yapmamasını istiyorum.

ete

Nereden bilecek senn hangi süreye göre işlem yaptığını?
Bu ancak bir bit değişkenini toggle kullanarak olabilir. Bu durumda mutlaka önce 5sn işlemi sonra 10 sn işlemi yaptırılmalıdır. Örnek veriyorum. Z isimli bir bit değişkenimiz olsun. Başlangıç değeri sıfır olacağı için sıfır değeri 5 sn işlemini yaptırsın.
- Tuşa bastım basılı tuttum z=0 olduğu için 5 sn süre dolduğunda SAYI=SAYI+1 yapacaktır. Ama aynı zamanda Z=1 olacaktır.
- Tekrar bastım basılı tuttum Z=1 olduğu için bu sefer 5 sn değil 10 sn yi beklemesi gerekecektir. 10 sn dolunca SAYI=SAYI-1 yapılacak ve aynı zamanda Z=0 olacaktır.
Bunu örneğimize uygular isek;

SAYAC VAR WORD
SAYI VAR BYTE
Z   VAR BIT
....
..
..

IF PORTB.0=0 THEN
SAYAC=0
WHILE (PORTB.0=0)
   SAYAC=SAYAC+1
   PAUSE 10
   IF SAYAC=500 and Z=0 THEN
      SAYI=SAY+1
      Z=1
   ENDIF
   IF SAYAC=1000 and Z=1 THEN
      SAYI=SAYI-1
      Z=0
   endif
wend
ENDIF


kartal_0689

Alıntı yapılan: certy - 22 Temmuz 2014, 13:21:34
Bu programda da 10 sn. basılı tutunca 5. sn.'de işlem yapacak. Ben 10 sn. basılı tutulduğunda 5 sn.'de işlem yapmamasını istiyorum.


While (Buton = 0) do
         begin
              Inc(Buton_Counter);
              Delay_ms(10); // 10ms bekle
             
              if (Buton_Counter = 500) then
                begin
                     STATUS_1 := 1;
                     STATUS_2 := 0;
                end
                else
              if (Buton_Counter = 1000) then
                begin
                     STATUS_2 := 1;
                     STATUS_1 := 0;
                end;
         end
         else Buton_Counter := 0;
         
         
         if ((STATUS_1 = 1) and (STATUS_2 = 0)) then
           begin
                SAYI := SAYI + 1;
                Up_Counter := 0;
           end
           else
         if ((STATUS_1 = 0) and (STATUS_2 = 1)) then
           begin
                SAYI := SAYI - 1;
                Up_Counter := 0;
           end;

TURKEY/ANK

Yasin

Alıntı yapılan: ete - 22 Temmuz 2014, 13:43:17
Nereden bilecek senn hangi süreye göre işlem yaptığını?
Bu ancak bir bit değişkenini toggle kullanarak olabilir. Bu durumda mutlaka önce 5sn işlemi sonra 10 sn işlemi yaptırılmalıdır. Örnek veriyorum. Z isimli bir bit değişkenimiz olsun. Başlangıç değeri sıfır olacağı için sıfır değeri 5 sn işlemini yaptırsın.
- Tuşa bastım basılı tuttum z=0 olduğu için 5 sn süre dolduğunda SAYI=SAYI+1 yapacaktır. Ama aynı zamanda Z=1 olacaktır.
- Tekrar bastım basılı tuttum Z=1 olduğu için bu sefer 5 sn değil 10 sn yi beklemesi gerekecektir. 10 sn dolunca SAYI=SAYI-1 yapılacak ve aynı zamanda Z=0 olacaktır.
Bunu örneğimize uygular isek;


SAYAC VAR WORD
SAYI VAR BYTE
Z   VAR BIT
....
..
..

IF PORTB.0=0 THEN
SAYAC=0
WHILE (PORTB.0=0)
   SAYAC=SAYAC+1
   PAUSE 10
   IF SAYAC=500 and Z=0 THEN
      SAYI=SAY+1
      Z=1
   ENDIF
   IF SAYAC=1000 and Z=1 THEN
      SAYI=SAYI-1
      Z=0
   endif
wend
ENDIF


Anladım. Birde başka bir şey sorayım. Mesela bir programda IF BUTON=1 THEN SAYI=SAYI+1 komutunu kullandık. Programda başka kısımlar da var. Ben butona basıp buton değişkeni 1 olduğunda program sadece IF döngüsünde mi çalışmaya başlar, yoksa butona basılmadan önce olduğu gibi tüm program satırlarında dönmeye devam mı eder?

ete

Yukarıda yazdığım örnek kodda butona basıldığı müddetçe program başka komut işlemez.
Bu aslında sana bağlıdır. Yalnızca;
IF BUTON=0 THEN
  SAY=SAY+1
ENDIF dersen butona bakar basılı ise say değişkenini bir artırır ve if döngüsünden çıkar. orada daha fazla tutamazsın.
Ama;
WHILE BUTON=0
  SAY=SAY+1
WEND
şeklinde bir komut dizisinde buton bırakılıncaya kadar program while - wend döngüsü içinde kalır.
Amacına uygun olarak istediğin şekli sen ayarlayacaksın artık.

Ete

Yasin

Alıntı yapılan: ete - 22 Temmuz 2014, 19:57:19
Yukarıda yazdığım örnek kodda butona basıldığı müddetçe program başka komut işlemez.
Bu aslında sana bağlıdır. Yalnızca;
IF BUTON=0 THEN
  SAY=SAY+1
ENDIF dersen butona bakar basılı ise say değişkenini bir artırır ve if döngüsünden çıkar. orada daha fazla tutamazsın.
Ama;
WHILE BUTON=0
  SAY=SAY+1
WEND
şeklinde bir komut dizisinde buton bırakılıncaya kadar program while - wend döngüsü içinde kalır.
Amacına uygun olarak istediğin şekli sen ayarlayacaksın artık.

Ete

Teşekkürler.

Powered by EzPortal