if döngüsü ile buton kontrol neresinde hata var acaba?

Başlatan gökhan_, 19 Haziran 2012, 12:16:17

gökhan_

merhabalar,
birkaç proje için if döngüsünü kullanmaya calsıtım ama beceremedim,
şu kodun neresinde hata var acaba..
#include <16f877a.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(a)


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   set_tris_b(0x00);
   set_tris_a(0x01);
   output_b(0x00);
   
   haydar:
   if(input(pin_a0))
   {
   output_high(pin_b0);
   while(input(pin_a0));
   
   }
   goto haydar;
   

   // TODO: USER CODE!!

}

serhat1990

Programı aşağıdaki şekilde dene butona basınca hangi durumu sorguluyorsun belli değil..


Ayrıca sana hazırlamış olduğum örneklerde fonksiyonların kullanımını incelemeni öneririm.


#include <16f877a.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(a)


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   set_tris_b(0x00);
   set_tris_a(0x01);
   output_b(0x00);
   
//////////////////////////////////////////////////

while(1)
{

   if(input(pin_a0)==1) //burası butona basınca lojik1 'mi lojik 0 'mı verdiğine göre değişir. Goto komutunu c 'de  kullanmanı pek tavsiye etmem.
   {
   output_high(pin_b0);
   while(input(pin_a0));
   
   }
  }
   

   // TODO: USER CODE!!

}



gökhan_

teşekkür ederim programın aynını yazdım led sürekli yanık kaldı,
while(input(pin_a0));
output_low(pin_b0);
yapınca istediğim şekilde oldu

serhat1990

Ben if döngüsüne tam bakmamışım. İf içerisindede koşul varmış şimdi farkettim. :)

gökhan_

peki şu şekilde bişey düşündüm ama,
butona 3 kez basınca ledi yakıcak..
buda çalışmadı :D
#include <16f877a.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(a)
int1 i=0;


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   set_tris_b(0x00);
   set_tris_a(0x01);
   output_b(0x00);
   while(1)
   {
   if(input(pin_a0)==1)
   {
   while(input(pin_a0));
   i++;
   }
   if(i==3)
   {
   output_high(pin_b0);
   }
   }
}

Andromeda

Akış diyagramı kullanmak işleri kolaylaştırabilir...basit bir program olsada..
" Tanrı, iradesini hakim kılmak için yeryüzündeki iyi insanları kullanır, yeryüzündeki kötü insanlar ise kendi iradelerini hakim kılmak için Tanrı'yı kullanırlar." ..." Tanrı'dan mesaj gelmiyor, biz Tanrı'ya mesaj gönderiyoruz"

omereliusuk

#6
Alıntı yapılan: gökhan_ - 19 Haziran 2012, 18:09:11
peki şu şekilde bişey düşündüm ama,
butona 3 kez basınca ledi yakıcak..
buda çalışmadı :D
#include <16f877a.h>
#fuses XT,NOWDT,NOPUT,NOPROTECT,NOBROWNOUT,NOLVP,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use fast_io(b)
#use fast_io(a)
int1 i=0;


void main()
{

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   
   set_tris_b(0x00);
   set_tris_a(0x01);
   output_b(0x00);
   while(1)
   {
   if(! input(pin_a0))//pin_a0 0'a çekildiği zaman bunu yap.
   {
    i++; 
   while(! input(pin_a0)); ////pin_a0  hala 0'da mı duruyor. tuş hala basılı mı? cevap evet ise tuşu bırakıncaya kadar bekle.
   }
   if(!(i%3))
   {
   output_high(pin_b0);
   }
else
{
output_low(pin_b0);
}
   }
}

eğer pin_a0 I dirençle +5 'e bağladıysan ve butonu şase ile pin_a0 arasına bağladıysan yukarıda yazdığım kod kesinlikle çalışacaktır. kırmızılara dikkat

justice_for_all

bunu bu sekilde tanimlarsan calismamasi normal degilmi

int1 i=0;
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

gökhan_

yeni başladıgım için c diline göre yazdım,ancak sayacın 0 dan başlaması lazım degilmi?

gökhan_

ömer dediğin komutun aynını yazdım şemayıda aynı sekilde yaptım ancak düz buton gibi davranıyor bas-yak,bas-söndür şeklinde

omereliusuk

#10
kardeş int1 i dersen işler değişir. i++ yaptığın zaman i ya 0 olur ya da 1 başka bir değer alamaz ki. int veya int8 de ki o da 3 değerine çıkabilsin.
int1 i=0;int8 i=0;

gökhan_

şimdi int8 dedim bu sefer oldu gibi ama buton 3ncüde degil 2nci basışta ledi yakıyor :D genede teşekkür ederim int1,int8 baska int degeri varmı acaba?

justice_for_all

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay