Bir butona basıldıktan 30 sn sonra tüm "B" portu çıkışları low olacak

Başlatan Melih1802, 22 Haziran 2014, 21:01:04

Melih1802

İnternette ve forumda bazı örnekler buldum fakat bunları bir araya getirip amacıma uyduramadım.

Yapmak istediğim " d0 ve d5 " portları arasında basılan herhangi bir buton 30sn den fazla basılırsa tüm" b " portlarını kapatacak.

Örnek alabileceğim bir kod paylaşabilirmisiniz.

MrDarK

Hocam şöyle bir yol izlemenizi öneririm.

İhtiyacımız olan yazılım parçaları

1- Buton kontrolü
2- Timer (1 saniye için)
3- Değişken (30 saniyeyi sayacak, sayaç amaçlı kullanılacak)
4- Boolen bir değişken ( 1 veya 0 değerini alabilen değişken türü )

Algoritmayı açıklıyorum ;

Main döngü başında tüm değişkenleri sıfırlıyoruz ve boolen değişkenimizi 0 yapıyoruz.
Ana programda butonları sorguladığımız bir değişkenimiz var. Timer ise 1 saniyeye kurulu ve interrupt ile sadece sayaç değişkenini arttırmakla görevli olacak
interrupt içinde ise eğer boolen değişken false yani 0 ise sayaç değişkeni arttırılmayacak.

Butona bastığımız anda olacaklar ; Öncelikle boolen değer true yani 1 yapılacak. Eğer hiçbir butona basılmaz ise boolen değer false'a çekilecek ve sayaç sıfırlanacak. Ana döngümüzde sayaç değişkenimiz 30'a ulaştı mı diye sorulur. Eğer ulaştıysa tüm port low 'a çekilir, low yaptıktan sonra değişkenimizi ve boolen değişkeni sıfırlamayı unutmayalım.

Anlatmak yerine kodu yazsaydım yeminle daha kolay olurdu :) Ama bu senin için daha anlamlı bir açıklama olacaktır hocam. Proteus ve kod çalışmalarını bekliyorum.

İyi Çalışmalar şimdiden, kafandaki soru varsa alabilirim.
Picproje Eğitim Gönüllüleri ~ MrDarK

Kabil ATICI

Değişik yöntemleri olabileceği gibi;
Biz delay_ms yöntemini kullanarak
bunu işlemciyi tanımladığımız satırın altına koyuyoruz, (kristal hızın farklı ise ona göre bir clock değeri girersin.
# use delay(clock=4000000)  // kristalimiz 4 mhz (delay fonksiyonu için)

//butonlar için sayıcı tanımlıyoruz.
int buton0_say=0;
int buton1_say=0;
int buton2_say=0;
int buton3_say=0;
int buton4_say=0;
int buton5_say=0;
d_port_durum=0;

//buton basıldığında ne değer olmasını istiyorsan ona göre değiştir.

bu şekilde her butonun kendi sayıcısı olur. Bu kaba bir yaklaşımdır while içinde yapılan işleme göre 30sn olarak belirtilen zamanda kayma olabilir.
--------------------------------------------
//ana dönğü içinde (While(1) )altında
delay_ms(50);//50 ms'lik gecikme üretir- 1 saniye olması için 20 kez say senin gecikme süreni düşünürsek 20x30=600 kez sayması gerekir.
if (input(pin_d0)==1)  //buton basıldığında durumu ne ise ona göre düzenle
{
buton0 ++;
if (buton0==600)
{
d_port_durum=1;
buton0=0;
}
}
else
{
buton0=0;
}

if (input(pin_d1)==1)  //buton basıldığında durumu ne ise ona göre düzenle
{
buton1 ++;
if (buton1==600)
{
d_port_durum=1;
buton1=0;
}
}
else
{
buton1=0;
}

....(diğer butonlar için de benzer şekilde yap)
if (d_port_durum==1)
{
// istediğin portu kapat...
}
ambar7

Melih1802

Üstad yazdığın

" Biz delay_ms yöntemini kullanarak
bunu işlemciyi tanımladığımız satırın altına koyuyoruz, (kristal hızın farklı ise ona göre bir clock değeri girersin.
# use delay(clock=4000000)  // kristalimiz 4 mhz (delay fonksiyonu için)"  Bunu nereye koyacağımı bilemedim.
Derleyici versiyonummu farklı 5.008 benim versiyon.
Sihirbazdan;
16F788A
4.000.000 Hz
Seçimlerini yaptım fakat detayları göremedim.



Kabil ATICI

ambar7