pıc 16f877a ile 14 giriş 14 çıkış on- off

Başlatan semli, 25 Haziran 2015, 17:29:10

semli

Arkadaşlar konu başlığında dediğm gibi 16f877a ile 14 giriş buton ile 14 çıkış on off yapmak istiyorum.Kod yazmada yeniyim resimdeki ne tabloda ne eklemem veya ne çıkarmam gerekir.

#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay(clock=4000000)
#use fast_io(a)
#use fast_io(b)
#use fast_io(c)
#use fast_io(d)
#use fast_io(e)
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(0x0F);
set_tris_b(0x00);
set_tris_c(0x0F);
set_tris_d(0x00);
set_tris_e(0x0F);
output_b(0x00);
output_d(0x00);

{
  while(TRUE)
  {
         if(input(pin_a0)==1)
         {
         while(input(pin_a0)==1);
         output_toggle(pin_b0);
         delay_ms(50);
         }
   
         
   
  {
         if(input(pin_a1)==1)
         {
         while(input(pin_a1)==1);
         output_toggle(pin_b1);
         delay_ms(50);
         }
   
   {
         if(input(pin_a2)==1)
         {
         while(input(pin_a2)==1);
         output_toggle(pin_b2);
         delay_ms(50);
         }
   
   
   
  {
         if(input(pin_a3)==1)
         {
         while(input(pin_a3)==1);
         output_toggle(pin_b3);
         delay_ms(50);
         }
    {
         if(input(pin_a4)==1)
         {
         while(input(pin_a4)==1);
         output_toggle(pin_b4);
         delay_ms(50);
         }
   
         
   
  {
         if(input(pin_a5)==1)
         {
         while(input(pin_a5)==1);
         output_toggle(pin_b5);
         delay_ms(50);
         }
     
          {
         if(input(pin_c0)==1)
         {
         while(input(pin_c0)==1);
         output_toggle(pin_b6);
         delay_ms(50);
         }
   
       
   
  {
         if(input(pin_c1)==1)
         {
         while(input(pin_c1)==1);
         output_toggle(pin_b7);
         delay_ms(50);
         }
       
      {
         if(input(pin_c2)==1)
         {
         while(input(pin_c2)==1);
         output_toggle(pin_d2);
         delay_ms(50);
         }
   
         
   
  {
         if(input(pin_c3)==1)
         {
         while(input(pin_c3)==1);
         output_toggle(pin_d3);
         delay_ms(50);
         }
         
{
         if(input(pin_c4)==1)
         {
         while(input(pin_c4)==1);
         output_toggle(pin_d4);
         delay_ms(50);
         }
         
       {
         if(input(pin_e0)==1)
         {
         while(input(pin_e0)==1);
         output_toggle(pin_d5);
         delay_ms(50);
         }
         
  {
         if(input(pin_e1)==1)
         {
         while(input(pin_e1)==1);
         output_toggle(pin_d6);
         delay_ms(50);
         }
         
   {
         if(input(pin_e2)==1)
         {
         while(input(pin_e2)==1);
         output_toggle(pin_d7);
         delay_ms(50);
         }
   {
       

}

  }
  }
  }
  }
    }
  }
    }
  }
  }
  }
}
}
  }
  }
  }
}
 

semli

Yardım  edbilecek kimse yok mu acaba pıc ın girişlerini bağımsız çıkışlarını bağımsız kullanmak istiyorum.pull-up direnci ile

sifirzero

kardeşim sen bununla geliştirip çalıştırabilirisn.bu kodlar çaışıyor.
#include <main.h>  
#use delay (clock=4m) 
#FUSES MCLR,XT
void main()
{

set_tris_a(0xff);
set_tris_b(0x00); 
             
output_b(0x00100000);
 
 for(;;)  // for sonzuz döngüsü
  {  
    
   if(input(pin_a0)) 
{
     while(input(pin_a0));
     output_toggle(pin_b0);
}  
     
if(input(pin_a1)) 
{
     while(input(pin_a1));
     output_toggle(pin_b1);
}

if(input(pin_a2)) 
{
     while(input(pin_a2));
     output_toggle(pin_b2);
}
                             
if(input(pin_a3)) 
{
     while(input(pin_a3));
     output_toggle(pin_b3);             
}
  
if(input(pin_a4)) 
{
     while(input(pin_a4));
     output_toggle(pin_b4);
}                                            
  
   
   if(input(pin_b5))
{
   while(input(pin_b5));                              
   output_b(0x00);
}    
   
                                                                       
  }                                        
       
                                 
}   
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

semli

İlgilendiğin için teşekkürler ama bu komutlar  sıra ile işlem  yapıyor.Ben bağımsız olarak yapmaya çalışıyorum.onu nasıl ayırabilirim

baran123

Bağımsız diye bir şey yok.Sonuçta hepsini sıra ile tarıyor.Siz bu hızı fark edemezsiniz zaten.

RaMu

Önce algoritmanızı oluşturun,
yani kodu sözle yazın,
sonrası kolay.

Şu olursa şunu yap,
bu olmazsa ama şuda oluyorsa şunu yapma,
şöyle olduğu sürece bunu yap, şunu yap.

Butona basıldı mı?
   Evet> ledi yak
   Hayır> tekrar butonu kontrol et.
