Hola te voy a dar otra posibilidad:
Si estas ultilizando llamadas (CALL) a TABLAS( de tipo ADDWF PCL,F RETLW...)
El problema seguramente surge por el PC. Tene en cuenta, que la funcion ADDWF solo suma los 8 bits menos significativos del PCL, por lo que fijate que la tabla no cruce pasos de 256 posiciones de longitud.
Te doy un ejemplo..:
org 0x04 ;el PC aqui es 0x0004
movlw 0x01
CALL tabla
;mas codigo....
;mas codigo....
;mas codigo....
;mas codigo....
tabla addwf PCL,F ;supongamos que esta es la linea 0x0200 del PC
retlw 0x0F
reltw 0xFA
retlw 0x0A
;mas retlw...
En este caso cuando llama a la funcion tabla, el PC se carga con el valor 0x0200 pero debemos tener en cuenta, que el PC tiene un tamaño de 14 bits: la disposicion es asi:
Bit 14 = STATUS,RP1
Bit 13 = STATUS,RP0
Bit 12 = PCLATH,3
Bit 11 = PCLATH,2
Bit 10 = PCLATH,1
Bit 9 = PCLATH,0
Bit 8 = PCL,7
Bit 7 = PCL,6
Bit 6 = PCL,5
Bit 5 = PCL,4
Bit 4 = PCL,3
Bit 3 = PCL,2
Bit 2 = PCL,1
Bit 1 = PCL,0
por lo que al hacer la instruccion ADDWF PCL,F el programa va a saltar a la posicion 0x0002 en lugar de ir a "retlw 0xFA( o sea la posicion 0x0202). Por lo tanto, para corregir esto debes hacer:
org 0x04 ;el PC aqui es 0x0004
movlw 0x01
CALL tabla
;mas codigo....
;mas codigo....
;mas codigo....
;mas codigo....
tabla BSF PCLATH,1 ;supongamos que esta es la linea 0x0200 del ADDWF PCL,F ;al poner en 1 el bit 1 del PCLATH PC= 0x0200
addwf PCL,F
retlw 0x0F
reltw 0xFA
retlw 0x0A
;mas retlw...
aqui el programa si saltara a la posicion correcta. Espero que me haya entendido...Sino en la pagina 30 del datasheet del 16F877 vas a encontrar que dice refeer to "Aplicattion Notes 556". Bajate esa Aplication note y ahi te explica los saltos del PCL.
Saludos y cualquier cosa pregunte.
