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ı:
(http://s10.postimg.cc/bflgn7g7p/fafa.png) (http://postimg.cc/image/bflgn7g7p/)
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);
}
}
}
}
}
while (1) {} döngüsü, sonsuz döngüdür. bu döngüye girerse özel bir şey yapmazsanız çıkmaz.
Timer kesmesi içerisinde buton basılı olduğu sürece bir sayaç ekleyip karşılaştırarak yapılabilir.
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.
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
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