RA portlarına buton taktım calışmadı :( Heeeeellpp heee

Başlatan crescent, 09 Aralık 2004, 12:11:19

crescent

merhaba arkadaslar benim bir buyuk derdim var gerci buyuk değildirde ben PIC C ye yeni basladıgımdan cozemıyorum.KIsaca olayı anlatayım:

Durum: RA0 ve RA1 i PICC de giris olarak tanımladım ve buton bagladım(anahtar değil buton) RB0 dan RB7 ye kadar olan B portlarınıda cıkıs olarak tanımladım ve 8 tane led i bu cıkıslara tek tek taktım devrede ilk basta bi haraket yok A girisleri Low durumda (butona bastıgım anda Hıgh oluyor yani akım geliyor cekince tekrar low)  RAO=1 oldugunda (yani ilk butona bastıgımda) ledler yukardan assagı dogru ben butona bastıkca sırayla yanıyorlar yani ben butona basıp komut verdikce assagı dogru kayıyorlar. Devreyi tekrar restart edip ikinci butona bastıgımda ise tam ters yonde benim her 2 numaralı butona bastıgımda bir onceki lede gecerek ilerliyorlar(umarım anlatabildim) Yani ilk butona (RA0 a baglı olan) bastıkca ileri dogru kayıyor(her basısta 1 ileri) Devreyi tekrar baslatıp ikinci butona(RA1 e baglı) her bastıgımda geri dogru kayıyor(her basısta 1 geri)

Amacım: İleri ve geri tuslarını aynı anda kullanmak yani devreyi resetlemeden aynı anda hem geri hem ileri tuslarının aktif olmasını ve istedigim anda ornegin tek tek ileri dogru sayarken bir anda 2.butona kullanarak geri geri saydırmak(burada saydırmak diyorum ama sırayla geri yonde ledleri yakmak daha dogru olur)


ileri ileri ileri geri geri geri ileri geri ileri ileri geri geri geri vs.vs.

Sorum: Bu tür bir kontrolu PIC16F84 kullanarak Ve Proteus isis te simule ederek yapmak istiyorum ama bir turlu bir yon aktifken diger butona basılıp aksi yonde hareket emrini C de yapamadım.Yani bir buton ve o butona baglı dongunun komutları calısırken 2.butona basıldıgı anda olayı algılatıp(kesme yapıp) o butona ait goreve gecemedim

BELKİ KOLAY BİR SEY VE EMİNİM BİNLERCE UYGULAMASI VAR AMA BEN BULAMADIM ASSEMBLER BILMIYORUM pıc c İLE NASIL BİR PROGRAM YAPMALIYIM? DEVRE TASARIMIM HATALI DEGİL SORUNUM c PROGRAMINDA

GORUSLERİNİZİ TAVSİYELERİNIZI BEKLİYORUM İNCELEMEK İSTEYEN ARKADASLARA MAIL ILE PROGRAMI VE ISIS TE CIZDIGIM DEVREYI GONDEREBILIRIM.TESEKKURLER

ete

@crescent,

Her şeyden önce daima yazdığınız programı hatalarınızı görebilmemiz için mutlaka yazınıza ekleyiniz. Şimdi sizin nerede hata yaptığınızı bilemiyoruz.
Aşağıda yapmayı düşündüğünüz işi yapabilecek bir program veriyorum. Ancak yinede iki ihtimal var açıklayayım;

Birinci programda ileri tuşuna bastıkça bir led yanıyor ancak önceki led yanmaya devam ediyor. Geri tuşuna bastıkça ledler birer birer sönerek tekrar ilk konuma geliyor kısaca bar-graph tipi led sistemi.
Bunun programı şöyle ben Basic te yazdım. Her halde daha kolay anlarsın.
TrisA=%00000011
TrisB=0
PortA=0
Portb=0

Sayi    var byte
ileri   var PortA.0
Geri    VAR PortA.1

Sayi=0

Basla:
        if ileri=1 then
            sayi=1+sayi*2
            if sayi=0 then sayi=1
        endif
        
        if geri=1 then
            sayi=sayi/2
        endif
        
        portb=sayi
        pause 300
        goto basla


Şimdi ikinci alternatife gelelim. Bu alternatif de ileri tusuna her basışta tek led atlayarak yanıyor. Geri tusuna bastıkça da yanan led ler geriye doğru sayıyor. İşte program. Aradaki farkı sen bulursun sanırım.
TrisA=%00000011
TrisB=0
PortA=0
Portb=0

Sayi    var byte
ileri   var PortA.0
Geri    VAR PortA.1

Sayi=1

Basla:
        if ileri=1 then
            sayi=sayi*2
            if sayi=0 then sayi=1
        endif
        
        if geri=1 then
            sayi=sayi/2
        endif
        
        portb=sayi
        pause 300
        goto basla
        


Kolay Gelsin.
İsis bağlantısı için PortA.0 da ileri butonu bağlı (Pull Down) yani tusa basmayınca port Low konumunda basınca High konumunda olacak.
PortA.1 de ise geri butonu bağlı aynı şekilde.

Kolay Gelsin
ETE
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

crescent

ilgine cok teşekkürler deneyip sonucu bildiririm sana bu kadar ayrıntılı bir cevap gondermen beni cok sevindirdi.Umarım bende en kısa zamanda kendimi gelistirip sizin bana yardımcı oldugunuz gibi bende bilgilerimi başkalarıyla paylaşırım ve bu şekilde paylaşımlar sonucunda ülkemiz su an bulunduğu haketmediği konumdan kurtularak bir bilgi toplumu haline gelir.

crescent

İnan delirmemem işten değil benim kafam iyice durmuş bu kadar basit bir şey bu ama benim nelerle ugraştığımı bir gorsen gulersin altta yolladıgın basic programın C ye cevirdigim hali var onun altındada 2 gunden beri 6-7 saat ugrastıgım ve calısmayan program var tek 'if' kullanarak halletmek yerine nelerle ugrasmısım Cok sagol sorunumu cozdun:)

