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

PIC16F1709 and ADC VREF

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



Joined: 24 Jun 2005
Posts: 206

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

PIC16F1709 and ADC VREF
PostPosted: Sun Dec 04, 2016 2:39 am     Reply with quote

Hi All,

Can someone throw a quick eye over this and have a look to try to see where I am going wrong?

CCS = 5.025

Code:

#include <16f1709.h>
#fuses INTRC_IO, PLLEN, NOFCMEN, NOIESO, NOWDT, NODEBUG, NOMCLR, PUT
#use delay(clock=32M)

int16 test;

void main()

    setup_vref(VREF_ON | VREF_ADC_4v096);
    setup_adc(ADC_CLOCK_DIV_32);
    setup_adc_ports(sAN3 | VSS_VREF);
    set_adc_channel(3);
    delay_ms(100);
       
    while(1)
      {
            test = read_adc();
            delay_us(10);
      }
}


If I comment out the setup_vref line out and change the setup_adc to be VSS_VDD, all works fine.

With the Vref, however, all I ever get in "test" is almost full range reading (about 65470).

Can anyone see what I am doing wrong?

Thanks
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Sun Dec 04, 2016 2:52 am     Reply with quote

AN3 is on pin RA4 in the 16F1709. First question is, are you using pin RA4
for the input voltage ? What is the voltage on pin RA4 ?
Markdem



Joined: 24 Jun 2005
Posts: 206

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

PostPosted: Sun Dec 04, 2016 3:05 am     Reply with quote

Hi PCM,

Yes, learned my lesson well last time I mixed up the port and channel names Very Happy

I set the input voltage at about 2 volts for testing.

If I don't use the vref the reading is ok, so I must be using the right pin on the hardware. It has something to do with how I am setting up the vref but I have never used a internal one before.

Thanks
Ttelmah



Joined: 11 Mar 2010
Posts: 19553

View user's profile Send private message

PostPosted: Sun Dec 04, 2016 4:11 am     Reply with quote

Very simple little fault. What is 'Vref'?. It is not the internal fixed voltage reference. It is the Vref pin.....
To connect to the internal 'fixed voltage reference' (FVR), you need:

setup_adc_ports(sAN3 | VSS_FVR);

If you look at the diagram of the ADC in the data sheet, you will see that they show the three sources for the ADC +ve reference, as Vdd, Vref/AN1, or FVR.

As one other comment, 65472 is the maximum reading you can get from the ADC.
Remember it is a 10bit ADC. 0 to 1023. It is running in 'left shifted' mode by default, so will read in steps of 64. 0, 64.... 65408, 65472.

Normally much easier to specify #device ADC=10 so it reads as 0 to 1023.

Because the Vref pin in unconnected, the internal diodes in the ADC multiplexer, will be pulling it up to just below the voltage on your input, and you will get a maximum reading all the time....
Markdem



Joined: 24 Jun 2005
Posts: 206

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

PostPosted: Sun Dec 04, 2016 5:04 pm     Reply with quote

Thanks Ttelmah,

That thought also went thought my head, but the device file only has two options for setup_adc_ports;

Code:

// Optional Second argument:
#define VSS_VDD         0x00000000    //| Range 0-Vdd
#define VSS_VREF        0x02000000    //| Range 0-VrefH


My logic thinking says if I enable the VREF I would like to use it. So I assumed
Quote:

setup_vref(VREF_ON | VREF_ADC_4v096);

set ADPREF=10.

Checking the .lst file I find

Code:
....................     setup_adc_ports(sAN3 | VSS_VREF);
0093:  BCF    1E.0
0094:  BSF    1E.1


ADCON1 is at 1E on this chip, 2 low bits are ADPREF. Looking at the image on page 218 in the datasheet this should connect the vref to AN1 making it look as if I was using a external vref.
Is my thinking correct, or is there something I am missing?

Noted on the #device line, I will indeed be taking a 10 bit reading once I have this bit worked out. Just wanted to keep testing nice and clean.

Thanks
Markdem



Joined: 24 Jun 2005
Posts: 206

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

PostPosted: Sun Dec 04, 2016 5:13 pm     Reply with quote

After typing all that I think I know what is going on. Funny how talking about a problem makes you work it out..

AN1 is also the ISCP CLK pin. I have my pickit connected for debugging.
I think this is working OK, but the pickit is making AN1 high.

I will check this tonight, but I think this will be it.

Now I need another way to debug :(

Thanks
Ttelmah



Joined: 11 Mar 2010
Posts: 19553

View user's profile Send private message

PostPosted: Mon Dec 05, 2016 1:39 am     Reply with quote

The third option to select the FVR, was obviously 'post' your compiler.
It'd probably work if you just add it. The value is:

#define VSS_FVR 0x3000000 //| Range 0-FVR

Since the value is just or'ed into the register, it will probably work. Smile
Markdem



Joined: 24 Jun 2005
Posts: 206

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

PostPosted: Mon Dec 05, 2016 3:20 am     Reply with quote

Well my idea did not work, but yours did Very Happy

I now see what is going on. I was reading the datasheet the wrong way around..
For some resign I can't fathom I thought the box labelled ADC was the voltage reference source...

This is the second stupid question I have posted here in a row Embarassed

Thanks again.
Ttelmah



Joined: 11 Mar 2010
Posts: 19553

View user's profile Send private message

PostPosted: Mon Dec 05, 2016 4:02 am     Reply with quote

It's a 'nomenclature' problem.

The chips for years had Vref inputs. Then they added an internal Vref. Now problem is what can they call it?. They call it a Vref in the section about it, but then when using it for the ADC, call it the 'fixed voltage reference' (FVR). Now it sort of makes sense, to give it a different name, but would have made more sense I think if they had just called it the Internal voltage reference. Then the ADC settings could have had IVref as an option.
In this case the problem was made more confusing by CCS having 'left it out' on the older compilers....

There is really no such thing as a 'stupid question', provided you actually follow the answers. The ones that annoy are where the posters don't actually try anything for themselves, or give us good data. In your case, you 'came back' and said 'the device file only has two options for setup_adc_ports'. A quick look at an older compiler showed that CCS had failed to include it on these. Nice and easy to solve, but 'not obvious' unless you have been playing with CCS for years (too long actually...). Very Happy

Other good thing is you probably now understand these options better than most.....
Markdem



Joined: 24 Jun 2005
Posts: 206

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

PostPosted: Mon Dec 05, 2016 4:17 am     Reply with quote

Indeed, my understanding has gone up.
As soon as I looked at the fact that the register should be set '11' I knew what was going on. Sometimes I just need a little push in the right direction.

Might be time for a compile upgrade too.

Thanks again.
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