zamanlamayla ilgili bir sorun :. yardımcı olursanız sevnrm .:

Başlatan fcure, 17 Ağustos 2011, 15:02:26

fcure

//Fikret CÜRE _ Çalışmalar
#include <16f877.h> // Denetleyici
// Konfigürasyon Ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use fast_io(b)
#use fast_io(a)
//Ana Program Fonksiyonu
void main(){
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);

set_tris_a(0b00000011);
set_tris_b(0x00);
output_b(0x00);
output_high(pin_b0);

while (1){
output_high(pin_b1);
delay_ms(80);
output_low(pin_b1);
delay_ms(80);

if (input(pin_a0))
{output_high (pin_b2) ;}

else 
{output_low (pin_b2) ;}}}


Burada b1 pini 80ms yanıp sonra 80 ms sönük duruyor burada bir problem yok sürekli bir döngüde var.

a0 pinine bağlı butona basıldığı zaman b2 pinine bağlı ledin yanması ve basılmadığı zamanda sönmesi gerekiyor buda doğru ama bu olaylar geç oluyor hocam butona bir süre basıldığı zaman led yanıyor ve butondan çekildiğinde ise bir süre sonra led sönüyor bir geçikme meydana geliyor ve bu geçikme yukarıdaki 80 ms ile orantılı.

bir kaç yöntem denedim ama düzeltemedim.Yardımcı olursanız sevinirim.

esensoy

bu program ile butona bastıktan sonra 0 ila 160 ms arası gecikme ile led yanar,
butonu a0 dan b0 a alıp int0 interruptını da açarsan basar basmaz ledi yakabilirsin.
En tehlikeli an "zafer" anıdır.

tyildizak

80 ms'lik beklemeleri parçalara ayırırsan daha hızlı tepki alırsın:

#include <16f877.h> // Denetleyici
// Konfigürasyon Ayarları
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000)
#use fast_io(b)
#use fast_io(a)
//Ana Program Fonksiyonu
void main(){
setup_psp(PSP_DISABLED);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_adc_ports(NO_ANALOGS);
setup_adc(ADC_OFF);
setup_CCP1(CCP_OFF);
setup_CCP2(CCP_OFF);

set_tris_a(0b00000011);
set_tris_b(0x00);
output_b(0x00);
output_high(pin_b0);

int a;

while (1){
output_high(pin_b1);

for(a=1;a<81;a++){
delay_ms(1);
if (input(pin_a0))output_high (pin_b2) ;
else output_low (pin_b2) ;
}

output_low(pin_b1);

for(a=1;a<81;a++){
delay_ms(1);
if (input(pin_a0))output_high (pin_b2) ;
else output_low (pin_b2) ;
}}}

fcure

eyvallah emresensoy  kardeşim bende onunla uğraşıyorum inşallah çözücem daha yeniyim de

jozzef

Buton mekanik olduğu için basma ve çekme sırasında "noise" oluşur yani sinyal dalgalanır.
Bunu engellemek için buton kontrolü yaptıktan sonra gecikme koymalısınız.


Örneğin:

if (input(pin_a0))
{
     delay_ms(50);
     output_high (pin_b2) ;
}


Ekleyeceğiniz bir diğer kontrolde:

if (input(pin_a0))
{
     delay_ms(50);
     while(input(pin_a0));
     output_high (pin_b2) ;
}


Böylece elinizi butondan çekene kadar bekler.