| View previous topic :: View next topic | 
	
	
		| Author | Message | 
	
		| sandrini 
 
 
 Joined: 11 Oct 2007
 Posts: 12
 
 
 
			    
 
 | 
			
				| PIC24F and ADC expression |  
				|  Posted: Sun Nov 28, 2010 8:39 am |   |  
				| 
 |  
				| Please, I'd like a help with this code below...
 The ad_c value shows the value 63 when the ADC value is 1023.
 The expression "ad_c = (ad_c * 3300)/1023;" return a wrong value.
 
 
 
  	  | Code: |  	  | #include <24FJ128GA010.h> #device ADC = 10
 #fuses HS,PR,NOWDT,NOPROTECT
 #use delay(clock=8000000)
 
 #include "LCD8B.c"
 
 int32 ad_c;
 
 void main()         {
 
 lcd_ini();
 setup_adc_ports(sAN0, VSS_VDD);
 setup_adc(ADC_CLOCK_DIV_128 | ADC_TAD_MUL_31);
 SET_ADC_CHANNEL(0);
 
 while(true)              {
 ad_c = READ_ADC();
 ad_c = (ad_c * 3300)/1023;
 printf(lcd_escreve,"\fADC = %ld",ad_c);
 delay_ms(1000);
 }
 
 }
 | 
 
 Thanks
 
 Last edited by sandrini on Mon Nov 29, 2010 4:56 am; edited 1 time in total
 |  | 
	
		|  | 
	
		| gpsmikey 
 
 
 Joined: 16 Nov 2010
 Posts: 588
 Location: Kirkland, WA
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Nov 28, 2010 10:36 am |   |  
				| 
 |  
				| Couple of things come to mind here - there needs to be a delay after you set the channel before you can read and
 - I would consider modifying the print routine to display both the raw count from the ADC and the result.
 You indicate you get the wrong result for a given count, but you don't say how you determined that really was the count.  I may have missed something (have not had coffee yet), but it doesn't look like an overflow since you are using int32.
 
 Also, you don't indicate what you are using for the "temp" reading, but most of the linear temp sensors have an offset you need to subtract out as well (500mv=0degC for example).  You might also want to consider using signed so if the resulting temp is negative it doesn't blow up
   
 mikey
 _________________
 mikey
 -- you can't have too many gadgets or too much disk space !
 old engineering saying: 1+1 = 3 for sufficiently large values of 1 or small values of 3
 |  | 
	
		|  | 
	
		| temtronic 
 
 
 Joined: 01 Jul 2010
 Posts: 9587
 Location: Greensville,Ontario
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Nov 28, 2010 11:32 am |   |  
				| 
 |  
				| also.. 
 if the 3300 and 1023 are 'constants', have the compiler do the work !
 
 have a line like
 
 const int  midterm= 3300 / 1023
 
 it might save some time as  division takes a lot of time compared to mutlply
 |  | 
	
		|  | 
	
		| sandrini 
 
 
 Joined: 11 Oct 2007
 Posts: 12
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Nov 28, 2010 12:00 pm |   |  
				| 
 |  
				| gpsmikey temtronic and I would like to thank ... 
 In my code, the correct is "printf (lcd_escreve," \ fADC =% ld ", ad_c);"
 
 I do not know what is happening, but when I use the expressin "ad_c = (ad_c * 3300) / 1023" ... The result is completely wrong.
 I use this expression with the PIC16 and PIC18 and have no problems.
 
 I decided to use the suggestion of Temtronic, so I'm dividing 'ad_c' by '3 .22 (3300/1023), in which case the result is correct.
 
 But still many thanks for the tips.
 |  | 
	
		|  | 
	
		| FvM 
 
 
 Joined: 27 Aug 2008
 Posts: 2337
 Location: Germany
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Sun Nov 28, 2010 1:13 pm |   |  
				| 
 |  
				|  	  | Quote: |  	  | const int midterm= 3300 / 1023 
 it might save some time as division takes a lot of time compared to mutlply
 | 
 Results in midterm value of 3, so it's only a roughly correct result.
 
 Actually, there's no plausible reason why the original code shouldn't work, except you're using a buggy PCD version. Which version has been used?
 |  | 
	
		|  | 
	
		| sandrini 
 
 
 Joined: 11 Oct 2007
 Posts: 12
 
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Nov 29, 2010 4:56 am |   |  
				| 
 |  
				| I'm using version 4.108 and I also believe it is a bug in the compiler. 
 I have no problems with the PIC 16F and / or 18F, only now I started working with the PIC 24F, I noticed these problems.
 |  | 
	
		|  | 
	
		| FvM 
 
 
 Joined: 27 Aug 2008
 Posts: 2337
 Location: Germany
 
 
			    
 
 | 
			
				|  |  
				|  Posted: Mon Nov 29, 2010 5:08 am |   |  
				| 
 |  
				| You said, it's the calculation not the ADC built in function. But I checked the calculation to be performed correctly in V4.107 and also recent PCD versions (don't have 4.108 installed at present). I would trace the program execution in debugger to find, where it fails. |  | 
	
		|  | 
	
		|  |