Bir Butonla Animasyon geçişi yapmak ?

Başlatan gokan_guney, 07 Şubat 2013, 08:05:13

gokan_guney

Yaptığım devrede arkadaşla şimdi bir buton olacak. Bu buton ile bir defa basınca ilk animasyon çalışacak yani sadece ledler yanacak. 2. defa basılınca diğer animasyona geçecek bunda da animasyon biraz farklı 3 porttan olan ledler sırasıyla yanacak ama bunu bir defa yaptıktan sonra 3. port artık sabit yanıp diğer iki prot sırasıyla yanıp sonecek yanı ok işaretleriyle ortadaki harfi gösterecekmiş gibi yapacak. Elektrik kapandığı ve belli zaman sonra tekrar verildiğinde ise hangisinde kaldıysa ondan tekrar devam etmesini sağlanacak bu animasyonlar belki çoğaltılabilir ama bu kadarlık bana yetiyor şuan. Devrede bir çok stilde yazdım bir türlü tutturamadım :) yardımclaırnız bekliyorum kodları inceleyip cevap verirseniz sevinirim. uzun zaman oldu fazla da uğraşmadığımdan ccs c ile biraz aramız kötü diyebilirim ama tekrar toparlamaya çalışıyorum bakalım :)

1. stil :

#include <16f84A.h>
#fuses XT, NOPROTECT
#use delay(clock=4000000)

#use fast_io(b)

#define buton pin_A2

int a;

void main()
{
basla:
set_tris_b(0x00);
set_tris_a(0b00100);

if(input(buton))
{
a++;
    if(a=1)
      {
         do
         {
         output_high(pin_b1);
         }while(a=2);
      }
     else if(a=2)
      {
         do
         {
         output_high(pin_b0);
         output_high(pin_b2);
         output_high(pin_b1);
         delay_ms(500);
         output_low(pin_b2);
         output_low(pin_b0);
         delay_ms(100);
         output_high(pin_b0);
         output_high(pin_b2);
         delay_ms(100);
         output_low(pin_b2);
         output_low(pin_b0);
         delay_ms(100);
         output_low(pin_b2);
         output_low(pin_b0);
         delay_ms(100);
         output_high(pin_b0);
         output_high(pin_b2);
         delay_ms(100);
         output_low(pin_b2);
         output_low(pin_b0);
         } while(a=3);
      }
     else if(a=3)
      {
      goto basla;
      }
}
}



2. Stil:

if(input(buton))
{
a++;
   switch (a)
      {

      case 1:
         output_high(pin_b1);
         break;
         
      case 2:   
         output_high(pin_b0);
         output_high(pin_b2);
         output_high(pin_b1);
         delay_ms(500);
         output_low(pin_b2);
         output_low(pin_b0);
         delay_ms(100);
         output_high(pin_b0);
         output_high(pin_b2);
         delay_ms(100);
         output_low(pin_b2);
         output_low(pin_b0);
         delay_ms(100);
         output_low(pin_b2);
         output_low(pin_b0);
         delay_ms(100);
         output_high(pin_b0);
         output_high(pin_b2);
         delay_ms(100);
         output_low(pin_b2);
         output_low(pin_b0);
         break;
         
      case 3:
         a=1;
         break;
         
      default:
         break;
      }
     
}
}


3. stil:

if(input(buton))
{
   a++;
   delay_ms(50);
}
   else if(a=1)
      { 
         while(True)
         {
         output_high(pin_b1);
         delay_ms(50);
         if(a=2)
            {
            break;
            }
         }
      }
   else if(a=2)
      {
         while(True)
         {
         output_high(pin_b0);
         output_high(pin_b2);
         output_high(pin_b1);
         delay_ms(500);
         output_low(pin_b2);
         output_low(pin_b0);
         delay_ms(100);
         output_high(pin_b0);
         output_high(pin_b2);
         delay_ms(100);
         output_low(pin_b2);
         output_low(pin_b0);
         delay_ms(100);
         output_low(pin_b2);
         output_low(pin_b0);
         delay_ms(100);
         output_high(pin_b0);
         output_high(pin_b2);
         delay_ms(100);
         output_low(pin_b2);
         output_low(pin_b0);
         if(a=3)
            {
            break;
            }
      }
      }
      else if(a=3);
         {
            a=0;
            goto basla;
         }
}



valla kaba taslak gece yarısı yazdığım kafamın karman çorman olduğu halde bezmeden yazmaya çalıştığım kodlar bazıları saçma sapan olabilir ama en azından denemek için yazdım :D :D  yardım eden herkese teşekkür ederim...


artapon

hocam ne tür bir problemle karşılaşıyorsunuz.

