Analog girişi dijital giriş olarak kullanma

Başlatan cehennem, 23 Şubat 2016, 16:28:22

cehennem

Merhaba arkadaşlar
18f4620 entegresi ile 8 tane analog sinyal okuma 20 tanede dijital sinyal okuma yapıyorum. AN9 AN10 AN11 AN12 pinlerini dijital giriş olarak kullanıyorum. Bu girişlere +5 volt uyguladığım zaman analog değerlerde değişiklik oluyor bi yerde yanlış bişeymi yapıyorum daha önce böyle bi durumla karşılaşan olduysa yardımcı olabilirmisiniz.

t2

Alıntı yapılan: cehennem - 23 Şubat 2016, 16:28:22
Bu girişlere +5 volt uyguladığım zaman analog değerlerde değişiklik oluyor bi yerde yanlış bişeymi yapıyorum
analog değerlerde değişiklik  olduğunu nasıl tespit ediyorsunuz?  Analog okuma için çağırılan fonksiyon portu otomatik olarak analog olarak ayarlıyor ve öyle okuyor olabilir.

Belki pin  zaten hep analog idi.  hiç bir zaman dijital olarak ayarlanmamış olabilir.  Dijital olarak kullanabilmek için bir ayar yaptınız mı ki? yaptıysanız bile sonradan analog olarak okumaya çalışınca otomatik olarak analog okumaya uygun hale geliyor olabilir.       CCS C yapmıştır.

cehennem

analog değerleri ve dijital okuduğum değerleri seri porttan gönderiyorum analog pinlerin tanımlamasını  setup_adc_ports(AN0_TO_AN7); şeklinde yaptım. okuma işleminide   aşağıdaki  gibikanalı secip hazırlanması için bekleyip okuma işlemini başlatıyorum okuma bitip kesme oluşuncaya kadar programı while dongüsü içerisinde bekletiyorum. okuma işlemlerim bittiğinde while dongüsünden çıkıp değerleri seri port tan gönderiyorum. dijital olarak kullandığım analog girişlere +5volt uyguladığımda bütün analog değerlerde bir artış oluyor.

set_adc_channel(adc_kanal); // 0 dan 7 ye kadar
delay_us(16);
read_adc(ADC_START_ONLY);
   

dursuncemal

:=

cehennem

  
  #INT_AD
void adc_kesme ()
{
    clear_interrupt(INT_AD);
    ai_oku[adc_kanal]=read_adc(ADC_READ_ONLY);
    
   if (adc_kanal < 7)
   {
       adc_kanal++;
        set_adc_channel(adc_kanal);
        delay_us(16);
        read_adc(ADC_START_ONLY);
   }
      
   
   else
   {
   adc_kanal=0;
   adc_okuma=1;
     // delay_us(16);
  
   
   } 
  
   return;
}

void butonhesapla (void)
{
     if( bit_test(PORTB,0)  )
         {bit_set(x,7);}
     else
          {bit_clear(x,7);}
          
      if( bit_test(PORTB,1)  )
         {bit_set(x,6);}
     else
          {bit_clear(x,6);}
          
          if( bit_test(PORTB,2)  )
         {bit_set(x,5);}
     else
          {bit_clear(x,5);}
          
      if( bit_test(PORTB,3)  )
         {bit_set(x,4);}
     else
          {bit_clear(x,4);}
           
     if( bit_test(PORTB,4)  )
         {bit_set(x,3);}
     else
          {bit_clear(x,3);}
          
      if( bit_test(PORTB,5)  )
         {bit_set(x,2);}
     else
          {bit_clear(x,2);}
          
     if( bit_test(PORTB,6)  )
         {bit_set(x,1);}
     else
          {bit_clear(x,1);}
          
      if( bit_test(PORTB,7)  )
         {bit_set(x,0);}
     else
          {bit_clear(x,0);} 
 // ----------------------------------------------------------------------        
     if( bit_test(PORTD,2)  )
         {bit_set(y,7);}
     else
          {bit_clear(y,7);}
          
      if( bit_test(PORTD,3)  )
         {bit_set(y,6);}
     else
          {bit_clear(y,6);}
          
          if( bit_test(PORTC,6)  )
         {bit_set(y,5);}
     else
          {bit_clear(y,5);}
          
      if( bit_test(PORTC,7)  )
         {bit_set(y,4);}
     else
          {bit_clear(y,4);}
                   
     if( bit_test(PORTD,4)  )
         {bit_set(y,3);}
     else
          {bit_clear(y,3);}
          
      if( bit_test(PORTD,5)  )
         {bit_set(y,2);}
     else
          {bit_clear(y,2);}
          
          if( bit_test(PORTD,6)  )
         {bit_set(y,1);}
     else
          {bit_clear(y,1);}
          
      if( bit_test(PORTD,7)  )
         {bit_set(y,0);}
     else
          {bit_clear(y,0);} 
     //-------------------------------------------------------------------------------------------     
      if( bit_test(PORTC,2)  )
         {bit_set(z,0);}
     else
          {bit_clear(z,0);}
          
      if( bit_test(PORTC,1)  )
         {bit_set(z,1);}
     else
          {bit_clear(z,1);}
          
          if( bit_test(PORTC,0)  )
         {bit_set(z,2);}
     else
          {bit_clear(z,2);}
          
      if( bit_test(PORTE,3)  )
         {bit_set(z,3);}
     else
          {bit_clear(z,3);}
                   
    
          
          
 return;
 
}


