Lo que encontre mal en el programa
sobre las tablas (no me fije en todo el programa) es:
el uso de la directiva ORG.
Voy a hacer un ejemplo para que veas el por que:
Tu codigo:
Org 900h
TABLASCII2
ADDWF PCL,F ; 0x900
RETLW H'30' ; 0x901
;....... mas instrucciones
RETURN ; 0x910
PRINCIPAL
BANKSEL ANSEL ; 0x911 y 0x912
CLRF ANSEL ; 0x913
Codigo Correcto:
ORG 0X00
GOTO PRINCIPAL ; 0x00
ORG 0X04
RETURN ; 0x04 , es el vector de interrupcion, por si las dudas lo activas sin darte cuenta que vuelva y asi no hace un efecto como un "reset",
PRINCIPAL
BANKSEL ANSEL ; 0x05 observa que solo se acomoda, no hace falta un ORG para el 0x05
CLRF ANSEL ; 0x06
; Aca todo lo demas del programa
; LLegamos al Final del progrma
Org 900h
TABLASCII2
ADDWF PCL,F ; 0x900
RETLW H'30' ; 0x901
La llamada a la tabla es "casi" correcta si se cumple lo anterior, le faltaria un checkeo de limite, es decir que se fije correctamente que no pase del maximo indice, si nuestra tabla tiene 10 entradas, entonces no puede tener el valor 11 o mas RES2, falta segurarse de eso:
movlw h'09' ; pag 0 subpagina 6
movwf PCLATH
MOVF RES2,W
CALL TABLASCII2
----------------------------------
Dejando de lado un poco todo lo demas, tengo 3 cosas para decirte:
- Cuando tengas la necesidad de probar algo como en este caso, solo proba lo que necesitas, y no TODO un proyecto entero. Por que el problema puede estar en otro lado
- Por que tenes como 3 tablas iguales es otra cosa que me pregunto
- ¿te das cuenta que esa tabla es algo que no tiene sentido? Y te doy el ejemplo para que compares de nuevo:
Tu codigo:
movlw h'09' ; pag 0 subpagina 6
movwf PCLATH
MOVF RES2,W
; Aca comprbaria que es menor o igual a 10
CALL TABLASCII2
; Mas codigo aca
TABLASCII2
ADDWF PCL,F
RETLW H'30'
RETLW H'31' ;LETRA 1
RETLW H'32' ;LETRA 2
RETLW H'33' ;LETRA 3
RETLW H'34' ;LETRA 4
RETLW H'35' ;LETRA 5
RETLW H'36' ;LETRA 6
RETLW H'37' ;LETRA 7
RETLW H'38' ;LETRA 8
RETLW H'39' ;LETRA 9
Codigo correcto para este caso:
MOVLW 0x30
ADDWF RES2, F
; Aca compruebo que no sea mayor a 0x3A