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 support@ccsinfo.com

Strange error in ADC

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



Joined: 23 Dec 2008
Posts: 83

View user's profile Send private message

Strange error in ADC
PostPosted: Fri Aug 12, 2011 9:38 pm     Reply with quote

I am using 18F4620, 20Mhz Crystal and I am trying to read the ADC and convert it into Volts. (10bit adc). When I measure the voltage in Multimeter it gives me 0.19, but when i see it on the LCD it gives me, .00205 using the below code. When the voltage reaches more than 1.0, the LCD shows me correct reading like 1.10 , 2.32 etc... Where am I wrong ???

But when .0020 is displayed I read the variable analog_val and it gives me 42. So (42*5)/1023 gives me 0.20. But when I get a value of .00205 ?????

Code:

   int16 analog_val;
   float volts;       
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel(7);
   delay_us(50);
   analog_val = read_adc();
   volts=(float)(analog_val*5.0)/1023.0;

   sprintf(string,"Arun :  \%3.2f    ",volts);
   displaytext_adv(0x02,0xC1,YELLOW,BLACK,400,255, string);


Tris settings for PORTE

set_tris_e(0b00000110);

Please advice

Thanks.
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri Aug 12, 2011 9:52 pm     Reply with quote

You are missing the line for setup_adc_ports().

Also, the internal ADC clock is not the best for accuracy. Look in the
ADC section of the PIC data sheet to see a table of the correct clock
divisor for setup_adc() for 20 MHz. Then look in the .h file for your PIC
in the section on setup_adc() to see the correct constant to use to enable
that divisor.
arunkish



Joined: 23 Dec 2008
Posts: 83

View user's profile Send private message

PostPosted: Fri Aug 12, 2011 11:01 pm     Reply with quote

Dear PCM
Thank you for your reply. I would like to use only PORTE2 / AN7 for ADC, I dont have an option in the header file to use AN7 / RE2 alone. But as I said I guess that I am getting the right ADC value as 42, but when converted into volts instead of 0.20 it shows .00205. I will also check for the table you said.
temtronic



Joined: 01 Jul 2010
Posts: 9120
Location: Greensville,Ontario

View user's profile Send private message

PostPosted: Sat Aug 13, 2011 7:05 am     Reply with quote

you're using...
sprintf(string,"Arun : \%3.2f ",volts);

.. and a quick read of that function says no error checking is done.

that may be your problem

also
3.2f means convert to float and truncate giving a value of say 1.23 but you say you saw .00205 !

so something is wrong !

perhaps format to 5.4 and see what results you get ?
Ttelmah



Joined: 11 Mar 2010
Posts: 19236

View user's profile Send private message

PostPosted: Sat Aug 13, 2011 8:01 am     Reply with quote

One possibility is that the output is not what you think.
If (for instance), this is being written to an LCD, and you are not clearing the screen. Is it possible that you had a sequence of values one after the other, with some digits left of the display, that just happened to result in the display finally showing 0.00205.
Almost every value is going to overflow your field width, which then makes the output difficult to determine (the first digit, is the _total_ field width, and includes the decimal point).
Try "%04.2f " which then leaves space for the digit in front of the decimal, and puts a space afterwards, which will make it obvious if older values are still being displayed.

The reason the header doesn't have an option to use AN7 alone, is that the chip doesn't support this _read the data sheet_. Ideally it'd be better to move to something like AN0, which can be selected on it's own. Register 19-2 in the data sheet, shows the allowed configurations.

Best Wishes
arunkish



Joined: 23 Dec 2008
Posts: 83

View user's profile Send private message

PostPosted: Mon Aug 15, 2011 8:16 pm     Reply with quote

Please check the following images.

http://postimage.org/image/2ow5wwvac/

http://postimage.org/image/2owhhoaqs/

I have SIMULATED the variables and you can see what happens. I am confused !!

volts=((42.0*5.0)/1023.0);
sprintf(string,"Arun : %3.2f ",volts);

I get .00205

and for %5.4f

.0000205xxxxx
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Tue Aug 16, 2011 1:51 pm     Reply with quote

Quote:
I would like to use only PORTE2 / AN7 for ADC,
I dont have an option in the header file to use AN7 / RE2 alone.

What does this mean ? Does it mean that you still don't have a
setup_adc_ports() statement ? Are you trying to use AN7 as
an Analog input while the pin is still configured as a Digital pin ?



Quote:
I have SIMULATED the variables and you can see what happens. I am confused !!
volts=((42.0*5.0)/1023.0);
sprintf(string,"Arun : %3.2f ",volts);
I get .00205
and for %5.4f
.0000205xxxxx

Post your compiler version.
arunkish



Joined: 23 Dec 2008
Posts: 83

View user's profile Send private message

PostPosted: Tue Aug 16, 2011 8:19 pm     Reply with quote

Dear PCM
As you can see I have not used any Analog Inputs. Just doing a math, but I get wrong results. Compiler version is 3.222
Ttelmah



Joined: 11 Mar 2010
Posts: 19236

View user's profile Send private message

PostPosted: Wed Aug 17, 2011 2:26 am     Reply with quote

I don't know what you are doing, so took your 'simulation', and stuck it into a minimum program:
Code:

#include <18F4620.h>
#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES NOPROTECT                //Code not protected from reading
#FUSES BROWNOUT                 //Reset when brownout detected
#FUSES PUT                      //Power Up Timer
#FUSES NODEBUG                  //No Debug mode for ICD
#FUSES NOWRT                    //Program memory not write protected
#fuses INTRC

#use delay(clock=8000000)
#use RS232(XMIT=PIN_C6,RCV=PIN_C7,ERRORS,Baud=9600)

void main(void) {
   char buffer[32];
   float volts;
   volts=((42.0*5.0)/1023.0);
   sprintf(buffer,"Arun : %3.2f ",volts);
   
   printf("%s",buffer);

   do {
   } while(TRUE);
}

Compiled with 3.222.

Displays:
"Arun : .20 "

This is cut and pasted from hyperterminal.

Exactly what you'd expect.....

3.222, is old, but seems to work OK for this (the version I have dates to mid 2005). So I have to ask how you are actually seeing this?. Are you using a simulator?. If so, _doubt it_.

I suspect you are wasting a lot of time, possibly finding faults in the simulation, rather than the code....

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