Aldanma İnsanların Samimiyetine, Menfaatleri İçin Gelirler Vecde, Vaad Etmeseydi Allah cenneti, O'na Bile Etmezlerdi Secde!   (NFK)

gokan_guney

Devrede hiç işlem yapmıyor buton işlem uyguluyor similasyonda pice ama pic in  led baglı olan portlarından çıkış yok sabit kalıyor proteusta deniyorum olmuyor yani yazılımsal hatadır diye düşünüyorum.

trgtylcnky

İlk göze çarpan hata: if(a=1) yazmışsınız, a==1 olacaktı. a=1 sonucu (ya da a=2, a=3) hep true değeri dönderir.
Ayrıca butona bastığınızda döngüden çıkmaz çünkü o input fonksiyonu sadece çalıştığı anda pini okur ve o anki değeri döndürür. Her butona bastığınızda çalışmaz, sadece kodda sırası geldiğinde çalışır..

ziyaretci

#4
#define buton pin_a0

int mod=0;

  Void islemler_1(){
  

   }

Void islemler_2(){
  

 }


 Void main(){

  FOR(;;){
     if(input(buton)){while(input(buton)); mod++; }   

/*butona basıldığı sürece while döngüsünü döndürüyoruz, butondan elimizi çektiğimizde while döngüsü koşulu false(sıfır) olduğundan koşul yanlış olur ve döngüden çıkar bir artırır. While kullanmasaydık  butona basıp elimizi çektiğimizde belki 100 belkide 1000 defa dönecekti, 1000 defa dönmesi demek mod değişkenini 1000 defa arttırır.Yani bizim 1 ve 2 rakamlarını tutturmamız 1000 de 2 olurdu butona basıp bıraktığımızda. Bunun önüne while döngüsü sayesinde geçtik. */
    
   if(mod==3){mod=0;}   //Mod değişkeni 3 ise modu 0 yaptık  

   if(mod==1){  islemler_1();}
   if(mod==2){  islemler_2();}  

   }

}

gokan_guney

Yalnız devre butona basıldığı sürece led yanmayacak bir defa basınca sürekli led yanacak. Yani butona bir defa basıldığında devreye girecek  2.defa basınca da öbür animasyona geçip o sürekli çalışacak. Bu şekilde olmayacak muhtemelen çünkü while orda butona basıldığı sürece çalışmasını sağlıyor anladığım kadarıyla ama bir deneyecem bakayım.

ozcan412

#6
Butonu kesmede kontrol etmenizi tavsiye ederim.. yoksa bu şekilde yapman biraz zor..
Kesme olarak timer ile oluşturduğunuz kesmeyi kullanabilirsiniz fakat bu sefer de, delay_ms(); komutları kesme oluşmasını engelleyecektir..
O yüzden, butonu B4-B5-B6 pinlerinden birine bağlayıp, "B portu değişiklik" kesmesini (#int_RB) kullanabilirsin..

trgtylcnky

Ben bir öneride bulunayım:

void main(){
  int a=1;
  
  while(1){
    
    if(input(buton)){     
      delay_ms(1); //ark sonucu istenmeyen tekrarları engellemek için
      if(a==2) a=1;
      else a++;
      while(input(buton)){} //butonu bırakmadan geçmeyecek
      delay_ms(1); //yine ark olayı
    }
    
    if(a==1){
      output_high(pin_b1);
    }
    else if(a==2){
      output_high(pin_b0);
         output_high(pin_b2);
         output_high(pin_b1);
         delay_ms(500);
         output_low(pin_b2);
         output_low(pin_b0);
         delay_ms(100);
         output_high(pin_b0);
         output_high(pin_b2);
         delay_ms(100);
         output_low(pin_b2);
         output_low(pin_b0);
         delay_ms(100);
         output_low(pin_b2);
         output_low(pin_b0);
         delay_ms(100);
         output_high(pin_b0);
         output_high(pin_b2);
         delay_ms(100);
         output_low(pin_b2);
         output_low(pin_b0);
    }
  }
}


Deneme imkanım yok onun için nasıl çalışacağından emin değilim. Sizin kodlarınızdaki animasyonları aldım.

ziyaretci

Alıntı yapılan: gokan_guney - 07 Şubat 2013, 20:34:43
Yalnız devre butona basıldığı sürece led yanmayacak bir defa basınca sürekli led yanacak. Yani butona bir defa basıldığında devreye girecek  2.defa basınca da öbür animasyona geçip o sürekli çalışacak. Bu şekilde olmayacak muhtemelen çünkü while orda butona basıldığı sürece çalışmasını sağlıyor anladığım kadarıyla ama bir deneyecem bakayım.

  Algoritman yeni yeni oluşuyor onu anladım da, bu ön yargıyı anlayamadım?

gokan_guney

#9
"trgtylcnky" senin kodu denedim seninki ile "erkantr67" verdiği kod aynı çalışıyor biraz değiştirme ile sadece 3. defa butona basınca başa dönmüyor yani 1. animasyona dönmüyor 2 side aynı durumda şuanda :)

