call tabla pcl desbordado y no retorno de tabla

hola me paso algo curioso haciendo un programa que si no fuera por el file registers del mplab sim posiblemente no lo hubiera encontrado ,alguna vez me parecio leer que las tablas y rutinas de salto se deben poner al principio ,pues me paso lo siguiente el pcl andava por la cuenta 253 hice un salto a una tabla y lo posiciono al pcl en 3 y a la hora de devolverme el resultado con retlw resulta que se metia en otra rutina que continuava en la posicion 4 en vez de volver donde se quedo despues de saltar a ala tabla
cuando cambie la tabla a las primeras posiciones del programa todo funciono bien

mi pregunta es cuando en un programa haces un salto y desbordas el pcl y vuelve a contar desde cero que significa que ha cambiado de banco o que todo el programa lo mueve contando de 0 a 255 ??

porque si el programa en si cada vez que pasa de una instruccion a otra el programa abarca mas de 255 cuentas entonces el pcl que va cada vez de 0 a 255 y asi sucesivamente??
me pueden explicar un poco ?
gracias
un saludo
 
Una vez que desbordas el PCL, todo el PIC se pierde ya que no sabes en que instruccion caera... asi que lo que yo hago es poner las tablas de busqueda HASTA EL FINAL, asi tengo un poco de mas control y con un poco de suerte el PIC se reinicia solo

La unica manera de recuperarlo es usar el WDT, o buscar el error que hace que el PIC salte a donde no debe...
 
Así es... lo que sucede esque al momento de que el PCL se desborda pasa a 0, pero no necesariamente regresa al inicio del programa si no a donde en conjunto PCL y PCLATH apuntan.

Un método para olvidarse de todo este rollo es crear las tablas en la memoria FLASH del programa (y si el PIC lo permite) acceder a ella mediante los registros EECON1 y EEADR

Aquí un ejemplo:

Carga_buffer

movf Puntero_men2,W
bcf STATUS,IRP ;Selecciona direccionamiento indirecto

en bancos 0 y 1 de RAM

bcf STATUS,RP0
bsf STATUS,RP1 ;Acceso a banco 2 de RAM
movwf EEADRH^0x100 ;Carga dirección superior
bcf STATUS,RP1 ;Acceso a banco 0 de RAM
movf Puntero_men1,W
bsf STATUS,RP1 ;Acceso a banco 2 de RAM
movwf EEADR^0x100 ;Carga dirección inferior
bcf STATUS,RP1 ;Acceso a banco 0 de RAM
movlw .16
movwf Contador_car ;Numero de caracteres por transferir

Carga_buffer_bucle ;Lee el caracter de la memoria

bsf STATUS,RP1
bsf STATUS,RP0 ;Acceso a banco 3 de RAM
bsf EECON1^0x180,EEPGD ;Selecciona operaciónes en memoria de
bsf EECON1^0x180,RD ;Realiza operación de lectura
nop
nop ;2Ciclos de espera
bcf STATUS,RP0 ;Acceso a banco 2 de RAM
movf EEDATA^0x100,W
bcf STATUS,RP1 ;Acceso a banco 0 de RAM
movwf INDF ;Almacena el byte leido en el buffer
incf FSR,F ;Actualiza el puntero del buffer
bsf STATUS,RP1 ;Acceso a banco 2 de RAM
incf EEADR^0x100,F ;Actualiza puntero de dirección
bcf STATUS,RP1 ;Acceso a banco 0 de RAM
decfsz Contador_car,F ;¿Bucle de envio de datos
goto Carga_buffer_bucle ;Aún no, sigue guardando datos
return ;Retorno de la subrutina

Este programa lee 16 bytes contiguos que están en donde apuntan los registros Puntero_men1(H) y Puntero_men2(L) y los transfiere a un buffer en RAM.
Creo que está suficientemente comentado el programa como se efectúa paso a paso la transferencia. Saludos
(Les dejo el programa en un archivo de texto donde viene mejor tabulado y más entedible)
 

Adjuntos

  • rutina.txt
    1.4 KB · Visitas: 32
Última edición:
gracias a los dos por contestar,sabes que pasa que despues de ver ese funcionamiento que me dejo cao,no se si puede volver a pasar de algun otro modo por ejemplo en salto a subrrutinas o en algun salto a ficheros .inc/macros o solo pasa cuando saltas a tablas ,porque claro ahora porque tenia el file registers y me di cuenta pero si tienes un programa extenso simularlo ,no me termina de agradar y para encontrar un fallo de ese tipo buf.... puede ser un caos ,alguna forma de evitarlos ??? lo unico que se me ocurre es o poner como dije las tablas al principio o al hacer el programa y ver las instrucciones para que no coincida un salto con el desborde del pcl,
un saludo;
 
gracias a los dos por contestar,sabes que pasa que despues de ver ese funcionamiento que me dejo cao,no se si puede volver a pasar de algun otro modo por ejemplo en salto a subrrutinas o en algun salto a ficheros .inc/macros o solo pasa cuando saltas a tablas ,porque claro ahora porque tenia el file registers y me di cuenta pero si tienes un programa extenso simularlo ,no me termina de agradar y para encontrar un fallo de ese tipo buf.... puede ser un caos ,alguna forma de evitarlos ??? lo unico que se me ocurre es o poner como dije las tablas al principio o al hacer el programa y ver las instrucciones para que no coincida un salto con el desborde del pcl,
un saludo;

Estás usando un 16F supongo.:unsure:
 
hola que tal
si asi es
que lo dices porque los pics de gama mas alta el pcl tiene mas capacidad de registro ?
un saludo
 
Última edición:
Es engorroso ese problema... (creo que el más de la familia 16F), no tengo mucha experiencia en los 18F pero creo que con estos no pasa eso ya que la memoria de programa no está dividida en páginas ni nada de eso. Yo le encontré solución por el método que uso, así no importa en que sección del programa está la tabla de datos, el inconveniente es que no todos los PIC's permiten la lectura en su propia memoria FLASH.

Con respecto a lo de usar macros, es una buena idea pero no se está excento e que ocurra un problema de ese tipo, ya que estos están en función de la posición de la tabla. Yo dejé de usar ese método desde que me me ocurrían esos "bugs" de hardware y me case con el otro método
 
Atrás
Arriba