|
|
View previous topic :: View next topic |
Author |
Message |
pandu.ranganadh
Joined: 28 Apr 2008 Posts: 12 Location: hyd
|
|
|
Matro Guest
|
|
Posted: Tue Apr 29, 2008 7:52 am |
|
|
Compared to given code, you basically just have to change the "setup_adc_ports(AN0); " in order to connect all the channels you want to the ADC and to perform a "set_adc_channel(x)" to select the channel you want to convert.
Matro |
|
|
pandu.ranganadh
Joined: 28 Apr 2008 Posts: 12 Location: hyd
|
ADC Problem |
Posted: Wed Apr 30, 2008 12:52 am |
|
|
Hi,
Thanks for giving reply, I have selected other channel like you said.
setup_adc_ports(All_analog); then there is no output, if I can select
setup_adc_ports(All_analog); or setup_adc_ports(A0_analog); and set_adc_channel(0) then only o/p is coming, otherwise if any one of them I can change then there is no o/p.
Please fix this problem. Thanking you, |
|
|
Matro Guest
|
|
Posted: Wed Apr 30, 2008 1:29 am |
|
|
You have to add a "set_adc_channel(x)" before converting each x channel.
Matro |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Wed Apr 30, 2008 1:36 am |
|
|
Quote: |
I want to take ADC i/p's from all channels and selected channel ADC
o/p display on the LCD. |
Does your board look exactly like the photo in your link above ?
If so, then you have the older version of the PicDem2-Plus. It uses pins
A1, A2, and A3 for the LCD, and pin A4 is used for switch S2. |
|
|
pandu.ranganadh
Joined: 28 Apr 2008 Posts: 12 Location: hyd
|
Board detils for solving multiple ADC channel problem |
Posted: Wed Apr 30, 2008 9:30 am |
|
|
Hi thanks for sending reply, Now I am very happy.
Yes, I am using PIC older version board, which is exactly shown in link available in
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=1406&dDocName=en010072&part=DM163022 .
if i can use as "setup_adc_ports(AN0); " then its giving error, its not accepting AN0, insted of AN0 i have given "all_analog or a0_analog" for channel-0, and "set_adc_channel(0)" then its working. But my job is i need to take multiple i/p's and process selected channel i/p only.
I have an other problem, actually my requirement is i need to send 0-30V as analog i/p's, but our board ADC bares up to 5V, so how to solve this problem, is there any alternative method available ?
Please fix this problem.
Thanking you, |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Thu May 01, 2008 10:33 am |
|
|
Quote: | If I use as "setup_adc_ports(AN0); " then its giving error. |
1. Post the PIC that you're using.
2. Post your compiler version. |
|
|
adamsya Guest
|
is it like this? |
Posted: Mon May 12, 2008 11:18 pm |
|
|
is it ok if i write the coding lik this for multiple ADC reading? it can be compile... but i dont test it on hardware or simulation yet...
Code: |
#include <16F877A.H>
#device adc=10
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=2000000)
//#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
#include "lcd.c"
//============================
void main()
{
int16 adc_value0,adc_value1,adc_value2,adc_value3,adc_value4,adc_value5,adc_value6,adc_value7;
float volts;
lcd_init();
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_8);
set_adc_channel(0); //a0
set_adc_channel(1); //a1
set_adc_channel(2); //a2
set_adc_channel(3); //a3
set_adc_channel(4); //a5
set_adc_channel(5); //e0
set_adc_channel(6); //e1
set_adc_channel(7); //e2
delay_us(20);
while(1)
{
adc_value0 = read_adc(0); //a0
adc_value1 = read_adc(1); //a1
adc_value2 = read_adc(2); //a2
adc_value3 = read_adc(3); //a3
adc_value4 = read_adc(4); //a5
adc_value5 = read_adc(5); //e0
adc_value6 = read_adc(6); //e1
adc_value7 = read_adc(7); //e2
volts = (float)(adc_value0 * 5)/1023.0;
printf(lcd_putc, "\f%3.2f", volts);
delay_ms(500);
}
}
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 12, 2008 11:46 pm |
|
|
Quote: | is it ok if i write the coding like this for multiple ADC reading |
No.
Do it like this:
1. Set the desired channel.
2. Wait for 20 us.
3. Read the ADC.
4. Do the calculations.
5. Display the result.
The same steps are required for each channel.
Do it in a for(;;) loop.
Quote: | #use delay(clock=2000000) |
Your clock is set for 2 MHz. That is probably not correct.
Quote: | setup_adc(ADC_CLOCK_DIV_8); |
If your clock is 20 MHz, then the divisor should be 32, not 8. |
|
|
arawana
Joined: 06 Apr 2008 Posts: 19 Location: SINGAPORE
|
|
Posted: Tue May 13, 2008 3:13 am |
|
|
i had change some.. but it is correct how i define set_adc_channel(0) to set_adc_channel(7)?
i want to use all the ADC channel at same time.. if there is a change or not at any ADC pins.. i want it to display at printf... it is correct?
iam using PIC16F877A, 20MHz and PCWH v3.40...
iam not very good in programing.. iam glad if anyone can help me~ thanks...
Code: |
#include <16F877A.H>
#device adc=10
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=20000000) //20MHz
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
void main()
{
int16 adc_value0,adc_value1,adc_value2,adc_value3,adc_value4,adc_value5,adc_value6,adc_value7;
float volt0,volt1,volt2,volt3,volt4,volt5,volt6,volt7;
int i;
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_32);
set_adc_channel(0); //a0
set_adc_channel(1); //a1
set_adc_channel(2); //a2
set_adc_channel(3); //a3
set_adc_channel(4); //a5
set_adc_channel(5); //e0
set_adc_channel(6); //e1
set_adc_channel(7); //e2
delay_us(20);
while(1)
{
for(i=0;i<100;i++)
{
adc_value0 = read_adc(0); //a0
adc_value1 = read_adc(1); //a1
adc_value2 = read_adc(2); //a2
adc_value3 = read_adc(3); //a3
adc_value4 = read_adc(4); //a5
adc_value5 = read_adc(5); //e0
adc_value6 = read_adc(6); //e1
adc_value7 = read_adc(7); //e2
volt0 = (float)(adc_value0 * 5)/1023.0;
volt1 = (float)(adc_value1 * 5)/1023.0;
volt2 = (float)(adc_value2 * 5)/1023.0;
volt3 = (float)(adc_value3 * 5)/1023.0;
volt4 = (float)(adc_value4 * 5)/1023.0;
volt5 = (float)(adc_value5 * 5)/1023.0;
volt6 = (float)(adc_value6 * 5)/1023.0;
volt7 = (float)(adc_value7 * 5)/1023.0;
printf("\f\n Volt0: %3.2f",volt0);
printf("\f\n Volt1: %3.2f",volt1);
printf("\f\n Volt2: %3.2f",volt2);
printf("\f\n Volt3: %3.2f",volt3);
printf("\f\n Volt4: %3.2f",volt4);
printf("\f\n Volt5: %3.2f",volt5);
printf("\f\n Volt6: %3.2f",volt6);
printf("\f\n Volt7: %3.2f",volt7);
delay_ms(500);
}
}
}
|
|
|
|
arawana
Joined: 06 Apr 2008 Posts: 19 Location: SINGAPORE
|
|
Posted: Tue May 13, 2008 3:50 am |
|
|
what if i write like this? is it correct?
Code: |
#include <16F877A.H>
#device adc=10
#fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=20000000) //20MHz
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, ERRORS)
void main()
{
int16 adc_value0,adc_value1,adc_value2,adc_value3,adc_value4,adc_value5,adc_value6,adc_value7;
float volt0,volt1,volt2,volt3,volt4,volt5,volt6,volt7;
int i;
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_DIV_32);
while(1)
{
for(i=0;i<100;i++)
{
set_adc_channel(0); //set to read channel a0 next
delay_us(20);
adc_value0 = read_adc(); //get 10 bit readig for channel 0
volt0 = (float)(adc_value0 * 5)/1023.0;
printf("\f\n Volt0: %3.2f",volt0);
delay_ms(500);
set_adc_channel(1); //set to read channel a1 next
delay_us(20);
adc_value1 = read_adc(); //get 10 bit readig for channel 1
volt1 = (float)(adc_value1 * 5)/1023.0;
printf("\f\n Volt1: %3.2f",volt1);
delay_ms(500);
set_adc_channel(2); //set to read channel a2 next
delay_us(20);
adc_value2 = read_adc(); //get 10 bit readig for channel 2
volt2 = (float)(adc_value2 * 5)/1023.0;
printf("\f\n Volt2: %3.2f",volt2);
delay_ms(500);
set_adc_channel(3); //set to read channel a3 next
delay_us(20);
adc_value3 = read_adc(); //get 10 bit readig for channel 3
volt3 = (float)(adc_value3 * 5)/1023.0;
printf("\f\n Volt3: %3.2f",volt3);
delay_ms(500);
set_adc_channel(4); //set to read channel a5 next
delay_us(20);
adc_value4 = read_adc(); //get 10 bit readig for channel 4
volt4 = (float)(adc_value4 * 5)/1023.0;
printf("\f\n Volt4: %3.2f",volt4);
delay_ms(500);
set_adc_channel(5); //set to read channel e0 next
delay_us(20);
adc_value5 = read_adc(); //get 10 bit readig for channel 5
volt5 = (float)(adc_value5 * 5)/1023.0;
printf("\f\n Volt5: %3.2f",volt5);
delay_ms(500);
set_adc_channel(6); //set to read channel e1 next
delay_us(20);
adc_value6 = read_adc(); //get 10 bit readig for channel 6
volt6 = (float)(adc_value6 * 5)/1023.0;
printf("\f\n Volt6: %3.2f",volt6);
delay_ms(500);
set_adc_channel(7); //set to read channel e2 next
delay_us(20);
adc_value7 = read_adc(); ///get 10 bit readig for channel 7
volt7 = (float)(adc_value7 * 5)/1023.0;
printf("\f\n Volt7: %3.2f",volt7);
delay_ms(500);
}
}
}
|
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Tue May 13, 2008 11:13 am |
|
|
That will sort of work, but you don't know why. You also don't
know why it's not the best way.
You need to spend a few weeks studying the C language and
programming. The purpose of this forum is not to teach you
how to write a program. You should take a class to do that. |
|
|
pandu.ranganadh
Joined: 28 Apr 2008 Posts: 12 Location: hyd
|
ADC Problem |
Posted: Wed May 14, 2008 2:09 am |
|
|
Hi,
I have tested the above code, but its not working for other than the channel-0.
Except channel-0, remaining channels are not working.
There is no display on LCD.
I think "setup_adc_channel() " function is not pointing to remaining channels ?
Sorry if any wrong, its just my doubt. Please anybody check my problem.
Bye
Thanking you all. |
|
|
rayleight Guest
|
|
Posted: Tue Dec 15, 2009 10:51 am |
|
|
hye..
can we read adc from 2 channel at the same time
i'm using 16f877a.. |
|
|
dyeatman
Joined: 06 Sep 2003 Posts: 1934 Location: Norman, OK
|
|
Posted: Tue Dec 15, 2009 11:26 am |
|
|
No.
If you look at the PIC16F877a datasheet on page 129 you will see that is not
possible. There is only ONE A/D module that is switched between inputs.
That's why set_adc_channel() is required.
You really need to read the datasheet to understand how the PIC functions. _________________ Google and Forum Search are some of your best tools!!!! |
|
|
|
|
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
|