Hola mue, hay algunas cositas que no esta bien en tu programa, ya firepic hizo hincapié en una:
Vk = (float)read_adc();
y tambien
Ik = (float)read_adc();
La función read_adc() devuelve un valor entero de acuerdo al preprocesador #device adc=x, que en tu caso sera 1 byte. Luego estas haciendo un casting a un numero con coma flotante para luego guardarla en una variable del tipo entero de 1 byte de longitud (Mira en las declaraciones, tanto Vk como IK son del tipo int). En limpio, estas convirtiendo una variable entera de 1 byte en un numero con coma flotante para luego volver a convertirlo en un numero entero de 1 byte, lo cual es un desperdicio de tiempo de procesador. Para que el codigo sea correcto coloca en reemplazo de las instrucciones anteriores lo siguiente:
Vk = read_adc();
y tambien
Ik = read_adc();
Con respecto a la instruccion setup_adc, estas configurando el reloj del ADC en forma incorrecta, una frecuencia de la mitad del reloj principal solo es valida para frecuencias de cristal menores o iguales a 1.25 MHz. Para tu caso, 20 MHz y un PIC 16F877 recomiendo que reemplazes la instrucción setup_adc por esta otra:
setup_adc(ADC_CLOCK_DIV_32);
Para informarte mas sobre la configuracion del tiempo de conversion del ADC lee este post, aqui se ha debatido sobre ello:
Seguimiento a los voltajes de I/O de un trafoCon respecto a la instrucción delay_us(50) esta no es necesaria pues una vez que read_adc() termina y devuelve el valor convertido pues cambiar el canal de entrada sin esperar. Es más, transcurridos 100 ns luego de comenzar read_adc() el capacitor del sample & hold se desconecta y ya se puede cambiar el canal de entrada, pero bueno, eso es orejón de otro tarro y no voy a entrar en detalles.
Veo que declaraste algunas variables globales como estaticas, nunca he tenido la oportunidad de probar que efectos tiene este tipo de declaracion en la memoria, pero por definicion, una variable global es estatica por si misma y declararla como static o no es indiferente, salvo que tengas varias unidades de compilacion en tu proyecto.
Por ultimo supongo que falta algo de código en el programa, pues faltan los corchetes que cierran el main y el bucle while, sin eso no iras a ninguna parte, no podras ni compilar tu programa. Perdona por haberte dejado tanto trabajo
, esperamos con ansias tus logros.
Un saludo desde Argentina.