La bibliteca de funciones del MCP3204 de CCS (deduzco que es el compilador que usas), tiene algunos defectos basicos.
Un defecto es el uso de Delay_cycles().
Cualquier pausa que hagas con esta instruccion, irremediablemente sufre el efecto del cambio de un cristal, ya que usa un NOP para establecer una pausa.
Esa pausa es variable al cambiar el cristal.
Hay tiempos minimos a respetar en la comunicacion con el MCP (ver hoja de datos), que no se pueden cambiar demasiado, ya que afectan el resultado.
Mi solucion al respecto fue usar Delay_us() en reemplazo de las originales Delay_cycles().
Luego ajustar bien las pausas y listo!!
Ahora me funciona con cristales de 4 MHZ (para el cual fue hecha la rutina) de 10, 20 MHZ y tambien ahora con 40 MHZ !!
El otro problema puede ser de hardware, es posible que no hayas hecho planos de masa, no hayas filtrado como corresponde, hayas mezclado las lineas de comunicacion digital con los trazos de las entradas analogas, y muchas otras cosas posibles.
En la pagina de Microchip hay notas de aplicacion que hablan de como hacer un buen diseño para evitar estos problemas, que son utiles para cualquier conversor, no solo el de ellos...
Igual nunca pude obtener mejor que +/-2 lsb, pero aunque apenas lo cumple, por lo que veo te servira para tus fines.
Suerte!!
