Buenas Bruno.
El problema que tienes está relacionado con el registro pc y pclath respectivamente. En el primer caso, quieres sumar al pc un valor. Todo bien excepto que el dato que vas a sumar es de 8 bits y el pc tiene 14 bits. ¿Que está ocurriendo entonces? pues que si sumas un número de 8 bits en la ALU del PIC de , que es de 8 bits, y lo guardas en el pc de 14 bits, tan sólo los 8 bits LSB son modificados en el pc, por lo que pueden ocurrir dos cosas: 1.- que la suma no tenga acarreo y el pc se carga con el valor correctamente, 2.- que la suma tenga acarreo y el pc se va a donde le da la gana. Te pongo un ejemplo:
Para el primer caso, tenemos el pc = 00F4h y le sumamos 8, nos queda pc = 00FCh todo correcto y funciona.
Para el segundo caso, tenemos el pc = 00F4h y le sumamos 16, nos queda pc = 0004h el pc salta hacia atrás en vez de a la dirección 0104h.
No se si lo has entendido. Por eso tienes que tener cuidado de no hacer saltos con el pc de esta forma, es decir, asegurarte de que no saltas más allá de lo permitido, es decir de 256 en 256 posiciones.
Tu segundo problema tiene que ver con el pclath y los saltos de página de programa. Al igual que ocurre con la alu de 8 bits, las instrucciones goto y call sólo tienen información de salto de 12 bits, es decir, que tú sólo puedes modificar los 12 bits LSB del pc con una instrucción de este tipo. para poder modificar los 2 últimos bits del pc se utiliza el registro "pclath", que contiene los 5 bits MSB del pc. Cuando el PIC detecta la instrucción goto o call, carga los 12 bits que hay en la instrucción en el pc y los 2 últimos los toma del pclath. Entonces para saltar a una zona de programa que esté por encima de los 2KBs (el 16F876 tiene 8KBs) hay que modificar previemante el contenido del pclath. Este hecho te lo advierte el compilador cuando haces saltos de página de la siguiente forma:
Codigo:
Message[306] C:AMP.ASM 253 : Crossing page boundary -- ensure page bits are set.
Fíjate cuando compiles tu programa si te aparece este tipo de mensajes.
Recuerda que para volver de una subrrutina tambien debes cargar el pclath correctamnete antes del "return"
Ya nos contarás como han ido esos programas.