7448 ile 2-8 arası yukarı sayıcı hatası.

Başlatan proxrth, 30 Mart 2012, 20:37:37

proxrth

Merhaba üstadlar .
Yapmam gereken program ;
RA0 a bağlı butona her basıldığında displayde  2-8 (2 ve 8 dahil) yukarı sayıcı programını yazmam lazım.

Benim yaptığım programda ise butona her bastığımda sayılar değişiyor ama sıralı değil yani önce 2 sonra 8 gibi alakasız şekilde displayde değerler beliriyor.
Programı if ve for döngüsüyle kontrol etmeyi düşündüm fakat for döngüsü ile yaparken aynı zamanda butonu kontrol edemedim.
Benim yazdığım kodlar ;
#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)

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(0xFF);
      output_a(0x00);
      set_tris_b(0x00);
      output_b(0x00);
   
      for (;;)
     { if(input(pin_a0))
      
      {while(input(pin_a0))
      output_b(0b00000010); 
      output_b(0x00);}
      
      
      if(input(pin_a0))
      
      {while(input(pin_a0))
      output_b(0b00000011); 
      output_b(0x00);}
      
      if(input(pin_a0))
      
      {while(input(pin_a0))
      output_b(0b00000100); 
      output_b(0x00);}
      
      if(input(pin_a0))
      
      {while(input(pin_a0))
      output_b(0b00000101); 
      output_b(0x00);}
      
      if(input(pin_a0))
      
      {while(input(pin_a0))
      output_b(0b00000110); 
      output_b(0x00);}
      
      if(input(pin_a0))
      
      {while(input(pin_a0))
      output_b(0b00000111); 
      output_b(0x00);}
      if(input(pin_a0))
      
      {while(input(pin_a0))
      output_b(0b00001000); 
      output_b(0x00);}
     }
   }
           

Devrenin isis şeması.

Şimdiden ilginiz için teşekkürler.

ziyaretci

#1
 Merhaba;

Öncelikle senin yaptığın programda butona bastığında 7 işlem aynı anda gerçekleşmeye başlıyor bir diğer değişle 7 kişi bir kapıdan aynı anda geçmeye çalışıyor.


#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay(clock=4000000)

int i=0;
//DISPLAYDA GÖSTERİLECEK DEĞERLERİ CASE DÖNGÜSÜ İLE TANITTIK//
//Aslında bunu yapmadanda olur fakar bu şekilde yaptığımız işimizi 
//kolaylaştırıyoruz

int display_deger (char d)
  {
    switch(d)
      {
        case 0:return(0b00000010);break;   // 2  //i=0 değerini göster diğerleri pasif
        case 1:return(0b00000011);break;   // 3  //i=1 değerini göster diğerleri pasif
        case 2:return(0b00000100);break;   // 4  //i=2 değerini göster diğerleri pasif
        case 3:return(0b00000101);break;   // 5  //i=3 değerini göster diğerleri pasif
        case 4:return(0b00000110);break;   // 6  //i=4 değerini göster diğerleri pasif 
        case 5:return(0b00000111);break;   // 7  //i=5 değerini göster diğerleri pasif
        case 6:return(0b00001000);break;   // 8  //i=6 değerini göster diğerleri pasif
      }
  }
  
///___ i ___ değerini 1 artırmak için gerekli alt program____///
Void buton()
{
  if(input(pin_a0))
  while(input(pin_a0));
  i ++ ;
}

///___ display de değer göstermek için gereken alt program___//

void deger_goster()
 {
  output_b(display_deger(i));
  buton();
 }

///___ANA PORGRAM__///
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(0x01);      //Ra0 pini giriş yapıldı.
   
For(;;)                    //Sonsuz döngü
      
 {
   if(input(pin_a0))           //Eğer Ra0 a bağlı butona basılırsa 
    {
     deger_goster();            // değer_goster alt programını işle.
    
    }
    
// İşlemin sürekli tekrar edilmesi için gereken komutlar   __////   
        if(i==7)          
         {             
         i-=7;
         
         }  
// işlem tekrar döngü sonu  
      
      }         //sonsuz döngü sonu
   }         //Ana program sonu
    
    
    // Alt programları kullanmazsak 
    ///////////////////////////////////////
    //   For(;;)
    //     { 
    //     if(input(pin_a0))
    //       {   
    //         output_b(display_deger(i));
    //         if(input(pin_a0))
    //           while(input(pin_a0));
    //           i++  ;
    //        }
    //       
    //         if(i==7)          
    //          {             
    //           i-=7;
    //          }
    //       }
    ////////////////////////////////////////
    //  
    // yukarıdaki gibi olurdu.
    //



resimde sürücüyü 7446 olarak okudum ona göre bir örnek yapmıştım. 7448 kullanırsan katod display kullanırsı.
benim yaptığım sürücü çıkışları değil olduğu için anot display kullandım.Video aşağıda



http://www.izlesene.com/video/120330-181649/6036121

proxrth

Teşekkürler @erkantr67
Programda yaptığın // açıklamaları sayesinde daha önce bilmediğim  yeni şeyler öğrendim , ellerine sağlık iyi forumlar.

vedat10

eger 74hc595 kullansaydık degıskenlerı 595 e goremı yapmalıydık
yanı data clock degıskenıyle ben cc s c de yenıyım  ogrenıyorum yardımcı
olmanız ümidiyle....

ziyaretci

merhaba @vedat10

burada yaptığımız butona her basıldığında 2-8 arası display değer göstericek(2-8) dahil   kullandığımız sürücü giriş değerlerine göre display karakterleri çıkış verebilen bir sürücüdür.

daha önce hiç 595 kullanmadım.154 kullandım.Onuda kayan yazı yapmak için. Eğer giriş çıkış sayıları ve değerleri farklı ise tabi kullandığın sürücüye göre değişken hazırlaman gerekiyor.

yasinkir55

while (1)
{
    for(i=0; i<=6; i++)
    {
      if(yak>=8)
      {
       yak=2;
       }
          yak++;
      while(input(pin_a0));
{
output_b(yak);
}
}
}

       
Üniversite'de Benden Yardımını Esirgemeyen Sn. Serdar ÇİÇEK Hocama Çok Teşekkür Ederim. Bu Seviyeye Gelmemde Yardımları Kişisel Olarak Gelişmemde Hocama Tekrardan Çok Teşekkürlerimi Sunarım :)