#include <16f84A.h>
#fuses XT, NOPROTECT
#use delay(clock=4000000)

#use fast_io(b)

#define buton pin_A2

void main()
{
  int a=1;
   
set_tris_b(0x00);
output_b(0x00);
set_tris_a(0b00100);
  
  while(1){
    
    if(input(buton)){     
      delay_ms(1); //ark sonucu istenmeyen tekrarları engellemek için
      if(a==2) a=1;
      else a++;
      while(input(buton)){} //butonu bırakmadan geçmeyecek
      delay_ms(1); //yine ark olayı
    }
    
    if(a==1){
      output_high(pin_b2);
      delay_ms(20);
    }
    else if(a==2){
         output_low(pin_b2);
         delay_ms(50);
         output_high(pin_b1);
         delay_ms(50);
         output_high(pin_b3);
         delay_ms(50);
         output_high(pin_b2);
         delay_ms(50);
         while(True)
         {
         output_low(pin_b1);
         delay_ms(50);
         output_low(pin_b3);
         delay_ms(50);
         output_high(pin_b3);
         delay_ms(50);
         output_high(pin_b1);
         delay_ms(50);            
         }
    }
  }
}


"erkantr67"  desteklerinden dolayı çok teşekkür ederim


"erkantr67" Ön yargı değil de farklı şekilde düşündüm ondan dolayı öyle söyledim sonradan başka bişey yapınca olayı çözdüm yani birde senin yazdığını deniyorum üstünde baya oynadım şuan çalışır sayılır ama geçiş yapıyorum ama tekrar en başa dönmesini istediğimde dönmüyor şuan onla uğraşıyorum. Bu arada yanlış bir şey söylediysem kusura bakmayın gerçekten amacım sadece emin olmak için birde o anlık farklı bir şey geçen düşünceme göre söyledim. Tekrardan teşekkür ederim her şey için kusura bakmayın.



Devre dediğim gibi geçiş yapmıyor ne denediysem olmadı while döngüsüne koydum döngüden çıkartamıyorum bir türlü en başa mod==1 dönmüyor butona basınca direk geçmiyor hatta hiç geçmiyor :)

birde buna en son hangi modda kaldıysa elektriğini kesip belli bir zaman sonra tekrar verildiğinde aynı kaldığı animasyondan nasıl çalıştırmasını sağlayabilirim?

Bu arada bu kodları bu şekilde burada ne yaptıysam atmamın nedeni de başka inceleyen bu işle uğraşmak isteyen arkadaşlar buralarda nasıl yollar izlenilmiş neler yapılmış onları da görür ve hem de forumda sürekli kod blokları kod çalışmaları ön plana çıkar zamanım oldukça farklı projelerde yapıp yayınlayacağım. Yardımcı olan arkadaşlar sadece bna yardımcı olmuyorlar diğer arkadaşlar incelerken de anlamaya yorumlamaya çalışıp öğreniyorlar :) Yanlışsa söyleyin

#define buton pin_A2

int mod=1;

//1.Mod kısmı
  Void islemler_1()
   {
  output_high(pin_b2);
  }
  
//2.Mod kısmı
  void islemler_2()
   {
         output_low(pin_b2);
         delay_ms(50);
         output_high(pin_b1);
         delay_ms(50);
         output_high(pin_b3);
         delay_ms(50);
         output_high(pin_b2);
         delay_ms(50);
         while(True)
         {
         output_low(pin_b1);
         delay_ms(50);
         output_low(pin_b3);
         delay_ms(50);
         output_high(pin_b3);
         delay_ms(50);
         output_high(pin_b1);
         delay_ms(50);         
  }
 }
 Void main(){
 
set_tris_b(0x00);
output_b(0x00);
set_tris_a(0b00100);

  FOR(;;){
   if(input(buton)){while(input(buton)); mod++; }       
   if(mod==1){  islemler_1();}
   if(mod==2){  islemler_2();}
   if(mod==3){mod==1;} //Mod değişkeni 3 ise modu 1 yaptık  
   }
}

ziyaretci

#10
Void islemler_2() de while döngüsü kurmuşsun oradan geri gelmez sayıcı. Mod 2 ye gittiğinde orada kalır.


Ben 2. moddan sonra devreyi kapattım sen 2. moddan sonra 1. moda geçmesini istiyorsan  if(mod==3){mod=1;} yaparsan mod 2 den sonra 1 den başlar tekrar.

  Mod 2 de while döngüsündeki komutları kaldır ve sadece void islemler_2() alt programına ekle. Ama gecikme kullandığın için alt programdaki gecikmelerin toplamı kadarından biraz fazla butona basılı tuttup bırakman gerekiyor.


 
