Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

CCS C ADC OKUMA SORUNU !

Başlatan Lenin, 22 Aralık 2017, 15:26:16

Lenin

Merhabalar timer ile belli bir süre 2 farklı kanaldan adc okuyorum ama bir kanalın adc değerindeki değişimi diğer kanalın adc değerini etkiliyor. Sebebi ne olabilir ? İyi günler dilerim... (Kod kısmı aşağıdaki gibidir)
#include <topraktoprak.h>

#include <stdlib.h>
#include <stdio.h>
unsigned int16 nembilgi=0,sicaklikbilgi=0;
unsigned int16 zaman=0;

#INT_TIMER2
void  TIMER2_isr(void) 
{
   disable_interrupts(INT_TIMER2);
   zaman++;
   if(zaman>25)
   {
      zaman=0;
      
      set_adc_channel(0);
      delay_us(20);
      sicaklikbilgi=read_adc();
      
      set_adc_channel(1);
      delay_us(20);
      nembilgi=read_adc();
      
      fprintf(mavidis,"%lu#%lu\r\n",sicaklikbilgi,nembilgi);
   }
   enable_interrupts(INT_TIMER2);
}

void main()
{
   setup_adc_ports(ALL_ANALOG);
   setup_adc(ADC_CLOCK_DIV_32);
   setup_timer_2(T2_DIV_BY_16,24,10);      //400 us overflow, 4,0 ms interrupt

   enable_interrupts(INT_TIMER2);
   enable_interrupts(GLOBAL);

   while(TRUE)
   {

   }

}

#include <16F877A.h>
#device ADC=10

#FUSES PUT                      //Power Up Timer
#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
#FUSES NOPROTECT                //Code not protected from reading

#use delay(crystal=4MHz,restart_wdt)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=mavidis,restart_wdt,errors)

sifirzero

%lu\n#%lu\r olarak degistirimisin. Aynı yere yaziyorlar.
sifirzero.blogspot.com [email]sifirrzero@gmail.com[/email] iman hem nurdur hem kuvvettir

eti

adc için 20us gecikme yeterli gelmeyebilir. gecikme süresini artırarak deneyebilirsin.

Lenin

Dediğiniz gibi yapıtım c# da veriler ayni labele yazıyor.  Sorun hala devam ediyor.

tbt777

sicaklikbilgi=read_adc(); satırının hemen altına delay_us(100); ekleyerek deneyebilir misin?

gokhangokcen

printf("%lu#%lu\r\n",sicaklikbilgi,nembilgi);


Ben genelde bu şekilde kullanırım işimi görüyor, deneyebilirsin.
Bildiğini paylaşmak, Allah'ın verdiği öğrenme yeteneğinin zekatıdır.

fide

Merhaba.
Yaşadığınız problem yazdırma ile ilgili değil. adc kanalı değişimi için verdiğiniz sürenin yeterli olmaması. 20us süre adc kanalının değişip stabil okunması için yeterli değil. Önerim bu değeri enaz 1ms, tutarlı okuma için 5ms yapmanızdır.


İnt rutini içinde bekleme yapılmaz. Bu nedenle adc kanal değişimi ve okuma rutinini While(1) bloğu içine almanız daha mantıklı olacaktır. yada belirli aralıklarla adc kanalını main içinde değiştirip int içinde sadece analog okuma yapmanız olacaktır.
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

aliveli

sorun burda
setup_adc(ADC_CLOCK_DIV_32);



32  20 mhz kristal için

fide

@aliveli nin bahsettiği olay 16F8x7A datasheetteki aşağıdaki tablo ile ilgili

Operation ADCS2:ADCS1:ADC S0
2  TOSC     000       1.25 MHz
4  TOSC    100       2.5 MHz
8  TOSC    001       5 MHz
16 TOSC   101       10 MHz
32 TOSC    010       20 MHz
64 TOSC    110       20 MHz


burda 20 mhz kristal için setup_adc(ADC_CLOCK_DIV_32); kullanmasını önermiş.
[/size]20 mhz kristal kullanabilirsen bu ayarlar dene.
[/size]4 mhz kristal için 32yi  2 yapmayı dene.
[/size]
[/size]
Her birimiz, geride bıraktığımız eserler kadar ölümsüzüz. Evlat gibi, talebe gibi, icatlar gibi...   http://fidenetgaraj.blogspot.com

Lenin

Dediğiniz gibi arada ki delay süresini arttırınca değişimler olmamaya başladı. Teşekkür ederim.