# Conversor analogo digital con pic 16f877 y programacion en c



## jeje_lis27 (Nov 29, 2008)

Hola a todos necesito hacer un conversor analogo digital con Pic 16f877 y programacion en c....si alguien me puede ayudar o ya tiene el programa se lo agradeceria demasioado...

gracias Jennyfer  [/size]


----------



## El nombre (Nov 29, 2008)

esto igual te orienta


```
#include <16f876a>
#device ADC=8
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
#use standard_io(b)


int valor=0x00;

void toma_adc(void){

// Lectura del canal 0
set_adc_channel(0);
delay_ms(1);
valor=read_adc();
delay_ms(1); //para que se estabilice
}

void main() {

setup_adc(ADC_CLOCK_INTERNAL); //configura el converso
setup_adc_ports(RA0_analog); //entrada 0 como analogica
do {
toma_adc();
output_b(valor);
}while(true);
}
```

Suerte


----------



## gemetzelgott (Nov 30, 2008)

Estos son 2 programas cn conversor anologo-digital, el primero es muy sencillo, simplemente el valor leido en un potenciometro lo muestra por un puerto del pic. 


```
#include <16f877A.h>
#device adc=8 //NUMERO DE BITS A UTILIZAR 
#use  delay(clock=4000000)
#byte porta= 0x05

#byte portd= 0x08

int valor;
void main()
{
 set_tris_a(255);
 set_tris_d(0);
 setup_adc_ports(all_analog);//QUE PUERTOS SE VAN A UTIIZAR PARA LA CONVERSION, EN ESTE CASO SON TODOS LOS DEL PUERTOS
 setup_adc(adc_clock_internal);//EL TIEMPO DE MUESTREO DE LA SEÑAL ANALOGA, EN ESTE CASO ES EL INTERNO QUE ES MAS O MENOS 19,7uS
 set_adc_channel(0);
 delay_us(20);
 while(1)
 {
  valor=read_adc(); //LA LECTURA LA HACE IGUAL A UNA VAIABLE
  portd=valor;//LA VARIABLE LA HACE IGUAL AL PUERTO D
 }
}
```

En el segundo un potenciometro controla la posición de un servomotor(ademas del conversor analogo digital, tambien utiliza el timer2)


```
#include <16f877A.h>
#device adc=8
#use  delay(clock=4000000)
#byte porta= 0x05

#byte portc= 0x07



#bit rc0= 0x07.0
int cont,port,valor;
float var;
#int_timer2
interr()
{
 cont++;
 if(cont>var)
 {
  rc0=0;
 }
 else
  rc0=1;
  if(cont>200)
  {
   cont=0;
  }
}
void main()
{
 set_tris_a(255);
 set_tris_c(0);
 setup_adc_ports(all_analog);
 setup_adc(adc_clock_internal);
 setup_timer_2(t2_div_by_1,100,1);
 enable_interrupts(int_timer2);
 enable_interrupts(global);
 set_adc_channel(0);
 delay_us(20);
 while(1)
 {
  valor=read_adc();
  port=valor;
  if (port==0)
   var=3;
  else
   if (port==25)
    var=4,5;
   else
    if (port==51)
     var=6;
    else
     if (port==102)
      var=10;
     else
      if (port==204)
       var=17;
      else
       if(port==255)
        var=21;
        
 }
}
```


----------



## daos (Dic 4, 2008)

Hola Alguien me puede decir como puedo pasar una señal de entrada de audio por un pic y q este la saque como una salida analogicaaa,? la idea es que en la salida lo espere un opam y un altavoz!

Saludos!


----------



## Valmort (Dic 5, 2008)

Hola daos

   Puedes utilizar el modulo ADC del PIC (por ejemplo el 16f877) para convertir la señal analoga a digital y posteriormente utilizar un DAC (por conexion externa) para obtener la señal análoga de nuevo, ya despues la puedes meter al Op-Amp.
   Debes tener en cuenta que tendras una latencia o delay con respecto a la señal de entrada.

    Saludos, en lo que te pueda echar la mano


----------



## chip986 (Dic 10, 2008)

hola jenifer, no entiendo bien, tienes que hacer un conversor analogo digital o tienes que convertir una señal analoga a digital mediante el A/D del pic.  yo tengo el codigo en c para convertir una señal analoga a digital en el pic.


----------



## metalblood (Dic 11, 2008)

hola "el nombre" y "gemetzelgott" pueden poner esos programas en ensamblador porfavor


----------



## tiopepe123 (Dic 11, 2008)

CReo que esta mal planteada la pregunta por falta de datos.

Para empezar estamos hablando de audio y los pic son un poquito justitos, pero para segun que se adaptan perfectamente.

Creo que lo principal de tu pregunta es que nos comentes que quieres conseguir para poder evaluar si es posible y como debe implementarse.

Si es un secreto de estado, por favor no lo divulgues.


----------



## danyctm (Abr 28, 2009)

hola estaba poniendo un poco de atensión al tema  de la conversion analoga y estaba haciendo un pragra ma para un sensor y su salida es analoga pero nunca trabaje entradas analogas si alguein triene un ejemplo para almacenar el dato analogo en una variable para mostrarlo en un display gracias


----------



## markonix (Jul 30, 2009)

