PİC'e birden fazla ADC giriş tanımlanabilir mi?

Serdargny

Üye
Katılım
14 Mar 2019
Mesajlar
25
Puanları
3
Yaş
22
Herkese iyi günler. Pic'e birden fazla adc girişi tanımlanabilir mi yardım eder misiniz ? Aşağıdaki program gibi. Ama bu program çalışmıyor nerede hata yapıyorum
Kod:
#include <16F877A.h>

#device ADC=10



#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD



#use delay (clock=4000000)



//#use fast_io(a) //Port yönlendirme komutları A portu için geçerli

//#use fast_io(b)



unsigned long int bilgi1=0,bilgi2=0;

float voltaj1=0,voltaj2=0;



void main ( )

{

setup_psp(PSP_DISABLED); // PSP birimi devre dışı

setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı

setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı

setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı

setup_CCP1(CCP_OFF); // CCP1 adc(ADC_OFF);birimi devre dışı

setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı



set_tris_a(0xFF);

set_tris_b(0x00);

output_b(0x00);



setup_adc_ports( AN0_AN1);

setup_adc(adc_clock_internal);



while (true)

{

set_adc_channel( 0 );

bilgi1=read_adc();

delay_us(100);

voltaj1=0.0048828125*bilgi1;



if (voltaj1>=4.97)

{

output_high(PIN_B0);

}



set_adc_channel( 1 );

bilgi2=read_adc();

delay_us(100);

voltaj2=0.0048828125*bilgi2;



if (voltaj2>=4.6)

{

output_high(PIN_B1);

}}}
setup_adc_ports( AN0_AN1);

bu kısımda hata veriyor
 
Moderatör tarafında düzenlendi:

muratmert4

Paylaşımcı üye
Katılım
26 Eyl 2007
Mesajlar
973
Puanları
133
Yaş
45
Konum
ANTALYA
denemedim ama aşağıdaki kod full adc kanalı okursun

C:
#include <16F877A.h>
#device ADC=10
#use delay(crystal=20000000)

#define led1   PIN_B0
#define led2   PIN_B1
#define ADC_TUR 32

float adc_to_voltage(int8 kanal);

float volt1=0, volt2=0;

void main()
{
   setup_adc_ports(ALL_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);

   while(TRUE)
   {
      volt1=adc_to_voltage(0);
      volt2=adc_to_voltage(1);
      
      if(volt1>3.50) {output_high(led1);} else {output_low(led1);}
      if(volt2<4.50) {output_high(led2);} else {output_low(led2);}

      
   }

}

float adc_to_voltage(int8 kanal)
{
   unsigned int16 adc_oku[ADC_TUR];
   float volt_bilgi=0;
   int32 adc_toplam=0;
   int8 i=0;
    
   set_adc_channel(kanal);
   delay_us(20);
  
   for(i=0; i<ADC_TUR; i++)
   {
      adc_oku[i]=read_adc();
      delay_us(20);
      adc_toplam=adc_toplam+adc_oku;
   }

   volt_bilgi=(float)adc_toplam/ADC_TUR;
   volt_bilgi=volt_bilgi*0.0048828125;
  
   return(volt_bilgi);
}
 
Konu Sah
S

Serdargny

Üye
Katılım
14 Mar 2019
Mesajlar
25
Puanları
3
Yaş
22
denemedim ama aşağıdaki kod full adc kanalı okursun

C:
#include <16F877A.h>
#device ADC=10
#use delay(crystal=20000000)

#define led1   PIN_B0
#define led2   PIN_B1
#define ADC_TUR 32

float adc_to_voltage(int8 kanal);

float volt1=0, volt2=0;

void main()
{
   setup_adc_ports(ALL_ANALOG);
   setup_adc(ADC_CLOCK_INTERNAL);

   while(TRUE)
   {
      volt1=adc_to_voltage(0);
      volt2=adc_to_voltage(1);
     
      if(volt1>3.50) {output_high(led1);} else {output_low(led1);}
      if(volt2<4.50) {output_high(led2);} else {output_low(led2);}

     
   }

}

