Pic basılı tutulan buton

Başlatan Undebach, 27 Ekim 2016, 17:19:33

Undebach

PORTA 1. pinine bağlanan pull-up buton yardımıyla hem kısa basarak hem uzun basarak (uzun yaklaşık 3sn) PORTB pinlerini farklı 2 döngüye sokmak istiyorum. Butona kısa basıldığında PORTB ilk olarak 0xAA 250ms sonra 0xFF değerini alacak. Uzun basıldığında ilk 0xFF 250ms sonra 0 değerini alarak bir döngü gerçekleştirecek.

Fakat butona ilk basıştan sonra kısa veya uzun döngüden çıkmıyor. İlk kısa döngüye girdiyse uzun bastığımda uzun döngüye girmiyor veya tam tersi. Hatayı bulamadım. yardımcı olursanız sevinirim. iyi günler.


Devre şeması:




MikroC kodları:

#define  TEST   Button(&PORTA, 0, 10, 0)  // TEST isminde buton tanımlandı
//------------------------------------------
bit ButonKonum;         // Buton konumuyla ilgili bayrak tanımlandı
unsigned char sayac=0;
void main()
{
  CMCON=7;    // PORTA dijital yapıldı
  TRISA=1;    // PORTA'nın 0.pini giriş diğerleri çıkış
  TRISB=0;    // PORTB çıkış
  PORTB=0;    // PORTB çıkış pinleri lojik "0" yapıldı
  while(1)
  {
     if (TEST)          // Butona basıldığını tespit etmek için
     {
       ButonKonum = 1; // buton bayrağını güncelle (butona basılmış durumda)
       while (ButonKonum && TEST) // butona basılıysa ve önceki durumu basılı ise
       { if(sayac>30) sayac=0;
         sayac++;                      // SAYACI 1 arttırır.
         if(sayac==30) ButonKonum = 0;         // buton bayrağını güncelle
         Delay_ms(90);
       }
       ButonKonum=0;
       
       if(sayac<30){
       while(1){
       PORTB=0xAA;
       delay_ms(250);
       PORTB=0xFF;
       delay_ms(250);
       
       }
       
       }
         else{       while(1){
       PORTB=0xFF;
       delay_ms(250);
       PORTB=0;
       delay_ms(250);
       }
       }

     }
  }
}



canbulut

while (1) {} döngüsü, sonsuz döngüdür. bu döngüye girerse özel bir şey yapmazsanız çıkmaz.

atomx

Timer kesmesi içerisinde buton basılı olduğu sürece bir sayaç ekleyip karşılaştırarak yapılabilir.

Hüseyin TECER

mehmet

Bir genel sayıcı tanımlayın. Bunu timerX
ile artırın. Size gerekli zamanları bu sayıcı ya
göre hesaplayın. Butona basıldığında sayıcı
değerini kaydedip sizin istediğiniz zaman
aşımı değeriyle karşılaştırıp dallanma yaptiriniz.
Yapılacak işler tamamlanınca bu satıcıyı
sıfırlarsınız. 
Bu bir yöntem. Bunun gibi çok farklı şekilde
yapılabilir.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr

agora_meyhanesi42

Bence daha basit şekilde yapılabilir. Şöyleki;
Bir integer değişken tanımlanır.
while döngüsü oluşturularak butonun basılı olduğu surece programın orda kalması sağlanır. While döngüsü içinde değişken 1 artırılır. Daha sonra 1 saniye duraklama eklenir. Böylece kac saniye basıldığı kabaca görülebilir. C bilmiyorum ama pic basic dilinde şöyle olabilir.

Kontrol :
While buton =1
i=i+1
Pause 1000
If buton =0 then goto işlem
Wend

Islem :
If i =2 then led=0
If i=5 then led=1
Bilmiyorum olabilirmi
Yüksel Türk ! Senin için yükselmenin hududu yoktur...

ete

Bu işi yapmanın en güzel yolu aşağıdaki şekilde olur.
IF BUTON=0 THEN  'şayet butona basılmış ise
  SAYAC=0
  WHILE BUTON=0 and SAYAC<3000
     SAYAC=SAYAC+1
     PAUSE 1
  WEND
  IF SAYAC<3000 then
      PORTB=$AA
      pause 250
      PORTB=$FF
  ELSE
     PORTB=$FF
     pause 250
     PORTB=$00
ENDIF
ENDIF

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com