ADC okuma hatası

Başlatan Emre MERMİ, 05 Aralık 2014, 14:12:14

Emre MERMİ

merhaba arkadaşlar.

Bir program yazmam gerekiyor, çok basit. Hatta aşırı basit birşey. 2 porttan analog değeri okuyup lcd ye yazdırmak. kendim baştan yazdım programı,çalışmadı.  Serdar Çiçek hocamın örnek programı üzerinde değişiklik yapayım dedim. yine olmadı. 2 tane analog değer okuyup lcd ye yazdıramıyorsam bırakayım ben bu işi. çok moralim  bozuldu.

programda yapmaya çalıştığım sıcaklık ve basınç değerlerini okuyup lcd ye yazdırmak.

yardım ederseniz çok sevinirim

program şu ;

#include <16f877a.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.

#device ADC=10  // 10 bitlik ADC kullanılacağı belirtiliyor.

// Denetleyici konfigürasyon ayarları
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

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

#use fast_io(c) //Port yönlendirme komutları C portu için geçerli
#use fast_io(e) //Port yönlendirme komutları E portu için geçerli

#define use_portb_lcd TRUE   // LCD B portuna bağlı

#include <lcd.c>   // lcd.c dosyası tanıtılıyor


unsigned long int bilgi; // İşaretsiz 16 bitlik tam sayı tipinde değişken tanımlanıyor
float voltaj,sicaklik,basinc;            // ondalıklı tipte voltaj isminde değişken tanıtılıyor

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

void main ( )
{
   setup_psp(PSP_DISABLED);        // PSP 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 birimi devre dışı
   setup_CCP2(CCP_OFF);            // CCP2 birimi devre dışı

   set_tris_a(0x0F);  

   setup_adc(adc_clock_div_32);   // ADC clock frekansı fosc/32
   setup_adc_ports(AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF);   //ADC girişleri ayarlanıyor

   lcd_init();                            // LCD hazır hale getiriliyor

   printf(lcd_putc,"\f emre "); // LCD'ye yazı yazdırılıyor
   delay_ms(1500);

   while(1)   // sonsuz döngü
   {

      set_adc_channel(0);   // RE0/AN5 ucundaki sinyal A/D işlemine tabi tutulacak
      delay_us(20);         // Kanal seçiminde sonra bu bekleme süresi verilmelidir
      bilgi=read_adc();  // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor

      voltaj=(0.0048828125*bilgi)*1000;   // Dijitale çevirme işlemine uğrayan sinyalin mV olarak gerilimi hesaplanıyor
      sicaklik=(voltaj/10)+2;    // Her 10mV'ta 1 derece artma
      printf(lcd_putc,"\fSicaklik=%fC",sicaklik); // LCD'ye yazı yazdırılıyor
      
      set_adc_channel(1);                    // RA6/AN6 ucundaki sinyal A/D işlemine tabi tutulacak
      delay_us(20);                          // Kanal seçiminde sonra bu bekleme süresi verilmelidir
      bilgi=read_adc();                      // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
      voltaj=0.0048828125*bilgi;             // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
      basinc=((voltaj+5*0.004)/(5*0.004));   //Gerilim değerinden basınç hesaplama formulu
      printf(lcd_putc,"\n");
      printf(lcd_putc,"basinc= %f",basinc);
      delay_ms(5000);
      
  

    
   }
}


tüm dosyalar ;

http://www.dosya.tc/server36/0dKKaG/bas_nc-s_cakl_k.rar.html


justice_for_all

setup_adc_ports(AN0_AN1_AN4_AN5_AN6_AN7_VSS_VDD);   //ADC girişleri ayarlanıyor
gibi bişe olması gerek.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Emre MERMİ

hocam söylediğiniz satır var kodda

justice_for_all

setup_adc_ports(AN0_AN1_AN4_AN5_AN6_AN7_VREF_VREF);   //ADC girişleri ayarlanıyor


Alıntı yapılan: justice_for_all - 05 Aralık 2014, 14:14:33
setup_adc_ports(AN0_AN1_AN4_AN5_AN6_AN7_VSS_VDD);   //Benim söylediğim
gibi bişe olması gerek.

aynımı?
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

Emre MERMİ

kusura bakmayın hocam aynı sanmışım bir an.

derlemiyor benim söylediğim satırı silip  sizin söylediğiniz satırı yazarsam

justice_for_all

setup_adc_ports(AN0_AN1_AN4_AN5_AN6_AN7_VSS);


bu şekilde yapıp derleyin oda olmazsa

setup_adc_ports(AN0_AN1_AN4_AN5_AN6_AN7);


bu şekilde yapın.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

ibocakir

hocam ADCON1 registerına hiç bir değer atamamışsınız?

Emre MERMİ

#7
hocam ikisinde de hata verdi,

setup_adc_ports(ALL_ANALOG);
yapınca program düzgün çalıştı.

çok teşekkür ediyorum yardımlarınız için. peki bu hatanın sebebi ne olabilir ?


mesaj birleştirme:: 05 Aralık 2014, 15:20:46

Alıntı yapılan: ibocakir - 05 Aralık 2014, 15:18:33
hocam ADCON1 registerına hiç bir değer atamamışsınız?

hocam hiç register düzeyinde bilgim olmadığı için oraları karıştırmıyorum :) ama çalıştı program

ibocakir

programın dilini bilmiyorum ama ADCON1 registerı hangi pinin analog olacagını seçiyor. setup(ALL_analog) diyince derleyici büyük ihtimalle ADCON1=%00000000 yapıyordur.

Emre MERMİ

anladım hocam. all analog yapınca tümü analog  giriş oluyor o  zaman  ADCON1=%00000000  oluyordur. 2 tane pin kullanıyorum  gerisi de boşta. ne olduğunun çok da önemi yok

justice_for_all

#10
ilk verdiğiniz programa göre vref pinlerine göre ölçüm yapıyordunuz.vref pinlerinede tahminimce referans bağlamadığınız için ölçüm yapamıyordunuz.ama hiç bişe yazmayınca default vdd ve vss yi referans alıyor ve buna göre ölçüm yapıyor.sizin devrenizi görmedim ama sadece öyle olduğunu tahmin ettim.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay