Convertidor A/D para termometro con PIC16f876a

#1
Hola buenas
Queria comentaros sobre un conversor A/D que ya me funciona , obtiene la tension por la patilla RA0 que en este caso seria un lm335 el que la aumenta o disminuye la tension segun la temperatura y me saca por lcd ( XºC ), pues bien quiero ampliar esta trabajo introducciendo otro lm335 y el problema que tengo es que no consigo configurar para que la patilla RA1 como entrada analogica, me da erorres de compilacion al configurar asi :

setup_adc_ports(RA1_ANALOG);

con : setup_adc_ports(RA0_ANALOG); funciona bien

tambien puedo poner : setup_adc_ports(ALL_ANALOG); pero claro el resultado de la conversion lo obtengo de : resultado=read_adc();
¿ como podria obtener por separado la conversion de la entrada RA0 y RA1 ?

Gracias por adelantado
Saludos
 
#2
Bueno pues ya he conseguido configurar los puetos de entrada analogicos con:

setup_adc_ports( RA0_RA1_RA3_ANALOG );

aun asi no consigo leer la conversion individual de cada una de las entradas
 
#3
Haces el ?
set_adc_channel(1);


Mira el ex_admm.c
C:\Archivos de programa\PICC\Examples

Y aqui todas combinaciones que puedes configurar tu ADC (puedes abrirlos con el bloc de notas)
C:\Archivos de programa\PICC\Devices



Si quieres mejorar un poco mas en precision, puedes utilizar las REF o sea poner en A2 tension minima y A3 tension maxima.

Con tres resistencias en serie calculas los margenes que te interesan, pero hay un limite
La tension diferencial entre A2 y A3 debe ser de unos 2.5V si no interprete mal el datasheet.
 
#4
Muchas gracias por la información tiopepe

pues no utilizo set_adc_chanel(1); por que al compilar me da error:

undefined identifier set_adc_chanel

mi progrma es el siguiente:

#include<16f876.h>
#device adc=10
#fuses HS,NOPROTECT,NOWDT
#use delay(clock=4000000)
#include <string.h>
#include <lcd.c>
#byte por_b=6
#ORG 0X1F00,0X1FFF{}// reserva la memoria para el bootloader
int y;
unsigned long int resultado,x;
main()
{

lcd_init();
set_tris_b(0x00);
setup_adc_ports( RA0_ANALOG );
setup_adc(ADC_CLOCK_INTERNAL);
//set_adc_chanel(); da error
resultado=read_adc();
while(1)
{

resultado=read_adc();
x=(resultado-559);
y=x/2;
delay_ms(10);
printf(LCD_PUTC,"\f %d%cC",y,223);
delay_ms(50);
}

}
y sobre la tension de referencia no lo utilizo ya que uso la de 5v a 0v y que la tiene por defecto aunque la tensiones con las que voy a jugar son de 2.73v que en el lm335 son 0ºC hasta 3.73v 102ºC
 
#7
A parte de la dos "n" del channel, tambien se tiene que poner el número entre parentesis correspondiente al número del convertidor que quieras leer.
 
#9
Ya sabia yo que esto no iva a ser tan facil

Bueno pues el programa funciona correctamente en proteus y me saca las temperaturas por lcd, pero ahora estoy montando el circuito y no aparece nada en el lcd, se que este dispositivo necesita un tiempo entre instrucciones para que funcione bien y ya no se que hacer le he metido delays en casi todo el programa pero no consigo que se visualiza nada.

el codigo es el siguiente:

Código:
#include<16f876.h>
#device adc=10
#fuses HS,NOPROTECT,NOWDT
#use delay(clock=4000000)
#include <string.h>
#include <lcd.c>
#byte por_b=6

#ORG 0X1F00,0X1FFF{}// reserva la memoria para el bootloader
int y,w;
unsigned long int resultado,x,resultado2,z;
main()
{
set_tris_b(0x00);
delay_ms(40);
set_tris_a(0xff);
lcd_init();
delay_ms(40);
setup_adc_ports( RA0_RA1_RA3_ANALOG );
delay_ms(40);
setup_adc(ADC_CLOCK_INTERNAL);
delay_ms(40);

   while(1)
      {
      set_adc_channel(0);
      delay_ms(10);
      resultado=read_adc();
      delay_ms(10);
      set_adc_channel(1);
      delay_ms(10);
      resultado2=read_adc();
      delay_ms(10);
      x=(resultado-559);
      y=x/2;
      z=(resultado2-559);
      w=z/2;
      delay_ms(10);
      printf(LCD_PUTC,"\f %d%cC",y,223);
      printf(LCD_PUTC,"\n %d%cC",w,223);
      delay_ms(50);
      }

}

Agraderia cualquier detalle que pueda ser de ayuda .
gracias