En teoria es un mal codigo. Hay cosas mal implementadas tambien y hay errores.
Cosas que encontre y que deberias solucionar:
1- No estas guardando W y STATUS al comienzo de la rutina de interrupcion y saliendo de la misma. Aunque esto no es tu problema, lo va a ser si es que en "principal" tenes codigo y no solo un GOTO como ahora. Aunque puede llegar a tener influencias si no lo usas y no estas conciente de como funciona una interrupcion en e codigo que pasaste (ver el punto 6 para mas informacion)
2- Estas usando un delay DENTRO de la interrupcion, no deberias hacerlo, si tu circuito requiere mas tiempo de adquisicion de lo que puede darle el ADC solo, entonces o usas un delay en "principal" y luego activas el GO del ADC (dentro de principal), o usas un timer para activar el GO, ya que este ADC no permite elegir el tiempo de adquisicion.
3- Estas suponiendo que al entrar a la interrupcion es para que COMIENZE el ADC, y no es asi. Cuando entra a la interrupcion es por que se completo, FINALIZO la conversion del ADC. Por lo tanto apenas entras no activas el GO de nuevo y esperas, sino que tomas el dato, lo guardas, luego activas el GO y salis. Cuando se termine de convertir y tengas un valor va a entrar nuevamente.
Como te decia antes, si lo que vos intentas no es un muestreo continuo, es decir que apenas termine el ADC comienze de vuelta o no te dan los tiempos por que requiere un tiempo de adquisicion mayor, deberias aplicar algo de lo que dije en el punto 2. Es decir que un timer ( en su interrupcion) ponga a 1 el bit GO y salga de la interrupcion, luego entraria de nuevo cuando se complete el ADC.
4- Asi como tenes el codigo, cuando entra a la interrupcion, inicias el ADC, espera hasta que termine el ADC, limpias la bandera y salis. A partir de aca nunca mas va a entrar a esa rutina de interrupcion por que nunca se va a completar conversion del ADC, ya que nunca se inicio.
5- Esto es un error:
bsf ADCON0,2 ; Start conversion (set GO)
podrias haber usado ADCON0,GO y no hubieras tenido ese problema. El bit 2 corresponde a CHS0 que es el canal. tal ves te confundiste por empezar a contar desde 1 y no 0. El bit que buscas es el 1.
6-
En la rutina de interrupcion, tomas de ADRESL que esta en el banco 1 e intentas ponerlo en el PORTB del banco 0, lo unico que estas haciendo aca es escribir realmente TRISB y no PORTB por que no cambiaste de banco.
Esto con el problema numero 1 trae MAS problemas. Sigamos la linea de flujo del programa:
- Inicias ADC
- Entras a la interrupcion cuando se termina
- Llamas a DELAY que tiene una variable en el banco 0
- Luego Usas ADCON0, ADRESH y PIR1 del banco 0
- Cambias al banco 1 para acceder a ADRESL, aca tu error de no pasar al banco 0 para ponerlo en PORTB (numero 5 de esta lista)
- Salis de la interrupcion. Suponete que iniciaste la conversion y entre nuevamente a la interrupcion ( numero 4 de esta lista)
- Entras a la interrupcion, llamas a DELAY, pero esta ves estas en el banco 1 y no 0, por lo tanto estas escribiendo en la posicion de memoria 0xA0
- En ves de modificar ADCON0, PIR1 estarias modificando ADCON1 y PIE 1.
- Luego lo demas por el banksel se comporta de manera similar y se repite.
---------------------------------------------------
PD:
Veo que el delay es de 16 ciclos. Si te pones a pensar al momento que ejecuta la interrupcion, el micro debe tomar la direccion en 0x004, hacer el salto , ya son 2 ahi, luego tenes el guardado de contexto que te va a llevar unos 5 ciclos o 6 tal ves, van 8, luego tenes que guardar los datos de ADRESH y ADRESL con el cambio de banco incluido, tendrias 6 mas aproximadamente. eso te lleva a un totalde 14 ciclos, le pones 2 NOP y le das a GO del ADCON0, y ya tendrias tus 16 ciclos antes del inicio de la nueva conversion.