Autor Tema: Duda sobre el conversor A/D del PIC16f874  (Leído 1997 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado kracket

  • PIC10
  • *
  • Mensajes: 1
Duda sobre el conversor A/D del PIC16f874
« 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

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Duda sobre el conversor A/D del PIC16f874
« Respuesta #1 en: 20 de Julio de 2008, 23:19:23 »
Hola.

Mira 7 segmentos con int timer0, 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
Código: [Seleccionar]
while(true)
{
 ....
}

Saludos
El papel lo aguanta todo