Valla que si me a tocado leer a raudales, hasta el punto de dormirme al frente de este monitor con un PDF abierto
..llevo más de 5 horas analizando el código y no encuentro explicación alguna, dentro de lo que conozco a mi problema.
Seguí tu consejo BrunoF, de poner el programa por bloques en la memoria flash, por ejemplo las siguientes rutinas:
;****************leer memoria 24LC256 ******
ORG 0X1400
LEER_EEPROM
CLRF HADDEEPROM
CLRF LADDEEPROM
LOOP_EE
CALL CONFIG_TRANSMISION_I2C
CLRF IC2DATA
CLRF PALABRA
CALL BIT_START_I2C
MOVLW B'10100001'
CALL TRANSMITIR_DATO_I2C
CALL RECIBIR_DATO_I2C
CALL BIT_STOP_I2C
MOVF IC2DATA,W
MOVWF PALABRA
XORLW 0FFH
BTFSC STATUS,Z
GOTO BLANQUIAR_PANTALLA
MOVLW .32
SUBWF PALABRA,F
PAGESEL SIGUIENTE_FASE
CALL SIGUIENTE_FASE
MOVF PALABRA,W
XORLW .32
BTFSS STATUS,Z
GOTO LOOP_EE
CALL BIT_STOP_I2C
PAGESEL ESPACIOS_BLANCO
CALL ESPACIOS_BLANCO
GOTO LEER_EEPROM
BLANQUIAR_PANTALLA
PAGESEL ESPACIOS_BLANCO
CALL ESPACIOS_BLANCO
GOTO LEER_EEPROM
INCLUDE <I2C.INC>
;**********************************************
;EFECTOS EN BANCO 03
;***********************************************
;DESPLAZAR HACIA LA IZQUIERDA
;**********************************************
ORG 0X1800
ROTAR_IZQUIERDA
MOVLW COL31
MOVWF FSR
OTRA_ROT_IZQ
MOVF INDF,W
INCF FSR,F
MOVWF INDF
DECF FSR,F
DECF FSR,F
MOVLW COL1-1
XORWF FSR,W
BTFSS STATUS,Z
GOTO OTRA_ROT_IZQ
CLRF INDF
RETURN
;****************************************
El problema es que de esta forma no me funciona, pero si pongo estas 2 rutinas en el banco en donde están las lineas que hacen el llamado,me fuciona bien sin problemas..y no es por que le falte el PAGESEL, por que lo tengo bien:
INICIO
CLRF FLAGEE
CLRF PORTA
CLRF PORTB
CLRF PORTC
BANCO1
MOVLW 018H
MOVWF TRISC
CLRF TRISB
CLRF OPTION_REG
MOVLW 006H
MOVWF ADCON1
MOVLW 0C0H
MOVWF TRISA
BANCO0
LOOP_INICIO
MOVLW 0FFH
MOVWF PORTB
BCF LOAD
MOVLW .32
MOVWF COLUMNAS
MOVLW COL1
MOVWF FSR
CERO S_COLUMNAS ;BORRAR TODAS LAS COLUMNAS
CLRF INDF ;PARA LIMPIAR AL INICICAR
DECFSZ COLUMNAS
GOTO SEGUIR_BORRANDO
;GOTO DEMO_FASE
PAGESEL LEER_EEPROM
GOTO LEER_EEPROM ;ME VOY A EMPEZAR A LEER LA EEPROM
SEGUIR_BORRANDO
INCF FSR,1
GOTO CEROS_COLUMNAS
En esta parte no hay problema alguno, este inicio está junto con el llamado de generar caracteres, mostrar la pantalla y todos las tareas que hacen posible ver un caracter en la matrix.
En la única parte en la que tengo duda es en el llamado de una tabla de una tabla; siguiendo tu ejemplo para poder seleccionar el valor hexadecimal correcto para cada columna dependiendo del caracter; en él usas mucho el PAGESEL por que el ejemplo expone también que se puede hacer el llamado de una tabla sin importar en donde esté, y como mis tablas las tengo en el banco 0 pues le quité el PAGESEL, claro después de ver que no me funcionaba bien el código y por probar si era esto.
Mi duda es que la rutina modifica varias veces el PCLATH, pero supuestamente esto no tendría nada que ver ya que la dirección completa de donde se hace el CALL queda grabada en el Stack, y revisando no paso de usar 5 como máximo, cosa que queda comprobada al unir las rutinas en le primer banco de memoria y asi funcionar bien todo.
He revisado PDFs de Microchip, incluyendo el que trata sobre el MPASM y no veo mi error...si sirve de algo estoy usando el MPLAB 8.30.
Que me he tragado? en que parte metí la pata?
Gracias por la ayuda que me puedan dar....
Saludos
Edit: En el foro encontré este
post de Maunix, en donde explica que al volver de un CALL en otra página y si vulevs hacer otro llamado asi sea dentro de la misma página debes agregar el pagesel ya que este seguirá cargado con la página anterior.
Voy a probar a ver si es esto...No se, pero este pasamensajes ha sido la mejor experiencia hasta la fecha, nunca imagine encontrarme con tantos obstáculos que me enseñaran y me hicieran ver cosas que nunca imagine que existieran