zfer

Üye
Katılım
23 Kas 2008
Mesajlar
63
Puanları
1
Yaş
39
Merhaba arkadaşlar,

Pic16f819 ile enkoder okutmak istiyorum. kodu falan yazdım. devreyi similasyonda hazırladım(isisde). orada sorunsuz çalışıyor fakat gerçeğe gelince işler sarpa sarıyor. enkoder çıkışını (24v enkoder, +24v çıkış veriyor, 100 puls) 16 tane optocouplere bağladım. 1k lık dirençlerle. diğerucları şaseye çektim. optocouplerin çıkışını da kollektörden +5v girdim emiterden pic'e bağladım. pic e giden uca 10k dirençle şaseye bağladım. bir tane de butonum var. o da 24v ile çalışıyor. onu da enkodere yaptığımı yaptım. buton kısmı pice tam 5v veriyo sorunsuz. yani butona bastığımda sorunsuz olarak giriyor fakat enkoder girişi aynı işlemi yapmıyor. 2,5v a düşüyor ki pic de bunu okumuyor. pic i çıkarttığımda bi sorun yok ikisinden de +5v alabiliyorum çalıştırdıkça..

kodda da enkoder b0 pinine bağlı buton b1 pinine bağlı. enkoder kesme ile kontrol ediliyor. acaba kodda mı hata var? kodun okuma kısmı da aşağıda;

Kod:
#include <16f819.h>#use delay(clock=20000000) 
#fuses HS,PUT,NOWDT,NOBROWNOUT,NOPROTECT,NOMCLR,INTRC_IO




#use fast_io(a)
#use fast_io(b)


#define giris1  input(pin_b1) //sensor girişi
#define giris2  input(pin_b0) // enkoder girişi
#define tampon 10    
unsigned int32 puls=100;  



unsigned int8 c=0,d;
unsigned int8 an[tampon+1];
unsigned int8 dd[tampon+1];
int1 bit=1;
unsigned int32 counter[tampon+1];




#int_ext                
void  ext_kesmesi ()   
{
output_bit(PIN_B5,0);




   for(d=1;d<=tampon;d++)
   {
      if(giris1==0) bit=1;  
      if(an[c]==1)
      {
         counter[d]++;
         if(counter[c] >= puls)
         {
pic çıkışı,
         }
      }
   }
}


void main ( )
{
setup_adc_ports(no_analogs);
 
set_tris_a(0xff);
set_tris_b(0b00000011);


   output_a(0x00);
   output_b(0x00);


   ext_int_edge(L_TO_H);   


   enable_interrupts(INT_EXT);  
   enable_interrupts(GLOBAL);   
    
   for(d=1;d<=tampon;d++) dd[d]=1;


   while(true)
   {
      if( giris1==1 && bit==1) 
      {
      c++;
      bit=0;
      }
      if(giris1==0) bit=1;
      
      if(c==(tampon+1))
      {
         c=1;
         for(d=1;d<=tampon;d++) dd[d]=1;
      }
   
      for(d=1;d<=tampon;d++)
      {    
         if(c==b) an[d]=1;
         if(dd[d]==0) an[d]=0;
      }  
   }
 }

kodda bağzı yerler sl
 
Encoderin ne tip ?
İleri / geri mi okuyacaksın ?
Encoder çıkışına 2 dirençle gerilim bölücü yapabilirdin.
16 optocupler ne işe yarıyor ?
Bir şema eklersen daha kolay anlaşılabilir.
Özellikle proteus dosyalarını ...

"kodda bazı yerler sl" , ne demek ?
 
16 tane aynı işi yapan pic var. her biri bu devre gibi çalışıyor. orası önemli değil.
Tek yönde okuyacak.
enkoder 24v gerilim bölücü için kararlıçalışması lazım ki çalışırken ölçü aleti ile ölçtüğümde 8V a düşüyor.
şema anlattrığım gibi tetikleme şeması, optocouplerle PC817 pic nasıl tetikleniyorsa öyle. B1 portundan okuma yaparken sıkıntıyok. B0 portundan kesmeden okurken sıkıntı var.
 
l2xz9.bmp
 
Emetor ü eksiye bağla.
Collector ü 4.7k ile artıya.
Collector pic e.
Portları pull up/down yapıp yapmadığına dikkat et.
 
Arkadaşlar yardımlarınız için teşekkürler. Sorunumu çözdüm.

Sorun döngüler balamadan önce analog kapatma satırının olmasıymış. Yani Setup_adc(adc_off) satırını kaldırınca ve fusesleri
#FUSES HS, NOPUT, NOMCLR, NOWDT, NOBROWNOUT, NOLVP, NOCPD, NOPROTECT olarak değiştirince çalıştı.
 

Forum istatistikleri

Konular
127,967
Mesajlar
913,971
Kullanıcılar
449,614
Son üye
Canipk

Yeni konular

Geri
Üst