Conversor A/D en 16f877 en CCS

#1
Hola amigos!!, les quería hacer una consulta, hace un par de días que estoy tratando de hacer funcionar el conversor A/D con una referencia externa y me da error. Primero lei el puerto AN0 configurado como analogico así:

setup_adc_ports(RA0_ANALOG) o setup_adc_ports(AN0)

y funciona ok, pero el problema es que necesito colocar una referencia externa, que conecto en AN2 y AN3, y configuro el reguistro de la siguiente forma:

setup_adc_ports(AN0_VSS_VREF)

y el compilador me contesta:

Identificador no definido: AN0_VSS_VREF :unsure:

Como me llamo mucho la atencion, ya que el identificador lo copie tectualmente del libro de CCS, comence a probar lo siguiente:

setup_adc_ports(AN1)

Como para poner el canal 1 en Ana, en ves del 0 y tambien me da que el identificador no existe AN1....

Alguno le paso o tiene alguna pista para tirarrrr........

Gracias por su tiempooooooooo

Saludos
 
#2
Como me llamo mucho la atencion, ya que el identificador lo copie tectualmente del libro de CCS, comence a probar lo siguiente:
No hace falta estar probando...
No se te ocurrió revisar el archivo *.h del PIC que usas???
ahí están todas las definiciones junto con los cambios que se hace con cada
versión.
Está muy claro que en el archivo *.h el identificador AN0_VSS_VREF no existe, además la combinación de AN0 + VSS + VREF tampoco es posible ya que en la hoja de datos del PIC indica que físicamente no es posible...

salu2
 
#4
Hola, bueno, acá estoy retomando el tema del conversor!, ya esta todo configurado como para colocar una referencia externa de 2v, arme todo el circuito y en un display muestro el valor del conversor, sin ningún tratamiento al valor (osea que va de 0 a 1024).

Todo parecía que iba a funcionar, PERO NO!!!, la medición es superrrrr inestable!!, vi que a varios les paso, pero creo que mi inestabilidad no es del micro para afuera, paso a explicar:

a- Lo primero que desconfié fu la referencia externa inestable o con ruido, entonces medí directamente en las patas del micro con un buen multimetro y obtuve 2000.0 mV clavado!, igualmente le coloque un capa de .1 soldado en la pata de ref y masa, con las patas lo mas cortas posibles. Probe y todo igual.... :(

b- despues probe colocando una pila en la entrada analógica con los cables lo mas cortitos posibles (al rededor de 5 o 6 cm) y nada! en el display leo 650 +- 15 super inestable!, le coloque otro capa de .1 soldado de la pata de ANA0 a masa, pero igual!.

La alimentación tiene un 7805 con unos capa a la entrada y a la salida de 100 uf y .1 uf

En la alimentación de la referencia le coloque un capa de .1 bien pegadito al IC

La lectura del conversor la hago cada 350 ms...

copio el pedazo de programa donde realizo la lectura:


void medir (void)

{
setup_adc_ports(AN0_AN1_AN2_AN4_VSS_VREF); // A0 A1 A2 A5 VRefh=A3 => Entonces pata 2-3-4-6 Analogico Pata 5 Referencia
setup_adc(ADC_CLOCK_DIV_8); // setea al conversor que funcione con el oscilador interno RC
while(contador <= 100000)
{
set_adc_channel(0); // SELECCIONO EL CANAL ANALOGICO A LEER
delay_us(20);
q = read_adc();
p = q; //Para realizar un promedio en un futuro
delay_ms(250);
lcd_gotoxy(1,2);
lcd_putc('\f');
printf(lcd_putc, "Midiendo = %01.4fv",p); // le puse q para ver directamente el valor del conversor
delay_ms(100);
contador++;
}
}

Gracias por tomarse el trabajo de leer todo y me quedo a la espera de sugerencias!!

Saludos cordiales!!

Gustavo
 
#5
Como estan amigos soy nuevo en ccs quisiera su ayuda tengo un circuito comos e muestra en la miniatura el cual consta de un lcd un pulsador un pic (16f877a) y estoy usando el an0 y an1 lo que quiero es mostrar en el lcd primero un valor luego pulsado el pulsador otro valo y no se como hacerlo pero he avanzado algo aqui les dejo el codigo espero q me puedan ayudar:


#include<16f877a.h>
#device adc=10
#fuses xt, nowdt
#fuses
#use delay(clock=4000000)
#include <lcd.c>
#BYTE TRISC = 0x87
#BYTE PORTC = 0x07
#USE FAST_IO(C)


void main() {
int16 q;
float p;
int16 v;
float w;
bit_set (TRISC , 0); // C0 como entrada, para el pulsador


setup_adc_ports(all_analog);

setup_adc(ADC_CLOCK_INTERNAL);

lcd_init();

printf(lcd_putc, "\f laprotel");
printf(lcd_putc, "\n tx-uhf-1000w");//\f
delay_ms(3000);
while(true)
{
set_adc_channel(0);
delay_us(30);
q=read_adc();
delay_ms(50);
p=( 5.0 * q) / 1024.0;
p=p*10;
delay_ms(10);

set_adc_channel(1);
delay_us(30);
v=read_adc();
delay_ms(50);
w=( 5.0 * q) / 1024.0;
w=w*10;
if (input( pin_c0==0))
{
printf(lcd_putc, "\f FUENTE 1");
printf(lcd_putc, "\n AMPERIOS = %2.2f",p);
}
else
{
printf(lcd_putc, "\f FUENTE 1");
printf(lcd_putc, "\n AMPERIOS = %2.2f",w);
}
delay_ms(200);

}
}
 

Temas similares

Arriba