Hola a todos, me acabo de mover a esto de la programacion en C para PICs (antes usaba ASM), y me salio un detalle en la conversion A/D, aqui el codigo:
#include <16F877A.h>
#use delay (clock=4000000)
#byte puertaa = 05 /* Posición de la puerta A */
#byte puertab = 06 /* Posición de la puerta B */
#byte puertac = 07 /* Posición de la puerta C */
#byte puertad = 010 /* Posición de la puerta D */
void display(int);
void main()
{
int temp=0;
puertaa=0;
puertab=0;
puertac=0;
puertad=0;
set_tris_a(1);
set_tris_b(0x00);
set_tris_c(0x00);
set_tris_d(0x00);
setup_adc_ports(ALL_ANALOG);
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0);
temp=0;
link1:
temp=read_adc();
display(temp);
goto link1;
}
void display(int k)
{
int decena, unidad;
puertad=k;
if((k>=0)&(k<=9))
{
unidad=k;
decena=0b00111111;
}
if((k>=10)&(k<=19))
{
unidad=k-10;
decena=0b00000110;
}
if((k>=20)&(k<=29))
{
unidad=k-20;
decena=0b01011011;
}
if((k>=30)&(k<=39))
{
unidad=k-30;
decena=0b01001111;
}
if((k>=40)&(k<=49))
{
unidad=k-40;
decena=0b01100110;
}
if((k>=50)&(k<=59))
{
unidad=k-50;
decena=0b01101101;
}
if((k>=60)&(k<=69))
{
unidad=k;
decena=0b01111101;
}
if((k>=70)&(k<=79))
{
unidad=k-10;
decena=0b00000111;
}
if((k>=80)&(k<=89))
{
unidad=k-20;
decena=0b01111111;
}
if((k>=90)&(k<=99))
{
unidad=k-30;
decena=0b01101111;
}
if(unidad==0)
unidad=0b00111111;//0
if(unidad==1)
unidad=0b00000110;//1
if(unidad==2)
unidad=0b01011011;//2
if(unidad==3)
unidad=0b01001111;//3
if(unidad==4)
unidad=0b01100110;//4
if(unidad==5)
unidad=0b01101101;//5
if(unidad==6)
unidad=0b01111101;//6
if(unidad==7)
unidad=0b00000111;//7
if(unidad==8)
unidad=0b01111111;//8
if(unidad==9)
unidad=0b01101111;//9
output_high(PIN_C0);
output_low(PIN_C1);
puertab=decena;
delay_ms(1);
output_low(PIN_C0);
output_high(PIN_C1);
puertab=unidad;
}
Lo que hace el programa es convertir el valor analogico de un sensor de temperatura (LM35), y mostrar el valor por medio de dos displays multiplexados. El detalle es de que me pasa el valor pero dividido en 2, es decir, suponiendo que a la entrada tengo 0.24v, el valor que me da con la funcion "temp=read_adc();" es de 12.... Ademas, en el codigo de ASM, configuraba el pic para poder meter un voltaje de referencia por los pines RA2 RA3, pero en C, no se como configurar eso, ¿Que es lo que estoy haciendo mal, o que codigo me falta? ¿Es necesario un voltaje de referencia?
De antemano, gracias