CCS C ADC Problemi

<SmT>

Üye
Katılım
27 Eki 2013
Mesajlar
7
Puanları
1
Selam arkadaşlar,
Amacım RF modülünü kullanarak ortamın sıcaklığını ayarlamak istiyorum. Yani daha önceden belirlenen set değerini uzaktan değiştirmek istiyorum. Aynı zamanda ortam sıcaklığını ve set edilen sıcaklığı da LCD ekranına yazdırmak istiyorum. Sıcaklık sensörü olarak lm35 kullandım. İki gündür alıcının ADC kısmında uğraşıyorum ve sürekli aynı hatayı görüyorum. Proteus da simülasyonu başlattığım an ""PORTA<0> is not configured as an analog input"" hatası vermektedir. Bu yüzden program çalışmamaktadır. Bu sorunun sebebi nedir acaba ??
Kod:
#include <16F877A.h>
#device ADC=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD                    //No EE protection
#FUSES NOWRT                    //Program memory not write protected

#use delay(clock=4000000)
#use rs232(baud=1200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stop=1,errors)

#use fast_io(a)
#use fast_io(b)
#define use_portb_lcd TRUE
#include <LCD.c>
#define kesme_led PIN_D0

int s=25;
int16 bilgi;
float voltaj,sicaklik;
char al;

#INT_RDA
void  data_geldi(void)
{
   disable_interrupts(int_rda);
   al=getch();
   if(al=='E')
   {
      al=getch();
      if(al=='q')
      {
         s--;
      }
      if(al=='w')
      {
         s++;
      }
   //printf(lcd_putc,"\nSet Sicakligi %d",s);
   }
   output_toggle(kesme_led);
   clear_interrupt(int_rda);
   return;
}

void main()
{
   setup_adc_ports(ALL_ANALOG);
   setup_adc(ADC_CLOCK_DIV_8); //clock sinyalini 8 böl. bu hızda ADC oku
   setup_psp(PSP_DISABLED);
   setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   set_tris_a(0b00001101);
   output_b(0x00);
   output_d(0x00);

   lcd_init();
   enable_interrupts(GLOBAL);
   printf(lcd_putc,"\fSicaklik=");
  
   set_adc_channel(0);
   delay_us(20);
  
   while(TRUE)
   {
      /*if(bit_test(*(0x0018),1))
      {  //her iki tamponda doluysa hata var ! temizledik bilgi alma hatası varsa bunları imha ettik.
      *(0x0018)&=0xef; *(0x0018)|=0x10; //   *(0x008c)|=0x20;
       enable_interrupts(INT_rda);
       enable_interrupts(GLOBAL);}*/
      
      enable_interrupts(INT_rda);

      bilgi=read_adc();
      voltaj=(0.0048828125*bilgi)*1000;
      sicaklik=(voltaj/10);
     
      lcd_gotoxy(10,1);
      printf(lcd_putc,"%5.1f C",sicaklik);
      printf(lcd_putc,"\nSet Sicakligi %d",s);
      delay_ms(100); 
   }
}
 
picin adc config ayarlarına bakınız.
 
set_adc_channel() fonksiyonunun içeriği ne?
 
Adc ile ilgili konfigürasyon ayarlarını çözemedim toyer hocam. Çünkü All_analog dediğimde pic in besleme gerilimini referans alması gerekirken vref bacaklarına gerilim uygulamamı istedi. set_tris_a komutunu bu yüzden kullandım ama çözüm olmadı. Sanırım analog olarak ayarladığım yeri dijital olarak kontrol etmeye çalıştım. Bu yüzden o kodu sildim. set_adc_channel(0) da lm35 den gelen analog veri var.
 
lm 35 den gelen var da o veriyi almak için adc channel aktif etmeniz lazım. internetten bakiniz örnek kodlara bir sürü vardır eminim.
 
http://www.technoburst.net/2013/04/pic16f877a-adc-example.html

bu mesela mplabx için . ama ayarlamanız gereken registerlar var kod içerisinde. bu registerları ccs c de ayarlayın yeterli olur.

tris a portu giriş veya cıkıs olarak set etmenize yarar. portu analog giriş yapmaz.

https://cdn.sparkfun.com/datasheets/Components/General IC/PIC16F877A.pdf

bölüm 11 de anlatıyor nasıl yapılandıracagınızı adc yi.bölüm 11-2 de bir tablo var orda da port pinlerini nasıl set edeceğin var. pcfg (0-3) bitleri ile vref+,vref- analog giriş veya digital port gibi ayarları yapıyorsun porta için. tabloya bak güzelcene anlatıyor.
 
Son düzenleme:
Toyer hocam sorunu buldum. Dediğiniz gibi bölüm 11 daha önce incelemiştim. All_analog un karşılık gelen bacakları, saat kaynağı (Tad) ayarlarını filan ordan yapmıştım. Ama gözümden birşey kaçmış A/D dönüştürme yaparken izlenecek adımlarının yerleri farklı. İşlemlerden birisini diğerinden önce yapmaya çalışmışım, bu yüzden hata veriyormuş. Yerlerini değiştirdim sorun çözüldü.
 
Cevaplarınız için teşekkür ederim :)
 

Forum istatistikleri

Konular
128,184
Mesajlar
915,687
Kullanıcılar
449,955
Son üye
seggzsy

Yeni konular

Geri
Üst