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

PIC18F6722 , ADC configuration

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



Joined: 07 Mar 2010
Posts: 10

View user's profile Send private message

PIC18F6722 , ADC configuration
PostPosted: Sat Jul 09, 2011 3:14 pm     Reply with quote

Hello, please help
I want to measure the voltage of the ADC with PIC18f6722.
Included is the input A0.
But something wrong configuration of the PIC.
Simulation of Proteus, and gives a warning:

[PIC18 ADC] PC = 0x077E. Voltage references for ADC conversion yield a 0V range (V + = 0, V-= 0)

The result is:
V = 0


scheme:
http://img810.imageshack.us/img810/7855/71988142.jpg



Before that I tried to PIC18f458, and there was no problem. everything just worked.
But here something wrong, please help.
Thanks in advance!

Code:

#include <18F6722.h>
#device PASS_STRINGS=IN_RAM   

#device adc=10

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES HS                       //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOPUT
 

//#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
//#FUSES BBSIZ1K                  //1K words Boot Block size

#use delay(clock=20000000)
#use rs232(baud=15625,parity=N,xmit=PIN_C6,   rcv=PIN_C7   ,bits=8,FORCE_SW /* INVERT*/,TIMEOUT=460/*360*/ )

#include "LCD.c"   



//**************************************************
#byte pA   =0xF80   //port a   //
#byte pB   =0xF81   //b         //
#byte pC   =0xF82   //c         //
#byte pD   =0xF83   //d         // 
#byte pE   =0xF84   //port e   //
#byte pF   =0xF85   //port e   //
#byte pG   =0xF86   //port e   //
// *********************************
 
#Define  SetConfigPortA     1//100011  //33  100001
#Define  SetConfigPortB     240//255  11110010
#Define  SetConfigPortC     192//bx 00000011
#Define  SetConfigPortD     0
#Define  SetConfigPortE     0
#Define  SetConfigPortF     0
#Define  SetConfigPortG     0
 
Float   
         Volt;   
 


float get_Voltage( )
{
 Float     Value;
   
      Value=  read_adc() ;
   
   return Value;
}





void MAIN ( ){

     set_tris_b(SetConfigPortB);
     set_tris_a(SetConfigPortA);
     set_tris_c(SetConfigPortC);   
     set_tris_d(SetConfigPortD);
     set_tris_e(SetConfigPortE);
     set_tris_f(SetConfigPortF);
     set_tris_g(SetConfigPortG);
     lcd_init();
   
   
   
     
     
       setup_adc(ADC_CLOCK_INTERNAL); // Internal 2-6us
       setup_adc_ports( AN0  );
       set_adc_channel(0);
       setup_comparator(NC_NC_NC_NC);
       printf(lcd_putc,"Start..");
       Delay_ms(300);
       
       
       
  While(1)   
 
    {
        Volt = get_Voltage();
         
         
        printf(lcd_putc,"\fV=%3.2f  " Volt );
        Delay_ms(100);               
                   
    }
 }
Ttelmah



Joined: 11 Mar 2010
Posts: 19236

View user's profile Send private message

PostPosted: Sun Jul 10, 2011 2:25 am     Reply with quote

Several things:
1) Is ADC_CLOCK_INTERNAL, recommended if your CPU clock is above 1MHz?.
2) Is the value returned by the ADC a float value?.
3) Remove the remark on the NOXINST fuse. This fuse is _required_.
4) Unless you need to use TRIS (are using fast_io mode), let the compiler handle this for you.

Now, look at the error message. Have you got Vdd being generated, and connected to your chip in your simulation?.

Best Wishes
amdatlon



Joined: 07 Mar 2010
Posts: 10

View user's profile Send private message

PostPosted: Sun Jul 10, 2011 4:54 am     Reply with quote

Thank you for your guidance:)

Processor Clock is 5 mhz (20Mhz quartz crystal).
ADC returns an integer, but the function had other calculations, and this result is float.


I did the following:
in touch RA3 pin (VREF +) to +5 V
and changed the code to the following:

Code:
 
 setup_adc_ports( AN0 |VSS_VREF  );
 


And the result was correct. Everything is perfect Smile

If removed from the +5 V RA3, and placed in setup_adc_ports --- VSS_VDD,
Code:
 setup_adc_ports( AN0 |VSS_VDD  );

results, it is 0V (wrong).


But how to get chips to use an internal comparing voltage (+5 V), and not be connected externally to the RA3?



Since I am a beginner, make mistakes, sorry:)[/code]
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Sun Jul 10, 2011 6:00 am     Reply with quote

Quote:
1) Is ADC_CLOCK_INTERNAL, recommended if your CPU clock is above 1MHz?.
Quote:
Processor Clock is 5 mhz (20Mhz quartz crystal).
So, what did you do??? Did you study Table 21-1 in the datasheet? And with that information, did you fix your code?

Extra info: when you study the datasheet you have to be careful which clock is referenced.
    1) Fosc = external crystal == Processor frequency (20MHz in your project).
    2) Fosc/4 == System cycle clock == internal clock = time for 1 instruction (5 MHz in your project)


amdatlon wrote:
But how to get chips to use an internal comparing voltage (+5 V), and not be connected externally to the RA3?



Since I am a beginner, make mistakes, sorry:)
It is not very difficult, but you have to read closely the given hints:
Quote:
[PIC18 ADC] PC = 0x077E. Voltage references for ADC conversion yield a 0V range (V + = 0, V-= 0)
and:
Quote:
Now, look at the error message. Have you got Vdd being generated, and connected to your chip in your simulation?.
I give you one additional hint: Always have the datasheet for your PIC processor ready for reading. In this situation you will have to take a look at Figure 21-1 showing the A/D block diagram. There are two pins not connected in your schematic...
amdatlon



Joined: 07 Mar 2010
Posts: 10

View user's profile Send private message

PostPosted: Sun Jul 10, 2011 12:26 pm     Reply with quote

Sorry for bad English.

this table (20-1) I read it.

Well, to explain again.
I want to measure the analog signal port A0. I want to reference voltage is used internally to the CPU:
VREF-= 0V (GND)
and
VREF + = +5 V (Vdd)
Configured port:

Code:

# Byte ADCON_0 = 0xFC2
# Byte ADCON_1 = 0xFC1
# Byte ADCON_2 = 0xFC0
 
# bit ADCON_1_VCFG1 = ADCON_1.5  // VREF -
# bit ADCON_1_VCFG0 = ADCON_1.4  // VREF+


......
.....
         setup_adc(ADC_CLOCK_DIV_64);
         setup_adc_ports (AN0);
         ADCON_1_VCFG1 = 0; //  VREF-= VSS
         ADCON_1_VCFG0 = 0; //  VREF + = VDD
         set_adc_channel(0);



Correct?
because they did not report anything to the ADC ?!


If I use the following configuration
Code:
 
         ADCON_1_VCFG1 = 0; / / VREF-= VSS
          ADCON_1_VCFG0 = 1; / / VREF + = 5V external power


If you connect and RA3 (VREF +) at 5 V,
then ADC to operate normally.

But I do not want to reference an external voltage!
amdatlon



Joined: 07 Mar 2010
Posts: 10

View user's profile Send private message

PostPosted: Sun Jul 10, 2011 2:24 pm     Reply with quote

Sorry is my mistake, I really have not seen out there VDD and VSS pins of the processor.
I thought it was the other PIC, and these pins are connected by default in Proteus.
Now everything works as I want to be:)
Thanks for the help:)
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