![](templates/subSilver/images/CCSLogo.jpg) |
![CCS C Software and Maintenance Offers](templates/subSilver/images/forumAd6.jpg) |
View previous topic :: View next topic |
Author |
Message |
sysysy
Joined: 17 Nov 2010 Posts: 38 Location: 121
|
16f877A Port A (ADC) |
Posted: Sat Dec 04, 2010 7:46 am |
|
|
Hi,
May I know if it is allowed to use only 1 of the Port A pin (channel 0 to read the adc), then the remaining Port A pins to control my motor?
Problem Encountered:
When I only use PIN_A0 to interface with the output of LM35, my LCD show me valid temperature result. (29 Celcius or 61 Resolution number.)
But when I enable my motor control pins that also use Port A, then the temperature result becomes not correct. I wonder why this could happen.
when i use multimeter to measure the pin, the voltage is about 0.29v (29celcius), but the lcd display never 29 but 33 Celcius++ something. and it is not stable, sometimes will exceed 40 and 50 Celcius.
Following is my setup:
Code: |
set_tris_A(1) ; //only pin_a0 to be an input
setup_adc(ADC_CLOCK_INTERNAL); //use internal clock
setup_adc_ports(0xE); //use only pin_a0 as analog input
set_adc_channel(0); //set pin_a0 as adc channel
|
Anyone can point out my setup problem?
Thanks,
sysysy |
|
![](templates/subSilver/images/spacer.gif) |
Ttelmah
Joined: 11 Mar 2010 Posts: 19366
|
|
Posted: Sat Dec 04, 2010 9:59 am |
|
|
What chip?.
It is probably not a 'setup problem'.
There is a fault in the setup, if your CPU clock is higher than 1MHz. _Read the adc section of the data sheet_. Look at what clock is recommended for your CPU clock rate, and read the note about ADC_CLOCK_INTERNAL.
Then use the defines for selecting the adc_port, don't use your own values for this.
Two more things:
1) Unless you are using 'fast_io, don't bother with the TRIS. The compiler will do this for you, _but_ is you are using a byte wide port output (output_a), this _will_ interfere with your ADC, unless you switch to using fast_io....
2) Your problem has all the symptoms of possibly being noise. When you start controlling things like motors, _careful_ electrical design is needed....
Best Wishes |
|
![](templates/subSilver/images/spacer.gif) |
sysysy
Joined: 17 Nov 2010 Posts: 38 Location: 121
|
|
Posted: Sat Dec 04, 2010 11:18 am |
|
|
Quote: | There is a fault in the setup, if your CPU clock is higher than 1MHz. _Read the adc section of the data sheet_. |
Thanks for the reply.
I just do an experiment just now, I use another PIC to repeat the test.
(Pre-condition: only 1 pin use in the whole A port). In the result, I can get precise value that display on my LCD. So, I really suspect is the noise in my previous problem. (Since 10mV already affect 1 celcius).
But one thing not clear here, I use 4 MHz clock for my PIC. But the adc section of the 16f877a datasheet really not talk much about how to choose the clock rate. It just show how to set the register according to what clock rate we want?
May I know, how really this take effect in the outcome? Why is it so crucial? Can you give me some example?
Thanks.
regards,
sysysy |
|
![](templates/subSilver/images/spacer.gif) |
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sat Dec 04, 2010 11:18 pm |
|
|
Actually, the data sheet says exactly what is needed:
Quote: |
11.2 Selecting the A/D Conversion
Clock
The A/D conversion time per bit is defined as TAD. The
A/D conversion requires a minimum 12TAD per 10-bit
conversion. The source of the A/D conversion clock is
software selected. The four possible options for TAD
are:
• 2TOSC
• 8TOSC
• 32TOSC
• Internal A/D module RC oscillator (2-6 µs)
For correct A/D conversions, the A/D conversion clock
(TAD) must be selected to ensure a minimum TAD time
of 1.6 µs.
|
With a 4 MHz oscillator, the oscillator period is 250 ns.
The clock divisor values above give the following Tad times:
Quote: |
2TOSC = 500 ns
8TOSC = 2 us
32TOSC = 8 us
Internal = 2 to 6 us (Only use if PIC is running at less than 1 MHz).
|
A divisor of 8 gives a TAD time of 2us. This divisor allows the fastest
conversion time which still satisfies the minimum TAD time of 1.6 us.
So your setup_adc() statement should look like this:
Code: |
setup_adc(ADC_CLOCK_DIV_8);
|
|
|
![](templates/subSilver/images/spacer.gif) |
sysysy
Joined: 17 Nov 2010 Posts: 38 Location: 121
|
|
Posted: Sun Dec 05, 2010 12:09 am |
|
|
Thanks for the explanation.
Anyway, I am very honestly say sorry here, because I re-check the datasheet again and found that the bottom section for the choosing clock rate explanation after the set register part.
This is the very serious mistake that I made. Sorry for never scroll down and assume it finish after reading the how to set register part.
Again, thanks for the help,
going to digest all of them now.
Thanks.
regards,
sysysy |
|
![](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
|