TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: aprendiz_de_Pic en 12 de Enero de 2005, 16:06:00
-
Saludos a todos en el foro:
Pues veran estoy realizando un identificador de colores, ya tengo mi acondicionador de señal que me da de 0-5V dependieendo del color, pero..
...tengo un problema con el ADC del Pic, despliego en el LCD el valor que lee el ADC y cuando no conecto nada a la entrada tengo un (ff) y cuando la entrada la pongo a tierra obtengo un (00). por un momento pense que esto era bueno, pero cuando conecto una señal de entrada de .5 -4.5V sigo obteniendo un (FF) como si no contara la señal de entrada. entonces revise con un multimetro el puerto RA0 con el Voltimetro y encontre una señal de 4.9V no importando el valor de la entrada excepto cuando la conecto a tierra. Aclaro que utilizo la misma fuente y probe una externa uniendo las tierras pero tampoco.
Pienso que es problema en mi codigo. por favor solicito su experiencia
para solucionar esto
claro que tambien se aceptan consejos y opiniones acerca de este.
#include <16F874A.H>
#device *=16 ADC=8
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#use rs232(baud=9600)
#include <LCDC2.C>
#include <stdlib.h>
void main()
{
int value;
LCD_Init();
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( LINE_1 + 0 );
printf ( LCD_PutChar, "Identificador de " );
LCD_SetPosition ( LINE_2 + 5 );
printf ( LCD_PutChar, "Colores" );
delay_ms(255);
delay_ms(255);
delay_ms(255);
delay_ms(255);
do { //ciclo (do )para refrescar lectura
setup_port_a( ALL_ANALOG ); //configuracion del ADC
setup_adc( ADC_CLOCK_INTERNAL );
set_adc_channel( 0 ); //RA0 como entrada
value = Read_ADC(); //leyendo el ADC
if (value>0xfc & value<=0xff) //rango para el color Blanco
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( LINE_1 + 1 );
printf(LCD_PutChar,"A/D = %2x" , value);
LCD_SetPosition ( LINE_2 + 5 );
printf(LCD_PutChar,"Blanco"
;
delay_ms(255); //evitar parpadeo de la lectura
delay_ms(255);
delay_ms(255);
delay_ms(255);
}
if (value>=0x00 & value<0x05) //rango para el color negro
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( LINE_1 + 1 );
printf(LCD_PutChar,"A/D = %2x" , value);
LCD_SetPosition ( LINE_2 + 5 );
printf(LCD_PutChar,"Negro"
;
delay_ms(255);
delay_ms(255);
delay_ms(255);
delay_ms(255);
}
if (value>=0x14 & value<0x32) // rango para el color azul
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( LINE_1 + 1 );
printf(LCD_PutChar,"A/D = %2x" , value);
LCD_SetPosition ( LINE_2 + 5 );
printf(LCD_PutChar,"azul"
;
delay_ms(255);
delay_ms(255);
delay_ms(255);
delay_ms(255);
}
if (value>=0x40 & value<0x70) //rango para el color cafe
{
LCD_PutCmd ( CLEAR_DISP );
LCD_SetPosition ( LINE_1 + 1 );
printf(LCD_PutChar,"A/D = %2x" , value);
LCD_SetPosition ( LINE_2 + 5 );
printf(LCD_PutChar,"Cafe"
;
delay_ms(255);
delay_ms(255);
delay_ms(255);
delay_ms(255);
}
}
while (TRUE) ;
}
-
bien, para empezar, vamos derecho a ....
1. deberias sacar del loop infinito las cosas q se necesitan se ejecuten solo una vez, tipo:
setup_port_a( ALL_ANALOG ); //configuracion del ADC
setup_adc( ADC_CLOCK_INTERNAL );
2. te aconsejo poner el pin del conversor como entrada, no recuerdo si es necesario, pero lo hago siempre.
3. luego de elejir el canal (set_adc_channel) debes esperar un cierto tiempo q es para q la señal se estabilice y se tome la muestra. (esto te falta), revisa el data sheet para confirmar estas cosas.
creeria q con esto deberia salir andando, el hecho q midas 4.9v casi seguro q es pq esta el pin como out.
Suerte y avisa q paso.
-
Te agradezco mucho tu consejo, ahora mismo estoy corrigiendo lo de la organizacion. Por cierto tambien habia pensado en lo el pin como salida pero...
...la verdad no se como especificar que es entrada el canal RA0.
podrias decirme como se hace.
gracias
-
otra vez soy:
muchisimas gracias.
Andaba cansadon y no reflexione, claro que se definir las entradas ajajjaja.
pero gracias con esto funciono correctamente.
ya me marca 0V
y gracias por los consejillos
David
saludos desde colima