#include <pic.h> 
#include <delay.c> 

main(void) 
{ 
   unsigned int i=1; 
   unsigned int x,k; 
    
   TRISB=0; 
   TRISA=0b00000011; 
   PORTB=0b00000000; 

for( ;; ) 
{ 
   k=PORTA; 
   switch (k) 
   { 
       case 0b00001: 
      { 
         do 
         { 
         DelayMs(15); 
         PORTB=i;             
         if (i==128) 
         i=1; 
         else 
         i=i<<1; 
         k=PORTA; 
         x=k*0x1E; 
         while(RA0==0); 
         } 
         while(x==0x0); 
      } 
       
      case 0b00010: 
      { 
         do 
         { 
         DelayMs(15); 
         PORTB=i; 
         if(i==1) 
         i=128; 
         else 
         i=i>>1; 
         x=PORTA*0b11101; 
         while(RA1==0); 
         } 
         while(x==0b00000); 
         k=PORTA; 
      } 

   }    
} 
}

Bu da senin yazdığın programı C ye cevirip yaptıgım calısan program


#include <pic.h> 
#include <delay.c> 
#define ileri RA0 
#define Geri RA1 
main(void) 
{ 
   unsigned int Sayi=1; 


   TRISB=0;                  
   TRISA=0b00000011; 
   PORTB=0; 
for( ;; ) 
{ 
   if (ileri==1) 
   { 
       
      Sayi=Sayi*2; 
      if (Sayi==128) Sayi=1; 
   } 
   if (Geri==1) 
   { 
      Sayi=Sayi/2; 
   } 
PORTB=Sayi; 
DelayMs(15); 

} 
}



basit bir programın programı yazan tarafından nasıl karıstırdıkca karıstırılacagına guzel bir ornek oldu sanırım:)))

Tekrar yardımların icin sagol cok teşekkürler