pic c'de buton basma süresi

woLtaj

Üye
Katılım
1 Tem 2011
Mesajlar
36
Puanları
1
Yaş
31
pic 16f84a 'da butona basma süresine göre kontrol etmek istyorum pic c dilinde.yardım ederseniz çok ama çok mutlu olurum :)
 
int16 buton_sure;

buton_sure=0;
while(BUTON)
{
delay_ms(10); // 10 ms aralıklarla okumak hiçbir sakınca yaratmaz ama daha hassas olsun dersen 1 ms alabilirsin.
restart_wdt();
buton_sure++;
}

if(buton_sure==50); // 50ms gibi

böyle bir yapı kullanabilirsin.
 
çok teşekkür ederim birazdan deniycem.fakat aklıma birşey takıldı 'restart_wdt();' gecikmeyimi sıfırlıyo?
 
watchdog timerı sıfırlıyor. wdt picin sıkışması veya sonsuz döngüye girmesi durumunda pice reset atar.

projende wdt aktif olup olmadığını bilmediğimden her ihtimale karşı ekledim.

fuseslarda NOWDT yazıyorsa wdt aktif değildir. WDT ve WDT64 gibi bir şeyler yazıyorsa yazan rakamı 4 ile çarparsan örneğin 4*64=256 ms boyunca, eğer program ilerlemezse pice reset atar.
 
hmm anladım çok ama çok teşekkür ederim.şimdi benim karşılaştıgım sorun su.delay_ms ile gecikme saglıyorum ve sensörümün gördügü saniyeyi saydırıyıorum.fakat mekanik olarak sensörün önünden her saniye bir malzeme gecyo.benim sıkıntımda burda kaynaklamıyo.sürekli 1 0 1 0 bilgileri geliyo ve 1 bilgisini gördügü süre boyuncaki gecikmeyi sürekli bir digerinin üzerine yazıyo.sonuç olarak istedgim gecikmeyi saglayamadan sensör onu 3 sanye kesintisz görmüş gbi oluyo.benim ihtyacım olan gecikmeyi bir digerinin üzerine yazmaması.watchdog timer'ı kapattım bunun geckmeyi resetlemeye yararı olur mu ?
 
şu şekilde basit bir çözüm olabilir. WDT kapalı olduğu için wdt reset'e gerek yok. wdt reset sadece watchdog timer ı sıfırlar. başka hiçbir yere etki etmez.

int16 sure;

while(1) // Sonsuz döngü için
{
sure=0;
while(sensor) // sensörden sıfır gelince otomatik bırakır.
{
sure++;
delay_us(100); // çok daha hassas olması için her pin denetimini 100 mikro saniye aldım. bu ürünün sensörden geçme süresi değil.
}

// sure artık geçen süredir.
}

veya bu tür işlerde kullanılan en güzel yöntem portb'nin port change interruptını kullanmak.
 
bunu uyguladım sure degiskeniyle istedgim saniyeyi kontrol ettirdim programım su sekilde

while(1){

n=0;

while(a==0 && n<4 )
{
n=n+1;
delay_ms(250);
delay_ms(250);
delay_ms(250);
delay_ms(250);
}

if(n==3)
b=0x00;


}

pic cıkışımda uln kullandıgım için 0 la kontrol ediyorum girişleri
a giriş
b
çıkış
fakat sorunum su sensörden arka arkaya 1 0 1 0 1 0 bilgileri geliyo.her 1 geldiginde degiskenimi arttrıyo.mesela 1sn görüyo arttryo sonra sıfırlayamıyorum yazmama ragmen.
 
benim için çok iyi bi referans olcak arkadaslar yardımcı olursanız cok sevinrm
 
int16 buton_sure;

buton_sure=0;
while(BUTON)
{
delay_ms(10); // 10 ms aralıklarla okumak hiçbir sakınca yaratmaz ama daha hassas olsun dersen 1 ms alabilirsin.
restart_wdt();
buton_sure++;
}

if(buton_sure==50); // 50ms gibi

böyle bir yapı kullanabilirsin.
Teşekkürler
 
şu şekilde basit bir çözüm olabilir. WDT kapalı olduğu için wdt reset'e gerek yok. wdt reset sadece watchdog timer ı sıfırlar. başka hiçbir yere etki etmez.

int16 sure;

while(1) // Sonsuz döngü için
{
sure=0;
while(sensor) // sensörden sıfır gelince otomatik bırakır.
{
sure++;
delay_us(100); // çok daha hassas olması için her pin denetimini 100 mikro saniye aldım. bu ürünün sensörden geçme süresi değil.
}

// sure artık geçen süredir.
}

veya bu tür işlerde kullanılan en güzel yöntem portb'nin port change interruptını kullanmak.

harika oldu çok teşekkürler!
 

Forum istatistikleri

Konular
129,787
Mesajlar
930,102
Kullanıcılar
452,567
Son üye
johncadvi

Yeni konular

Geri
Üst