TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: kracket en 20 de Julio de 2008, 16:53:39
-
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
-
Hola.
Mira 7 segmentos con int timer0 (http://www.todopic.com.ar/foros/index.php?topic=21738.0), ahi uso el ADC y despliego el valor en displays. Para configurar otra forma del ADC abre el archivo 16F877A.h y busca en la seccion del ADC, ahi estan las opciones para configurarlo, o puedes asignar la direccion de los registros ADCONx para configurarlo tu mismo.
En lugar de usar el GOTO, por que no usas el while, seria mejor
while(true)
{
....
}
Saludos