#define buton pin_A2

int mod=1;

//1.Mod kısmı
  Void islemler_1()
   {
  output_high(pin_b2);
  }
  
//2.Mod kısmı
  void islemler_2()
   {
         output_low(pin_b2);
         delay_ms(50);
         output_high(pin_b1);
         delay_ms(50);
         output_high(pin_b3);
         delay_ms(50);
         output_high(pin_b2);
         delay_ms(50);
         while(True)
         {
         output_low(pin_b1);
         delay_ms(50);
         output_low(pin_b3);
         delay_ms(50);
         output_high(pin_b3);
         delay_ms(50);
         output_high(pin_b1);
         delay_ms(50);         
  }
 }
 Void main(){
 
set_tris_b(0x00);
output_b(0x00);
set_tris_a(0b00100);

  FOR(;;){
   if(input(buton)){while(input(buton)); mod++; }  
   if(mod==3){mod==1;} //Mod değişkeni 3 ise modu 1 yaptık       
   if(mod==1){  islemler_1();}
   if(mod==2){  islemler_2();}
  
   }
}




Alt programlarda gecikme vereceksen yapmak istediğini kesme ile yap örnek olarak;


#define buton pin_b7
int mod=1;
  #int_rb
 Void butonlar(){
    if(input(buton)){while(input(buton));mod++;}
    if(mod==3){mod=1;}
   }
 
 Void main(){
  for(;;){
      if(mod==1){       yapmak_istediklerin; }
      if(mod==2){       yapmak_istediklerin; }

      enable_interrupts(int_rb);   // RB4-RB7 kesmeleri aktif
      enable_interrupts(Global);   // Bütün kesmeler aktif

    }
  }


Burada da diğer moda geçmesi için bulunduğu bloktaki  komutları bitirmesi gerekir.Şartı tekrar kontrol edinceye kadar yani.

gokan_guney

Şimdi en son durumu paylaşayım arkadaşlar kesmeye girmedim tam bilemedim yapmayı o yüzden uğraşmadım en son komutları şu şekilde yaptım:

#include <16f84A.h>
#fuses XT, NOPROTECT
#use delay(clock=4000000)

#use fast_io(b)
#use fast_io(a)
#define buton pin_A2

int a=1;
 
void main()
{
 
set_tris_b(0x00);
output_b(0x00);
set_tris_a(0b00100);
basla: 
  while(1){    
    if(input(buton)){     
      delay_ms(1); //ark sonucu istenmeyen tekrarları engellemek için
      if(a==3) a=1;
      else a++;
      while(input(buton)){} //butonu bırakmadan geçmeyecek
      delay_ms(1); //yine ark olayı
                  }
    
    if(a==1){
      output_high(pin_b2);
      delay_ms(20);
    }
    else if(a==2){
    
         output_low(pin_b2);
         delay_ms(50);
         output_high(pin_b1);
         delay_ms(50);
         output_high(pin_b3);
         delay_ms(50);
         output_high(pin_b2);
         delay_ms(50);
         tekrar:
            output_low(pin_b1);
            delay_ms(50);
            output_low(pin_b3);
            delay_ms(50);
            output_high(pin_b3);
            delay_ms(50);
            output_high(pin_b1);
            delay_ms(50);
            if(input(buton))
            {
               a==1;
               output_low(pin_b1);
               output_low(pin_b3);
               goto basla;
            }
         goto tekrar;
         } 
  }
}



şimdi kafama takılan meselede şudur elektriği kestiğimde devrenin belli bir zaman sonra tekrar verdiğimde hangi modda kaldıysa ondan aynı şekil çalışmasına devam etmesini istiyorum. Eprom ile ilgili bir kısım ama tam bu devrede menüler arasında mı olacak nasıl olacağını tam çözemedim bu konuda biraz bilgi verebilen bir arkadaş olursa çok sevinirim.

"erkantr67" verdiğin ilk kod modlu da geri dönüş bir türlü olmadı o yüzden o kodlarla yapamadım. 2. verdiğin kesmeli komutlarda da benim devreye uyarladım ama animasyonlar çalışmadı  sabit kaldı devre. Bende en son "trgtylcnky" verdiğin kodlar üzerinde denedim geri dönüşü daha rahat yaptırdım. Herkese ayrı ayrı teşekkür ederim burada bilen arkadaşların yardımcı olmaları çok güzel bu forumun o yüzden ayrı bir yeri var bende :) :)

gokan_guney

eprom komutlarıyla ilgili bilgi verecek arkadaşları bekliyorum en azından yönledirme yapsalar güzel olur benim için bu noktada biraz karışıklık var.