Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Değişken arttırma

Başlatan tabutcu, 11 Ekim 2013, 19:42:05

tabutcu

Merhaba şöyle bir kod yazdım
if(input(pin_a0))
  {
  veri++;
  }
  if(veri==1)
  output_high(pin_b0);
  if(veri==2)
  output_high(pin_b1);
  }

a0 pinindeki butona her basışta veri değişkeni 1 değer artacak ancak burda butona bir kez basınca veri değişkeni hem 1 hem 2 oluyor sorun nedir ?

Klein

çünkü A0'a bağlı buton  basılı olduğu sürece  veri değişkenin artmaya devam ediyor.

bir durum biti kullanman gerek.
char status =0;

if( input(pin_a0) &&  status)
{
   veri ++;
   status =0;
} else if( input(pin_a0) == 0){
   status=1;
}



Recep METE

#2
if(input(pin_a0))  { delay_ms(10); while(input(pin_a0)); 
  {
  veri++;
  }
  if(veri==1)
  output_high(pin_b0);
  if(veri==2)
  output_high(pin_b1);
  }



eğer tuşa basma komutu yazıyorsan "if(input(pin_a0)){ delay_ms(10); while(input(pin_a0));"
  "while" bekleme komutu vermelisin.Yoksa "debounce" yani sıçrama olayı meydana gelir.Birkez bassan dahi 2 yada 3 kez basmış gibi işlem görür   
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

tabutcu

Alıntı yapılan: semfero - 11 Ekim 2013, 20:39:42
if(input(pin_a0))  { delay_ms(10); while(input(pin_a0)); 
  {
  veri++;
  }
  if(veri==1)
  output_high(pin_b0);
  if(veri==2)
  output_high(pin_b1);
  }



eğer tuşa basma komutu yazıyorsan "if(input(pin_a0)){ delay_ms(10); while(input(pin_a0));"
  "while" bekleme komutu vermelisin.Yoksa "debounce" yani sıçrama olayı meydana gelir.Birkez bassan dahi 2 yada 3 kez basmış gibi işlem görür

Cevabınız için teşekkür ederim gerçekten işime yaradı iyi akşamlar  :)

tabutcu

if(i==2)
  {
  output_high(pin_b1);
  delay_ms(20);
  output_low(pin_b1);
  delay_ms(20);
  }


i değişkeni 2 olduğunda devreye giren bu komutu nasıl sonsuz döngüye sokabiliriz ? i değeri 3 oluncaya kadar.

Recep METE

Sorununu tam anlayamadım ama aşağıya yazdığım kodu incele sana fikir verecektir.Ya da bu işine yaramazsa daha net yazarsan yardımcı olurum.



while(1)
{
   if(input(pin_a0))  { delay_ms(10); while(input(pin_a0)); 
  {
  veri++; if(veri==5) veri=1;
  }
  if(veri==1)
  output_high(pin_b0);
  
  if(veri==2)
  output_high(pin_b1);
  
  if(veri==3)
  output_low(pin_b0);
  
  if(veri==4)
  output_low(pin_b1);
  
  }

}


printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

tabutcu

Alıntı yapılan: semfero - 11 Ekim 2013, 23:04:49
Sorununu tam anlayamadım ama aşağıya yazdığım kodu incele sana fikir verecektir.Ya da bu işine yaramazsa daha net yazarsan yardımcı olurum.



while(1)
{
   if(input(pin_a0))  { delay_ms(10); while(input(pin_a0)); 
  {
  veri++; if(veri==5) veri=1;
  }
  if(veri==1)
  output_high(pin_b0);
  
  if(veri==2)
  output_high(pin_b1);
  
  if(veri==3)
  output_low(pin_b0);
  
  if(veri==4)
  output_low(pin_b1);
  
  }

}


Hocam bir üst yorumda gösterdiğim kod b0 pinini 20ms aralıklar ile high low yapıyor ama butona basılı olduğu sürece.Ben butona 1 kere basınca başka bir komut gönderene kadar b0 pininin 20ms aralıklarla high low olmasını istiyorum

mistek

if(i==2)
  {
   while(1){
  output_high(pin_b1);
  delay_ms(20);
  output_low(pin_b1);
  delay_ms(20);
   if(başka komut)
       break;
     }
  }

