|
|
View previous topic :: View next topic |
Author |
Message |
steppermotor
Joined: 24 Oct 2010 Posts: 10
|
PIC 16F877A LCD with ADC |
Posted: Thu Oct 28, 2010 7:33 pm |
|
|
I'm new to the world of PIC. I've got my LCD working, but I'm trying to display the voltage I that is read in by the PICs ADC port. I'm using the PIC 16F877A, here is sections of my code. However it keeps displaying 8, even when I have it connected to 5 Volts or ground. Any idea what's wrong with my code, that is does not measure the correct voltage.
Code: |
char print_lcd(char s[])
{
delay_ms(1000);
lcd_putc('\f');
delay_ms(250);
output_high(pin_b0);
delay_ms(250);
printf(lcd_putc,"LCD Works");
delay_ms(5000);
lcd_gotoxy(0x1,2);
lcd_putc(s);
return s;
}
void measure_voltage()
{
char txt[20];
int16 voltage, adc_value;
while(true){
set_adc_channel(0);//set the pic to read from AN0
delay_us(20)
adc_value = read_adc();
voltage = adc_value*(5/1023);
sprintf(txt, "%i\0", (int)voltage);
print_lcd(txt);
}
}
void main()
{
char txt[20] = "yes";
setup_adc(ADC_CLOCK_DIV_8);
setup_adc_ports(ALL_ANALOG);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
output_low(pin_b0);
lcd_init();
print_lcd(txt);
measure_voltage();
} |
|
|
|
vinniewryan
Joined: 29 Jul 2009 Posts: 154 Location: at work
|
|
Posted: Thu Oct 28, 2010 8:19 pm |
|
|
Well in the line "voltage = adc_value*(5/1023);", you're multiplying "voltage" by .004, and if your ADC value is anywhere between 1875 and 2124, then your outcome would always be 8 because the PIC would round the number to the nearest integer. Try removing the "(5/1023)" and report the result.
I see no appearent mistakes in your code, so you may also want to post the rest of the code as well.
You can also try writing a simple code that only tests the ADC port, something like:
Code: |
#include '16f677.h'
#use_delay(clock=xxxxxxx)
#use adc=10
#define//
int16 voltage=0;
void main()
{
while(1)
{
setup_adc(ALL_ANALOG)
set_adc_channel(0);
delay_us(20);
voltage=read_adc;
printf('%i', voltage);
}
}
|
This is just an example, not a working code. _________________ Vinnie Ryan |
|
|
steppermotor
Joined: 24 Oct 2010 Posts: 10
|
Re:LCD W ADC |
Posted: Thu Oct 28, 2010 8:33 pm |
|
|
Thanks, Vinnie for your reply, I made the following modifications. The output is just 000000, even when I have plugged the RA0 to 5 V.
Code: |
void measure_voltage()
{
//char txt[20];
int adc_value;
int16 voltage;
//float voltage;
output_high(pin_b0);
delay_ms(250);
printf(lcd_putc,"LCD Works");
while(1)
{
set_adc_channel(0);
delay_us(20);
voltage=read_adc();
printf(lcd_putc,"%lu",voltage);
}
}
void main()
{
setup_adc(ADC_CLOCK_INTERNAL);
setup_adc_ports(ALL_ANALOG);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(TRUE);
output_low(pin_b0);
lcd_init();
//print_lcd(txt);
measure_voltage();
} |
|
|
|
steppermotor
Joined: 24 Oct 2010 Posts: 10
|
Got it working |
Posted: Thu Oct 28, 2010 8:43 pm |
|
|
Thanks, but I got it working.
I modified to the following:
Code: |
while(1)
{
set_adc_channel(0);
delay_us(20);
voltage=read_adc();
printf(lcd_putc,"%u",voltage);
} |
and changed setup_adc(ADC_CLOCK_DIV_32);
from setup_adc(ADC_CLOCK_INTERNAL);
Thanks |
|
|
steppermotor
Joined: 24 Oct 2010 Posts: 10
|
One more problem |
Posted: Thu Oct 28, 2010 9:12 pm |
|
|
When I have a 5V input on my PIC 16F877A ADC AN0 Port is outputs:
1023 on the LCD which I know is the correct value, but when I attempt to multiply by 5/1023 and this does not gives me a result of zero. Perhaps I'm using the wrong int/float/lu. Any suggestions?
Code: |
void measure_voltage()
{
int16 voltage;
int16 con_voltage;
float con_voltage2;
//float voltage;
output_high(pin_b0);
delay_ms(250);
printf(lcd_putc,"LCD Works");
//while(1)
// {
set_adc_channel(0);
delay_us(20);
voltage=read_adc();
printf(lcd_putc,"%lu\n",voltage); // This displays 1023 which is correct for 5 VDC
con_voltage = (int)voltage * (5/1023);
printf(lcd_putc,"%lu",con_voltage); //outputs 0
delay_ms(20);
con_voltage2 = (int)voltage * (5/1023);
delay_ms(20);
printf(lcd_putc," %lf",con_voltage2); //outputs 0
// }
} |
|
|
|
steppermotor
Joined: 24 Oct 2010 Posts: 10
|
Got it again |
Posted: Thu Oct 28, 2010 9:41 pm |
|
|
I changed:
Code: |
while(1)
{
set_adc_channel(0);
delay_us(20);
voltage=read_adc();
con_voltage2 = voltage * (5.0/1023.0);
delay_ms(20);
printf(lcd_putc,"\n%lf",con_voltage2);
}
} |
|
|
|
|
|
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
|