Te preguntaba por que pueden ser varias causas. Por ejemplo:
- En caso que el VDD del micro caiga.
Si no posees una referencia de tension para alimentar al ADC, significa que tu VDD va a ser tu maximo valor del ADC. El problema esta cuando el VDD varia. Vamos a los ejemplos con un ADC de 10bits y una entrada de 3V en el pin.
Para 5V en VDD, tenemos que cada cuenta del ADC es de 5V/1024 aproximadanetbe lo cual son 4.88mV , 3V significa que tendriamos 3V/4.88mv (614) en nuestro ADC.
Si por algun motivo la VDD cae en ese momento al bajar la tension de entrada y pasa a ser de 4V. Tenemos que cada cuenta del ADC es de 4V/1024 ( 3.9mV), lo cual para la misma entrada, es decir los 3V, tendriamos en nuestro ADC una cuenta de 768.
Nuestro micro no va a saber que "bajo" la tension VDD porque con esa tension sigue funcionando. Y nuestro programa va a creer que esos 768 son realmente cuando tenemos 5V en VDD, o lo que es lo mismo que el pin tenga 4.88mV * 768 = 3.75V, observa que estamos cometiendo un error de 0.75V
Por eso mismo es necesario ante posibles cambios de la VDD, que nuestro ADC se referencie con una referencia externa de tension, para eso esta el pin REF+ del PIC. Si entra en el pin que lees una tension igual al REF+ tendrias como resultado los 1023.
- En caso que el VDD no se modifique.
Como decis seguramente sea problema de tiempos ya que la corriente es muy poca. Lo ideal para cuando se trata de baterias es intentar quitarles la menor corriente posible, por lo tanto seria bueno poder ponerle un AO, para que la corriente la suministre el mismo, y el divisor resistivo pueda ser lo mas grande posible.
El PIC16F886 no posee forma de seleccionar el tiempo de adquisicion, es fijo, asi que la idea es que busques alguna otra alternativa, y que es la de usar el AO.
Hace no mucho se explico como calcular el tiempo necesario a otro usuario:
http://www.todopic.com.ar/foros/index.php?topic=47659.msg397052#msg397052