A mí me funcionaba tanto con el ADC como poniendo el pin del cátodo en entrada y midiendo cuánto tiempo permanecía en alto.
¿Qué tipo de LED estás usando? En mis pruebas obtuve los mejores resultados con LEDs rojos de alta luminosidad.
Revisando mi código (que utiliza el ADC pero en el que también está comentada/deshabilitada al final del código la sección que usaba el pin como entrada) he visto que hice pruebas tomando 15 medidas consecutivas del ADC y calculando la media o simplemente quedándome con el valor mínimo de todas ellas (creo recordar que hice esto porque había fluctuaciones en la lectura del ADC), y finalmente me quedé con el valor mínimo.
//// ledSensor.c ////
//// ////
//// Autor: jfmateos2 ////
//// Contacto: jfmateos@lycos.es ////
//// Madrid, febrero 2008 ////
//// ////
/////////////////////////////////////////////////////////////////////////
#include <18F4550.h>
#fuses HSPLL,NOWDT,NOPROTECT,NOLVP,NODEBUG,USBDIV,PLL5,CPUDIV1,VREGEN, CCP2C1
#device ADC=10
#use delay(clock=48000000)
#include ".\include\usb_cdc.h"
#define catodo0 PIN_A0
#define catodo1 PIN_A1
#define catodo2 PIN_A2
#define catodo3 PIN_A3
#define catodo4 PIN_A4
#define anodo0 PIN_B4
#define anodo1 PIN_B3
#define anodo2 PIN_B2
#define anodo3 PIN_B1
#define anodo4 PIN_B0
int1 conversorOcupado=0;
#INT_AD
void ad_handler(){
conversorOcupado=0;
}
//ADC
void main(){
int i,maximo,intervalo,umbral,cuantizado;
int32 lecturas, minimo, media;
int32 valor, lectura[20];
usb_cdc_init();
usb_init();
while(!usb_cdc_connected()) {}
setup_adc(ADC_CLOCK_DIV_64 );
set_adc_channel(0);
setup_adc_ports(AN0);
enable_interrupts(INT_AD);
clear_interrupt(INT_AD);
output_bit(catodo0,1);
output_bit(anodo0,0);
output_bit(anodo1,0);
output_bit(anodo2,0);
output_bit(anodo3,0);
output_bit(anodo4,0);
umbral=120;
intervalo=19;
do{
set_tris_b(27);
set_tris_a(1);
minimo=1024;
media=0;
//maximo=0;
for(i=0;i<15;i++){
conversorOcupado=1;
read_adc(ADC_START_ONLY);
while(conversorOcupado){
}
valor = read_adc(ADC_READ_ONLY);
if(valor<minimo){
minimo=valor;
}
}
cuantizado=0;
for(i=1;i<=18;i++){
if(minimo>((int32)((int32)intervalo*(int32)i))){
cuantizado=i;
}
}
output_bit(catodo0,0);
output_bit(anodo0,1);
output_bit(anodo1,1);
output_bit(anodo2,1);
output_bit(anodo3,1);
output_bit(anodo4,1);
usb_task();
if (usb_enumerated()) {
//printf(usb_cdc_putc, "%u %Lu", cuantizado, minimo);
printf(usb_cdc_putc, " %c",cuantizado);
//printf(usb_cdc_putc, "\n\r");
}
delay_ms(20);
output_bit(catodo0,1);
output_bit(anodo0,0);
output_bit(anodo1,0);
output_bit(anodo2,0);
output_bit(anodo3,0);
output_bit(anodo4,0);
}while(true);
}
/*
//Contabilizar estado alto
void main(){
int32 lecturas;
usb_cdc_init();
usb_init();
while(!usb_cdc_connected()) {}
output_bit(catodo0,1);
output_bit(catodo1,1);
output_bit(catodo2,1);
output_bit(catodo3,1);
output_bit(catodo4,1);
output_bit(anodo0,0);
output_bit(anodo1,0);
output_bit(anodo2,0);
output_bit(anodo3,0);
output_bit(anodo4,0);
do{
lecturas=0;
set_tris_b(27);
set_tris_a(31);
while (input(catodo2)){
lecturas++;
}
usb_task();
if (usb_enumerated()) {
printf(usb_cdc_putc, "Lecturas= %Lu ", lecturas);
printf(usb_cdc_putc, "\n\r");
}
output_bit(catodo0,1);
output_bit(catodo1,1);
output_bit(catodo2,1);
output_bit(catodo3,1);
output_bit(catodo4,1);
output_bit(anodo0,0);
output_bit(anodo1,0);
output_bit(anodo2,0);
output_bit(anodo3,0);
output_bit(anodo4,0);
delay_ms(100);
} while(true);
}*/