![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
Labjac
Joined: 15 Dec 2011 Posts: 20
|
Simply trying to read a analog signal |
Posted: Thu Dec 22, 2011 8:51 am |
|
|
Hallo again.
Yesterday I had a serial question and today battling with a simple analog reading question.
Wiring was done correctly I think, I'm using a Pic16F690 and would like to read one analog signal from port_a Pin_An2 (Pin17 on the pic).
But battling to find some code that will only assign the one pin of Analog the rest of the A port are used for the PICKIT2 2 programmer and would like to keep it as is.
Yesterday everybody told me I must get rid of the TRIS function and let the compiler handle the pin assignments.
This is what I understand from the Analog, please let me know where I'm going wrong.
Using the test code from the library but would like to only assign one PIN. Code as follow:
void main() {
int i, value, min, max;
printf("Sampling:");
setup_port_a( ALL_ANALOG ); -(Done want to assign the entire channel
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 );
do {
min=255;
max=0;
for(i=0; i<=30; ++i) {
delay_ms(100);
value = Read_ADC();
if(value<min)
min=value;
if(value>max)
max=value;
}
printf("\n\rMin: %2X Max: %2X\n\r",min,max);
} while (TRUE); |
|
![](templates/subSilver/images/spacer.gif) |
temtronic
Joined: 01 Jul 2010 Posts: 9178 Location: Greensville,Ontario
|
|
Posted: Thu Dec 22, 2011 9:16 am |
|
|
It's all in the details !! You've got to read the ADC section of the data sheet for your PIC.
According to the ds, using the internal RC clock is ONLY to be used during 'sleep' for some combinations of processor speed, VDD,etc.
As for selecting only one ADC port,read the header for your PIC for info about 'legal' combinations of pin usage.
I don't use the PICKIT2 so cannot comment on what pins it uses . |
|
![](templates/subSilver/images/spacer.gif) |
Labjac
Joined: 15 Dec 2011 Posts: 20
|
|
Posted: Thu Dec 22, 2011 10:14 am |
|
|
Hi
Problem wasn't what pin to use, I knew I wanted to use Pin17 and the was An02, but the issue was I didn't know how to assign only one Pin (Meaning pin17).
But this worked not sure if it's correct but maybe you can comment on the correct wording?
Code below:
Code: |
#include <16F690.h>
#fuses intrc,nowdt,noprotect,put
#use delay(clock=8M)
#use rs232(baud=9600,xmit=PIN_B7,rcv=PIN_B5,bits=8,ERRORS)
#define In1 PIN_C0
#define Op1 PIN_C1
void main()
{
int value;
set_adc_channel(2);
setup_adc( ADC_CLOCK_INTERNAL );
while(1)
{
If (!Input(In1) == 1 )
{
//delay_ms(500);
Printf("Die value is");
delay_ms(20);
output_high(Op1);
delay_ms(value);
output_low(Op1);
delay_ms(value);
value = Read_ADC();
delay_ms(10);
}
}
} |
|
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19384
|
|
Posted: Thu Dec 22, 2011 10:58 am |
|
|
Not really.....
The key point is to read the data sheet.
Then look at the .h file for the chip, where there are the list of values for ADC pin selection, which correspond exactly to the values in the data sheet.
You need to select an ADC channel. Not selecting any, is the same as 'ALL_ANALOGS'. It'll work because when you drive a pin as output, it overrides the ADC setting, _but_ will result in digital noise from the output being coupled into the ADC multiplexer, extra power being drawn, and extra noise.
It is a bit like the joke about the lady who (on a car with a carburetor), pulls the choke knob out and hangs her [spam] on it. The car will work, but not right...
Look at the line starting #define sAN2 in the .h file.
Separately, there is the issue of clock selection. Though it won't stop the ADC from working, it makes accuracy less good if the internal RC clock is selected. This is a line from the data sheet:
"When the device frequency is greater than 1 MHz, the FRC clock source is only recommended if the conversion will be performed during Sleep.".
Now you are not performing your conversion during sleep, and your clock is faster than 1Mhz. So, select the right clock - look at table 9-1 in the data sheet. Look for the values in white squares, without a comment mark against them. Then again look at the .h file, and select the setting that gives this division.
You need to become totally 'picky' about detail, and the data sheet must be your first port of call for everything.
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
Labjac
Joined: 15 Dec 2011 Posts: 20
|
|
Posted: Thu Dec 22, 2011 11:55 am |
|
|
Hi Ttelmah
Thanks for the reply, as I mentioned in my first post, I'm completly new in using PIC's. (Use to PLC programming), and still battling to understand the basics, eg. datasheets I can scroll through the .h files and see writing but what is all means is still to be tested.
Maybe a silly question, but you are talking about the #define sAN2 in the .h file, can you give me an example of the way you would done the definition of the program I pasted before please.
I manage to at least get a line to display on serial with the value changing in Hyperterminal when I turn the POT.
But would like to learn the correct way from the start.
Thanks for your help. |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
![](templates/subSilver/images/spacer.gif) |
Labjac
Joined: 15 Dec 2011 Posts: 20
|
|
Posted: Thu Dec 22, 2011 1:30 pm |
|
|
Thanks for the guidelines.
The code is done as follow and think this is correct.
Code: |
#include <16F690.h>
#fuses intrc,nowdt,noprotect,put
#use delay(clock=8M)
#use rs232(baud=9600,xmit=PIN_B7,rcv=PIN_B5,bits=8,ERRORS)
#define In1 PIN_C0
#define Op1 PIN_C1
void main()
{
int value;
setup_port_a(sAN2);
setup_adc( ADC_CLOCK_DIV_16 );
while(1)
{
If (!Input(In1) == 1 )
{
Printf("Die value is %u\n\r",value);
delay_ms(20);
output_high(Op1);
delay_ms(value);
output_low(Op1);
delay_ms(value);
set_adc_channel(2);
delay_ms(10);
value = Read_ADC();
delay_ms(10);
}
}
} |
|
|
![](templates/subSilver/images/spacer.gif) |
gpsmikey
Joined: 16 Nov 2010 Posts: 588 Location: Kirkland, WA
|
|
Posted: Thu Dec 22, 2011 1:35 pm |
|
|
One minor issue I see - the first time through, "value" has not been assigned a numeric value - only declared so odd things may happen :-) (I don't remember off hand just what delay_ms() does if the number you pass it is 0 either.
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 |
|
![](templates/subSilver/images/spacer.gif) |
Labjac
Joined: 15 Dec 2011 Posts: 20
|
|
Posted: Fri Dec 23, 2011 6:37 am |
|
|
Thanks
Busy changing it... And so we learn from the clever people.
THanks again for all the help... |
|
![](templates/subSilver/images/spacer.gif) |
|
|
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
|