Hola tu tienes el codigo fijate que yo tengo algo similar a lo que ya le mandaron a ella, necesito que mi pic reciba una señal analogica convertirla a digital y despues enviarla a una pantalla de LCD ya lo intente pero me lo da en ASCII y necesito transformarla a decimal... yo lo sabia hacer pero con los PRINTF directamente los manipulaba con los %x o %d etc etc. y queria saber si tu sabes como hacerlo porfa... esto es lo que tengo:

*nota(lo del r232 es por que me lo habian pedido tambien para que lo pasar apor el serial por eso lo puse ahora como comentario no le pongas mucha atensión

gracias, espero puedas ayudarme...


```
#include<16f877a.h>
#fuses HS,NOLVP,NOWDT,PUT,XT,NOPROTECT,NOCPD,NOBROWNOUT
#use delay(clock=20000000)
//#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)
#include"lcd_raph.c"

void main() {
   int value;
   lcd_init();
   
   //printf("muestras:");
   
   setup_adc_ports( RA0_ANALOG );
   setup_adc(ADC_CLOCK_INTERNAL);
   set_adc_channel( 0 );
   
   do {                      
         delay_ms(100);
         value = read_adc();
        
      }
      //printf("nrvalor: %x", value);
      lcd_putc("\flos valores son...\n");
      lcd_putc(value);
      delay_ms(100);
   } while (TRUE);
}
```


----------



## kieroing (Nov 28, 2012)

chip986 dijo:


> hola jenifer, no entiendo bien, tienes que hacer un conversor analogo digital o tienes que convertir una señal analoga a digital mediante el A/D del pic.  yo tengo el codigo en c para convertir una señal analoga a digital en el pic.





Hola oye m podrias ayudar yo necesito convertir señal analoga a digital que es enviada por el puerto paralelo o usb y con el pic 16f84a pasarla al monitor con una interfaz en java o visual basic.... ayuda plis no soy muy buena en esto apns esty empezando y esty preocupada


----------



## tavotlokot (Mar 28, 2013)

no me funciona correctamente la conversión si alguien pudiera echarle un ojo a esto se los agradeciera,
debo multiplicar por 20.5 en lugar de 5, nada mas dejo marcado el problema acá:


```
#include <16f877a.h>
#fuses hs, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP
#use delay(clock=4000000)
//#use fast_io(b) 
#include <LCD.C>
//#use fast_io(c)

void main() {
   int16 q;
   float p;
  // set_tris_c(0x00);
   setup_adc_ports(AN0);                                   //Canal 0 analógico
   setup_adc(ADC_CLOCK_INTERNAL);    //Fuente de reloj RC
  // output_c(0x00);
   lcd_init();
   
   for (;;) {
      set_adc_channel(0);           //Habilitación canal0
      delay_us(20);//aqui modifique era 20
      q = read_adc();                  //Lectura canal0


      p =20.5 * q / 1024.0; //aquí es la duda, se supone que solo debería multiplicar por cinco pero no funciona, debo agregar el 20 y no funciona ok
      delay_ms(200);


      printf(lcd_putc, "\fADC = %4ld", q);
      printf(lcd_putc, "\nVoltage = %f", p);
      delay_ms(200);
      
     
      
      
      }
}
```


----------



## D@rkbytes (Mar 28, 2013)

tavotlokot dijo:


> no me funciona correctamente la conversión si alguien pudiera echarle un ojo a esto se los agradeciera,
> debo multiplicar por 20.5 en lugar de 5


¿Para que divides entre 1024 si la resolución del ADC la tienes en 8 bits?
8 bits es la resolución por default si no la estableces.

Tienes 2 opciones.
Cambiar tu divisor por 255, ó agregar esto en la cabecera del programa...
#device adc = 10 // 10 bits de resolución.

Saludos.


----------



## eduard3ro (Feb 18, 2014)

Buenos dias quisiera saber si me pueden colaborar con un codigo que haga lo siguiente, un pic 12f675 lea por una entrada analoga una señal que varia en su amplitud en milivoltios, montada sobre un mivel dc 2.5 voltios dc el programa debe hacer lo siguiente cuando detecte en su entrada 20 mvoltios ac  o mas debe el micro generar un cero por un pin de salida y si el valor leido es menor a 20 mvoltios ac debe sacar 5 voltios, les agradezco la ayuda.


----------



## D@rkbytes (Feb 18, 2014)

eduard3ro dijo:


> Buenos días. Quisiera saber si me pueden colaborar con un código que haga lo siguiente, un pic 12f675 lea por una entrada análoga una señal que varia en su amplitud en milivoltios, montada sobre un nivel de 2.5 voltios dc el programa debe hacer lo siguiente.
> Cuando detecte en su entrada 20 milivoltios ac  o mas debe el micro generar un cero por un pin de salida y si el valor leído es menor a 20 milivoltios ac debe sacar 5 voltios, les agradezco la ayuda.


¿Y que es lo que llevas hecho por el momento?
Adjunta tu código, diagrama ó simulación para que se te pueda colaborar.


----------



## Saint_ (Feb 21, 2014)

Hola Eduard3ro, lo primero que tendrías que hacer es, amplificar esos 20mV, este valor de ac es bastante pequeño, amplifícalo hasta más o menos 1.5a 2 pico y recién lo sumas con los 2.5VDC, así será más fácil que el microcontrolador lo reconozca, una vez hecho eso con el adc del microcontrolador toma muestras, y para obtener el RMS de la señal alterna puedes usar la desviación estándar "creo que es ese el equivalente del VAC" de una señal, luego de ello solo te quedara comparar para sacar un 0 o 1 por el puerto que quieras.


----------

