Holas renzo!!
Creo saber lo que le pasa a tu programa. A mi me pasó algo parecido hace tiempo, cuando estaba haciendo un programa para el pic16f648a (estaba migrando del 16f84). Despues de mucho batallar, aprendí a palos lo que es la "paginación de memoria de programa", algo necesario en esta gama de los pic para ocupar toda la memoria de programa.
En palabras simples son cosas de números:
- Cada posición de la memoria de programa tiene un ancho de palabra de 14 bits, entre los cuales se reparte el opcode de la instrucción y el operando, ya sea un literal, posición de ram ó posición de memoria de programa.
- En el caso de las instrucciones de salto (call y goto), los 14 bits de reparten en 3 bits de opcode y 11 bits de dirección.
- El contador de programa tiene un ancho de palabra de 13 bits (repartidos en los registros PCL y PCLATH).
Aqui notamos una incongruencia. El contador de programa es de 13 bits (para direccionar 8KB), pero en las instrucciones de salto la dirección es de 11 bits, con los cuales solo puedo direccionar 2KB...!!!
Asi que, cuando nuestro programa alcance tal complejidad que requiera más de 2KB, hay que entra a estudiar a fondo el datasheet del pic en cuestión, ya que están muy bien documentados, y encontramos el concepto de "paginación de memoria", donde lo que se hace es dividir la memoria de programa en páginas, para el caso de pic16f877 son 4 páginas de 2KB cada una. Para acceder a una página en particular, hay que cargar directamente en la parte alta del contador de programa los 2 bits que faltan para completar la dirección de destino (PCLATH).
Por ejemplo, tenemos una subrutina llamada "envia_trama" ubicada en la página 2, y nos encontramos en la página 0 en este momento. Entonces para llamar a la subrutina procedemos así:
movlw b'00010000' ; aqui se manipulan los bits 3 y 4 para cambiar de página
movwf PCLATH
call envia_trama
Al momento de retornar desde la subrutina, volverá de nuevo a la página 0, ya que la pila tiene un ancho de palabra igual al contador de programa (13 bits).
Pero surge la pregunta...... Como controlo que tal subrutina esté en la página que yo quiero?? simple, jugando con la directiva ORG del ensamblador.
Bueno, por el momento puedo aportar esto, espero te sirva de algo...
Suerte con y proyecto, y saludos a quienes nos leen.