buton bırakıldımı?
   Evet > ledi söndür
   Hayır >bırakılana kadar butonu kontrol et ( bırakılmasını bekle )

veya_________________________________________________
buton1 basıldımı
  evet > led1 i yak
  hayır > buton 2 yi kontrol et

buton2 basıldımı
  evet > led2 i yak
  hayır > buton 3 yi kontrol et

buton3 basıldımı
  evet > led3 i yak
  hayır > buton 4 yi kontrol et
.
.
.
butonX basıldımı
  evet > ledX i yak
  hayır > buton 1 i kontrol et (başa git)

gibi...

Tabi bunları yaptıktan sonra
artık daha az kodla aynı işi nasıl yaptırırım gibi şeyler düşünürsün.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

sifirzero

Bagimsiz calisiyor.kodlari denedin mi ki.verdigim kodlar super tam senlik bence
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

Recep METE

Alıntı yapılan: semli - 04 Temmuz 2015, 19:33:48
İlgilendiğin için teşekkürler ama bu komutlar  sıra ile işlem  yapıyor.Ben bağımsız olarak yapmaya çalışıyorum.onu nasıl ayırabilirim
Bağımsız olarak işlem yaptırmak istiyorsanız FPGA öğrenmelisiniz.
printf(lcd_putc,"\f  Ne kadar okursan oku, bilgine, yakışır şekilde davranmıyorsan cahilsin demektir.  \n   semfero");d

polleme

Bir diğer yöntem kesme kullanmak. Böylece tüm tuşların basıldığını sürekli denetlemeniz gerekmez, hangisine basıldı ise o anda kesme rutinine dallanır ve istediğiniz çıkışı değiştirirsiniz.

F.T

polleme hocanın dediği yöntem en güzeli kesmede sürekli tuşlara bak.hangi tuş basıldı ise bir değişkeni bit olarak aktif yap.Daha sonrada ana programda aktif olan bit ile alt programa gir ve işini bitir.biti sıfırla.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

semli

Alıntı yapılan: sene35 - 11 Temmuz 2015, 00:31:14
Bagimsiz calisiyor.kodlari denedin mi ki.verdigim kodlar super tam senlik bence

Denedim hocam tek buton olarak evet her giriş -çıkış on off olarak çalışıyor.Fakat ikinci butonu ilave ettiğimde işlem sıra ile çalışıyor.yani ra0 girişi on ra1 on böyle devam ediyor son girişe kadar son girişten sonra tekrar ra0 ile off sıralaması devam ediyor.

semli

Alıntı yapılan: polleme - 11 Temmuz 2015, 13:12:50
Bir diğer yöntem kesme kullanmak. Böylece tüm tuşların basıldığını sürekli denetlemeniz gerekmez, hangisine basıldı ise o anda kesme rutinine dallanır ve istediğiniz çıkışı değiştirirsiniz.

Peki hangi kesmeyi kullanmam gerekir.Örnek verebilirmisiniz 

RaMu

Öncelikle kodların ne yaptığını-nasıl çalıştığını öğrenmelisin.

Butona basıldığında 1 gelecek şekilde bağlı diyelim.
         if(input(pin_a0)==1)          //A0 butonuna basıldımı
         {                                         //evet ise if in içi işlenir
         while(input(pin_a0)==1);  //A0 butonu basılı olduğu sürece bu satırı işle bknz:açıklama 1
         output_toggle(pin_b0);     //b0 pinini toggle et,
         delay_ms(50);                   //50ms bekle
         }
açıklama1  while(input(pin_a0)==1); satırında
input(pin_a0) ile A0 pininin durumu öğrenilir,
sonra 1 e eşitmi diye sorgulanır,
bu sorunun sonucu evet ise bu satır artık while(1); demektir,
while(1); sonunda noktalı virgül varsa sürekli bu while döngüsünü işle anlamına gelir,
yani while(input(pin_a0)==1); satırında A0 pininin durumu sürekli sorulanarak
0 olana kadar bu satırda kalınır,
buda buton bırakılana kadar bu satırı işle demek olur.


Şimdi bu kod senin istediğin işlemi yapamaz.
Mantık hatası var,
algoritma yanlış.

Sen 3-5 butona dahi beraber basılması durumundada
ledlerin toggle olmasını istiyorsun.
Önce bunun algoritmasını çıkarmalısın.

Aslında ccsc de bu işi yapacak yada çoğunluğunu yapacak
bir komut var fakat önce mantığını anlamakta fayda var.

Aynı işi yapacak bir çok farklı kod yazılabilir.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

semli

[#include <16f877.h>
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP
#use delay(clock=4000000)
int1 x;


void main()
{
set_tris_a(0xff);
set_tris_b(0x00);

basla:


x=input(pin_a0);
delay_ms(40);
output_bit(pin_b0,x);
x=input(pin_a1);
delay_ms(40);
output_bit(pin_b1,x);
x=input(pin_a2);
delay_ms(40);
output_bit(pin_b2,x);
x=input(pin_a3);
delay_ms(40);
output_bit(pin_b3,x);
x=input(pin_a4);
delay_ms(40);
output_bit(pin_b4,x);
x=input(pin_a5);
delay_ms(40);
output_bit(pin_b5,x);
goto basla ;


}]
bu şekilde pinleri bağımsız kullanabiliyorum fakat toggle yapamıyorum

mehmet

Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr