# Convertidor A/D para termometro con PIC16f876a



## kaldor (Ene 29, 2008)

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


----------



## kaldor (Ene 29, 2008)

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


----------



## tiopepe123 (Ene 29, 2008)

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.


----------



## kaldor (Ene 30, 2008)

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


----------



## damianj84 (Ene 30, 2008)

No se nada de PICs, pero fijate que tiopepe123 te escribió channel con doble N, y no con N simple como lo escribiste tu.


----------



## kaldor (Ene 30, 2008)

muy observador damian  aveces  los problemas son las cosas mas tontas 

gracias^^


----------



## Paloky (Ene 30, 2008)

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.


----------



## tiopepe123 (Ene 30, 2008)

Pero que vista teneis...

Yo lo copie directamente del help.
Tambien seria interesante meterle un 
set_tris_a(0xff);  por si acaso


----------



## kaldor (Feb 12, 2008)

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:


```
#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


----------

