CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to CCS Technical Support

About PIC16f877A ADC - bad readings

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
Jean_Paul



Joined: 23 Jun 2004
Posts: 3

View user's profile Send private message

About PIC16f877A ADC - bad readings
PostPosted: Tue Jul 13, 2004 11:44 am     Reply with quote

Hi guys

I wrote a code to read using the adc of the pic16f877a three external analog inputs. I connect to AN0, AN1 and AN3 and then send the data to the serial port. when I connect the AN3 input to ground 0v, the AN0 decrease the value to the same value. I dont know what is happening.

My code is:

#include "E:\pictest\ac2877a.h"
#include <stdio.h>
#include <string.h>


void main()
{
int8 value1, value2, value3;



setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
setup_psp(PSP_DISABLED);
setup_spi(FALSE);
setup_counters(RTCC_INTERNAL,RTCC_DIV_1);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_timer_2(T2_DISABLED,0,1);
setup_ccp1(CCP_OFF);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
do {
delay_ms(5);

putc(0xAA);

set_adc_channel(0);
value1 = read_adc();
putc(value1);

set_adc_channel(1);
value2 = read_adc();
putc(value2);

set_adc_channel(3);
value3 = read_adc();
putc(value3);





} while (TRUE);
}
Guest
Guest







ADC readings
PostPosted: Tue Jul 13, 2004 12:01 pm     Reply with quote

J-P

You must wait between switching between the ADC input channel and sampling. Plenty of posts here about the importance of this delay.


HTH,
Bill
dyeatman



Joined: 06 Sep 2003
Posts: 1933
Location: Norman, OK

View user's profile Send private message

ADC Delay
PostPosted: Tue Jul 13, 2004 12:35 pm     Reply with quote

Example of the delay needed:

set_adc_channel(1);
delay_us(20);
value2 = read_adc();
Joshua Lai



Joined: 19 Jul 2004
Posts: 42
Location: Malaysia, PJ

View user's profile Send private message Send e-mail

PostPosted: Mon Jul 19, 2004 8:43 pm     Reply with quote

How to calculate the time needed for ADC dalay and the input current? Wink
valemike
Guest







PostPosted: Tue Jul 20, 2004 8:38 am     Reply with quote

In the Microchip databook, there's an exhaustive explanation of the linear approximation method that Microchip uses, along with a bunch of formulas.

However, I don't understand the formulas. So what the earlier post that tells you to wait 20 us might be fine. I usually wait 1 millisecond after changing the adc channel.

-Mike
Joshua Lai



Joined: 19 Jul 2004
Posts: 42
Location: Malaysia, PJ

View user's profile Send private message Send e-mail

PostPosted: Sun Sep 18, 2005 9:19 pm     Reply with quote

I tried using setup_adc(ADC_CLOCK_INTERNAL), then tried setup_adc(TC_DIV_32);

I know with 20Mhz frequency, Tosc32 is 1.6us, using RC oscillator is 4us.

Why I get random A/D value when using setup_adc(ADC_CLOCK_INTERNAL)?

What actually use internal RC oscillator means? Why need to use SLEEP?
Ttelmah
Guest







PostPosted: Mon Sep 19, 2005 4:19 am     Reply with quote

If you have access to a Spice modelling package, you can use the figures given for the equivalent internal capacitance, internal resistance in the multiplexer and the feeds, source impedance, and the required accuracy, to give a very accurate estimate of the charging time needed. Generally the results agree quite closely to those from the simple capacitor calculation used in the data sheet. The current flow, varies massively, with the rate of change of the input signal.
The point about 'sleep', is noise. The best way of reading the ADC, is always to stop as many noise sources in the chip as possible. With the internal RC, because the sample timing becomes asynchronous to the main clock, this becomes even more important.
Provided your signal source meets the suggestions on impedance, a delay of between 10, and 20uSec is adequate. this varies with chip versions (which have different capacitances and internal reistances, and impedance recommendations), with the 16F877, needing about 20uSec, using a 10K source impedance, and the 18F452, needing 10uSec, using a 2.5K source impedance.

Best Wishes
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group