Autor Tema: Como conmutar entradas ADC 16f877  (Leído 8074 veces)

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

Desconectado Gonzalo_BlackHawk

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 519
Re: Como conmutar entradas ADC 16f877
« Respuesta #15 en: 16 de Mayo de 2008, 18:23:45 »
Hola Kcire, la verdad que muy bueno el circuito, lo unico que veo que no has corregido es que estas apagando y encendiendo y volviendo a configurar el ADC cada vez que tomas una medicion. Salvo que necesites ahorrar energia, coloca las instrucciones setup_adc(adc_clock_div_32) y setup_adc_ports( RA0_RA1_RA3_ANALOG) al principio del main y no apagues nunca el ADC.
Asi ahorraras instantes cada vez que conviertas un valor,  y como el proceso es continuo, esos instantes se transforman en muchas mas mediciones para una determinada cantidad de tiempo.
Prometo volver para explicar lo del ADC, estoy medio apurado y no llego a escribir todo, a ver si el fin de semana puedo sentarme  :-).

Un saludo.



"Siempre piensa si el jugo vale la exprimida..."

"La muerte esta tan segura de vencer que nos da toda una vida de ventaja."

Desconectado kanaryes

  • PIC10
  • *
  • Mensajes: 8
Re: Como conmutar entradas ADC 16f877
« Respuesta #16 en: 29 de Mayo de 2008, 13:58:34 »
Hola, estoy utilizando el compilador de PICC Lite, tengo 3 potenciómetros conectados a las patillas RA0, RA1 y RA2. En lo que estoy atascado es en saber una vez que dentro de la interrupción del ADC,  cuando el flag de ADIF==1, cómo recorro los puertos para leer los valores y cómo saber ese valor convertidoa qué entrada corresponde.
Muchas gracias por las respuestas.

Código: [Seleccionar]
void interrupt convertir (void){
if(ADIF==1)
{
ADIF=0;                 //Bajo banderita
temp=(ADRESH<<8)+ADRESL; //Justifico a la derecha
templcd=hexadec(temp); //A decimal

iniciar_lcd();
lcd_control(0x80); //Pone el mensaje en la 1ª fila
prueba(); //Envia al LCD

if (templcd<RA1){ //si la T actual es menor que la que introducimos

if (RA1>RA2){ //Si la Tª min rango>Tmax rango=>Error

lcd_control(0x80); //Primera fila del lcd
error(); //Rango mal introducido
RC0=1; //apaga led calor xq hay error en rango
}
else{
lcd_control(0x80); //fila 1 lcd
RC0=0; //apago led calor RA1
prueba3(); //mostramos calor en el lcd
}
}


Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: Como conmutar entradas ADC 16f877
« Respuesta #17 en: 29 de Mayo de 2008, 14:53:52 »
Saludos kanaryes!

Pues no he trabajado con PICC Lite, sino con CCS; pero me imagino que el principio es muy parecido.
Por ahí en uno de mis mensajes te aporté un código, no sé si lo has visto, es este:


int conversion (int canal)
{
   int value;
   set_adc_channel(canal);
   delay_us(20);
   value=read_adc();
   return(value);


y luego llamar a la función desde el main, por ejemplo:
V1=conversion(0);
V2=conversion(1);

De manera que desde el main, dentro del while, llamas a la función para convertir el canal analógico digital, y el canal que se está leyendo está guardado en la variable canal. Si colocas esa variable como global podrías leerla desde la función de la interrupción por ADC y listo, tienes qué pin estás leyendo....
También podrías hacer en el main algo más elegante como:

Código: [Seleccionar]
int pin=0;

// **********

Valor[pin]=conversion(pin);
pin++;
if (pin==3) pin=0;

Así pin tomaría los valores 0,1,2... y leería correspondientemente los canales 0,1 y 2 del pic, guardándolos en Valor[0], Valor[1] y Valor[2], respectivamente.
Bueno es una sugerencia.
No sé si eso es lo que estabas buscando... espero haberte ayudado en algo.

Ok nos leemos!  :mrgreen:

donde pin serían los valores
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web