//diğer komutlar
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

tabutcu

Alıntı yapılan: mistek - 12 Ekim 2013, 09:02:21
if(i==2)
  {
   while(1){
  output_high(pin_b1);
  delay_ms(20);
  output_low(pin_b1);
  delay_ms(20);
   if(başka komut)
       break;
     }
  }

//diğer komutlar


Hocam bu şekilde yazınca ilk komut işliyor ardından 2. komuta geçiyor ve orda kalıyor.

mistek

if(i==2)
  {
   while(1){
  output_high(pin_b0);
  delay_ms(20);
  output_low(pin_b0);
  delay_ms(20);
   if(başka komut)
       break;
     }
  }

i=2 olduğunda sonsuz döngüye girer başka komut gelene kadar sonsuz döngüde kalır. Ben öyle anladım.

Alıntı yapılan: tabutcu - 12 Ekim 2013, 08:14:11
Ben butona 1 kere basınca başka bir komut gönderene kadar b0 pininin 20ms aralıklarla high low olmasını istiyorum

boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

Recep METE

#10
Arkadaşım senin yapmak istediğin böyle bir şey mi.Her led de  farklı döngü çalışıyor

VİDEOSU:

http://youtu.be/ZtHWzIJe-Z8
%100 %100 Ekle İptal 
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

tabutcu

Alıntı yapılan: semfero - 13 Ekim 2013, 01:39:07
Arkadaşım senin yapmak istediğin böyle bir şey mi.Her led de  farklı döngü çalışıyor

VİDEOSU:

http://youtu.be/ZtHWzIJe-Z8
%100 %100 Ekle İptal

Evet hocam.

Recep METE

Bu şekilde her butona basışta farklı döngülere girmek "do-while" döngüsü ile yapılıyor.İstersen yukarıdaki örneğin kodlarını buraya gönderebilirim.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

tabutcu

Alıntı yapılan: semfero - 13 Ekim 2013, 14:43:40
Bu şekilde her butona basışta farklı döngülere girmek "do-while" döngüsü ile yapılıyor.İstersen yukarıdaki örneğin kodlarını buraya gönderebilirim.

Gönderebilirseniz çok iyi olur.

Recep METE

Arkadaşım bu yukarıda videodaki gördüğün animasyonun aynı kodları.Biraz geç oldu ama cevabını görmemiştim.Faydası olması dileğiyle.

#include <16f877.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD // Denetleyici konfigürasyon ayarları
#use delay(clock=4000000)
#use fast_io(a) // Port yönlendirme komutları A portu için geçerli
#use fast_io(b) // Port yönlendirme komutları B portu için geçerli

int i=0;

/********* ANA PROGRAM FONKSİYONU********/

void main ()
{
   setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
   setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
   setup_timer_1(T1_DISABLED);     // T1 zamanlayıcısı devre dışı
   setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
   setup_adc_ports(NO_ANALOGS);    // ANALOG giriş yok
   setup_adc(ADC_OFF);             // ADC birimi devre dışı
   setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x01);    // RA0 ucu giriş olarak ayarlandı.
   set_tris_b(0x00);    // RB0 portu tümüyle çıkış olarak ayarlandı.
   
   output_b(0x00);

 

while(1){
if(input(pin_a0))
{delay_ms(5);while(input(pin_a0));i++;



  if(i==1)
 
   do{
  output_high(pin_b0);
  delay_ms(100);
  output_low(pin_b0);
  delay_ms(100);
  if(input(pin_a0))
  {delay_ms(10);while(input(pin_a0));i++;break;}
   }
   while(1);
   
   
   
   
   if(i==2)

   do{
  output_high(pin_b1);
  delay_ms(100);
  output_low(pin_b1);
  delay_ms(100);
  if(input(pin_a0))
  {delay_ms(10);while(input(pin_a0));i++;break;}
  }
  while(1);
 
 
 
  if(i==3)
   do{
   
  output_high(pin_b2);
  delay_ms(100);
  output_low(pin_b2);
  delay_ms(100);
  if(input(pin_a0))
  {delay_ms(10);while(input(pin_a0));i++;break;}
   }
   while(1);
   
   
   if(i==4) i=0;
   
   }}}
     
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d