Probaria varias cosas... A pesar que para mi el programa "esta bien" ( entre comillas) probaria lo siguiente:
1-Esto ayudaria a descartar problemas de soft logica:
Reemplazar:
void leer_corriente(){
corriente1=read_adc();
corriente=((corriente1-512)*25); //cada unidad es 25mA
}
por
void leer_corriente(){
corriente1=read_adc();
corriente=495;
}
Si ahora el codigo ya NO genera error quiere decir que la logica esta bien.
2-No se como se maneja CCS, si poner int16 es unsigned o signed. Asi que por las dudas vamos a recurrir a dejarlo como estaba antes la formula y vamos a cambiar:
por
signed long corriente; // Es lo mismo que int16 con signo. no se si puedo ponerle signed int16
El tema es que si es sin signo, cuando hagas la resta.. ejemplo. (412-512) * 25 = -100 * 25 = -2500
Pero ese es el resultado con signo, si tu numero es sin signo, lo que guardarias es 62935 aproximadamente. Y siempre daria error. Y el unico momento que no de error seria cuando el ADC valga de 512 a 532, por que 532-512 = 20, 20*25 = 500 y ya estas en tu borde es decir que si usas un numero SIN signo el rango se reduce a solo 20 valores del ADC, es decir una variacion de 100mV en la entrada. ( con 5V y ADC 10bits)
3-Si todo lo anterior ya falla significa que algo esta mal. Deberias leer la tension de entrada del ADC con un multimetro. Esto tranquilamente lo podes hacer con un potenciometro a la entrada del ADC, no hace falta conectar el sensor. Verificar que la formula sea correcta. Y de ultima podes agregar unas pruebas con leds para saber si corriente1 es mayor o menor a ciertos valores. antes de la formula. Actualmente el maximo valor que podria tener tu ADC es de 532, suponiendo que estas a 5V y 10 bits son 2.6V aproximadamente.