Primero sacar lo de la interrupcion poniendo ADRESL y ADRESH a 0. Ya que es son 2 cosas que pueden hacer que te de 0. Eso y que leas efectivamente 0 del ADC. (Al final hay mas sobre esto)
Y ahora vamos con el tema de la multiplicacion.
result = ((unsigned short long int)ADRESL * 1275)>>8 ;
O si utilizas stdint, ( personalmente no me gusta la opcion anterior )
result = ((uint24_t)ADRESL * 1275)>>8 ;
Esto hace que ADRESL sea tomado como una variable de 24bits y cuando se multiplica el resultado entre por completo. luego el shift y se guarda.
De no haberlo realizado de esa forma ADRESL se promociona al tipo de 1275, es decir un int ( 16 bits ). Y se produce la multiplicacion en 16bits
Por ejemplo, con ADRESL = 250, y result siendo de
32bits sin signo para que pueda tener ese valor
result = (ADRESL * 1275);
Lo obtenido es : result = 0xFFFF.E418
Como la multipliacion en 16bits ( sin signo ) supera los 16bits se trunca a 16 quedando 0xE418, lo cual es con signo, al pasarlo a uno de 32 bits se promociona de nuevo pero se promociona a lo mas proximo y que pueda representar el valor, lo cual es: 24/32 bits con signo y se extiende el signo por eso las 0xFFFF, si repetimos el mismo trabajo con esta formula:
result = ((uint24_t)ADRESL * 1275);
El resultado es distinto, por que esta ves el mas grande es el de uint24_t, como resultado tenes que result tiene un valor de = 0x0003.E418.
Ahora si incorporamos todo.
result = ((uint24_t)ADRESL * 1275)>>8;
Queda en 0x03E4 , que es el valor buscado.
Optimizacion- Y ahora llega el momento de la optimizacion... Es necesario hacer ese calculo ? 1275 / 256 = 4.98
¿Crees que le estarias errando por mucho al hacerlo directamente asi?:
result = ((uint16_t)ADRESL * 5);
resultado = ((uint16_t)variable << 2) + variable;
Obviamente el maximo error se va a dar cuando ADRESL tenga un valor igual a 255.
Con tu formula : 0x4F6 -
350 ciclos en PIC sin multiplicador
Con 5 en la formula: 0x4FB ( Maximo error 5 ) -
219 ciclosCon shift de 2 + ADRESL : 0x4FB (Mismo error que con 5) -
17 ciclos ( Lo que hago es multiplicar por 4 y sumarle 1, en resume igual que multiplicar por 5 )
Error en tomar el valor ?- Y por otra parte .. por que estas tomando ADRESL cuando tu ADC es de 10 bits ? , si quisieras realmente reducir tu numero a un valor de 8 bits, deberias usar justificado izquierda y tomar ADRESH.
Error en activar el ADC ?- Estaria bueno que dijeras el PIC que posees, por que normalmente el bit de GO ( que activa la conversion ) esta en el bit 1 el cual nunca activas:
ADCON0 = 0b10001101;
Igual podrias hacer:
ADCON0bits.GO = 1; // Activo conversion
while(ADCON0bits.GO == 1); // Espero que termine.
Por lo que puede ser que no estes activando la conversion del ADC y por lo tanto siempre leas 0. Que es una de las 2 causas que dije al comienzo de por que puede dar 0.