float adc_to_voltage(int8 kanal)
{
   unsigned int16 adc_oku[ADC_TUR];
   float volt_bilgi=0;
   int32 adc_toplam=0;
   int8 i=0;
   
   set_adc_channel(kanal);
   delay_us(20);
 
   for(i=0; i<ADC_TUR; i++)
   {
      adc_oku[i]=read_adc();
      delay_us(20);
      adc_toplam=adc_toplam+adc_oku;
   }

   volt_bilgi=(float)adc_toplam/ADC_TUR;
   volt_bilgi=volt_bilgi*0.0048828125;
 
   return(volt_bilgi);
}
hocam yardımınız için teşekkür ederim. Birkaç sorum var. adc_tur 32 yapma sebebiniz ve (int8 kanal) yapma sebeniniz nedir ? programlamada acemiyim
 

muratmert4

Paylaşımcı üye
Katılım
26 Eyl 2007
Mesajlar
973
Puanları
133
Yaş
45
Konum
ANTALYA
int8 8 bitlik bir sayı yani adc kanal adresiniz için olan bir değişken. ADC_TUR kaç adet okuyacağını belirtmek için define sabittir.
float adc_to_voltage(int8 kanal) fonksiyonunda ise 32 adet adc yi okuyup toplam ortalamasını alıp 1-1023 arası olan adc değişkenini voltaja çevirip 0-5.00 volt float olarak dönüş yapıyor.
 
Konu Sah
S

Serdargny

Üye
Katılım
14 Mar 2019
Mesajlar
25
Puanları
3
Yaş
22
Analog giriş okuma ile ilgili şuradan yardım alabilirsin;
https://koddefteri.net/ccs-c/ccs-c-analog-giris-okuma.html
sağ olun çok yardımcı oldu
int8 8 bitlik bir sayı yani adc kanal adresiniz için olan bir değişken. ADC_TUR kaç adet okuyacağını belirtmek için define sabittir.
float adc_to_voltage(int8 kanal) fonksiyonunda ise 32 adet adc yi okuyup toplam ortalamasını alıp 1-1023 arası olan adc değişkenini voltaja çevirip 0-5.00 volt float olarak dönüş yapıyor.
teşekkür ederim
Konudan ayrılmadıysanız programıma bakar mısınız ? Programda gerilimin sürekli takip edilmesini istiyorum eğer 4.5V dan büyükse b0 portunu 1 yapacak, b1 portunu 0 yapmasını ve sürekli gerilimi takip etmesini istiyorum. goto komutu kullandım. Devrede b1 portuna sürekli 1 gidiyor. B0 portunda oynama yok. Hatamı bulamadım. Yardım eder misiniz ?
Kod:
#include <16F877A.h> // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#device ADC=10





// Denetleyici konfigürasyon ayarları

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD



#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.



//#use fast_io(a) //Port yönlendirme komutları A portu için geçerli

//#use fast_io(b)





long bilgi;

float voltaj;



/********* ANA PROGRAM FONKSİYONU********/

void main ( )

{

setup_psp(PSP_DISABLED); // PSP birimi devre dışı

setup_spi(SPI_SS_DISABLED); // SPI birimi devre dışı

setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı

setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı

setup_CCP1(CCP_OFF); // CCP1 adc(ADC_OFF);birimi devre dışı

setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı





set_tris_b(0x00); // B portu komple çıkış

output_b(0);



setup_adc_ports(RA0_ANALOG);

setup_adc(adc_clock_internal);

set_adc_channel(0);



while (true)

{

output_high(PIN_B1);

bilgi=read_adc();

voltaj=(0.0048828125*bilgi);

delay_us(100);

oku:

if ((voltaj>=4.50) )

{

output_high(PIN_B0);

output_low(PIN_B);



}

goto oku;

}}
 
Moderatör tarafında düzenlendi:

muratmert4

Paylaşımcı üye
Katılım
26 Eyl 2007
Mesajlar
973
Puanları
133
Yaş
45
Konum
ANTALYA
Programda basic de ki gibi go to kullanmanız pek hoş olmaz. Size yolladığım program sürekli kontrol ediyor. adc yi direk okuyup işlem yapmak da pek düzgün olmaz belli bir miktar da adc okuyup ortalama almak daha hoş ve doğru olur.
 

Sponsor Bağlantı

Forum istatistikleri

Konular
106,003
Mesajlar
746,757
Kullanıcılar
393,952
Son üye
oguzhanakbas

Yeni konular

Üst