void main()
{
set_tris_a(0b11101111);
set_tris_b(0b11111111);
set_tris_c(0b11010111);
set_tris_d(0b11111100);
set_tris_e(0b00001111);

  // setup_vref(VREF_OFF);

   setup_adc_ports(AN0_TO_AN7);
   
     // setup_adc(ADC_CLOCK_INTERNAL);
   setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_0);
   setup_psp (PSP_DISABLED) ;
   setup_comparator (NC_NC_NC_NC) ;
   enable_interrupts(INT_AD); 
   enable_interrupts(GLOBAL);
   
  
 
 
   while(TRUE)
   {
	  set_adc_channel(adc_kanal);
	  delay_us(16);
	  read_adc(ADC_START_ONLY);
	  adc_okuma=0;
	 while(adc_okuma==0)
	 {
	 }
	 butonhesapla();
	 
	 
	
	
	
	
   }

}


  
  
 


kodun değerleri okuma kısımları

RaMu

Programdaki "return;" kısımları için "code has no effect" uyarısı
vermesi lazım aslında, ama uyarı vermiyor olabilir.
Kısaca o return lerin hiçbir etkisi yok,
kafa karışıklığı olmaması açısından silmeni tavsiye ederim.

bit_test(PORTx,X)      //ör: bit_test(PORTB,0)
yerine
input(PIN_xX)           //ör: input(pin_b0)

kullanman daha kolay olur, aksi takdirde
programın başında TRIS komutlarını kullanarak
pinlerin giriş-çıkış kurulumunu yapmak zorunda kalırsın.


Bence kodda değil donanımda bir problem var.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

cehennem

Tris tanimlamalarini zaten yapiyorum kodun basinda. Donanimda incelerken bisey farkettim ben pici 5 volt adaptorle besliyorum adaptorun cikisi salinimliydi biraz ve 1 diyot ve 1000 uf  bi kondansator koyup salinimi filtreledim. Bu yuzden picin beslemesi tam 5 volt degilde 4.5 gibi seviyeye dusuyo diyot yüzünden. Dijital girislerede adaptorun direk + cikisini butona basinca set edecek sekilde baglıyorum ancak analog ozelligi olup dijital olarak okumak icin kullandigim portlara baglayip butona basinca butona basildi  bilgisi geliyor ama analoglarda 50 ile 100 birim daha artiyor. Analog okuma ozelligi olmayan portlara baglayip denedigimde bi sorun olmuyor.

dursuncemal

portlari pull up yap diyecem ama gene birsey degismeyecek gibi.enteresan su an calistigim karta a0 a1 de anlog sensor var geri kalanlarinda farkli farkli girisler var herhangi bir sikinti yok.18f2520
:=

cehennem

Benim sıkıntı benim anladigim picin beslemesi ile dijital girise girdigim voltaj farki ama sacma gelen analog ozellikli pinler disinda sorun olmamasi picin + ucunu dedigim degeri degistiren pinlere baglayinca sorun olmuyor ama direk adaptoru girince oluyor aradaki diyodun dusurdugu voltaji referans aliyor normal analoglardada ona benzer bisey yaziyodum gerilim bolucu koydum o halloldu ama analog okuma ozellikli dijital olarak kullandigim pinlerin oyle bisey yapabilecegi aklima hic gelmemisti denerken normal pinlerde denedigimden calisir diye düşünmüştüm.

t2

#9
Pinlerde dahili diyod var. Bir pine 5 volt uygulayınca, besleme 4.5V ise ,  pinden beslemeye doğru akım geçer, besleme dalgalanır. Diğer pinde adc ile besleme gerilimi okunuyor ise okunan değer değişmiş olur. yani dijital pinden verilen gerilim ile analog okuma sonucu değişir. Beslemenin stabil olması gerekir.


Alıntı Yapbu yuzden picin beslemesi tam 5 volt değilde 4.5 gibi seviyeye dusuyo diyot yüzünden.

cehennem

Dediginiz gibi bisey oluyor buyuk ihtimal ancak normal digitallerde o sorun olmuyor an9 an10.... gibi analog okuma ozelligi devredisi birakilip digital okunan pinlerde oluyor sadece bu sorun.