Hola Todos,
Estoy muy extrañado con el resultado de mi codigo, ya verán por que... La sección de código con problemas debería imprimir en una pantalla LCD los caracteres de una tabla -mediante un barrido- pero se queda en un lazo infinito debido a que la instruccion <subwf Var1,W> modifica el valor de Var1, provocando resultados indeseados: el contador nunca alcanza el valor necesario para escapar del loop.
Este es el código:
[color=blue]LCD_EscTabla ;como parametro de entrada se tiene el offset que queremos en "W"
clrf ContCaracter ;primer caracter
LCD_OtroChar
movf LCD_Offset,w ;el offset es cargado en W
call LCD_Tabla ;va a la tabla y devuelve en W el caracter de acuerdo al offset
call LCD_Caracter ;Imprime el caracter
;aqui la cosa se puso rara, asi que imprimi el valor ASCII del contador para ver su comportamiento
movlw D'48'
addwf ContCaracter,w ;W=ASCII(ContCaracter) recuerden que ContCaracter es un numero entre 0 y 7
call LCD_Caracter ;visualicé 0, valor inicial del contador: OK
incf ContCaracter,f ;incremento el contador
;vuelvo a imprimir el valor ASCII del contador para ver su comportamiento
movlw D'48'
addwf ContCaracter,w ;W=ASCII(ContCaracter) recuerden que ContCaracter es un numero entre 0 y 7
call LCD_Caracter ;visualicé 1, valor inicial del contador + 1: hasta ahora todo bien...
movlw D'8' ;cantidad de caracteres
subwf ContCaracter,w ;resto el contador con el maximo de caracteres, con el fin de evaluar el bit Z (cero) y saber si ya terminé de imprimir 8 caracteres
;vuelvo a imprimir el valor ASCII del contador para ver su comportamiento
movlw D'48'
addwf ContCaracter,w ;W=ASCII(ContCaracter) recuerden que ContCaracter es un numero entre 0 y 7
call LCD_Caracter ;visualicé 0, y hasta ahora no me la creo!!! el contador debería seguir siendo 1, pero fue modificado!!!
btfss STATUS,Z ;comparo el contador con 8
goto LCD_OtroChar ; si contador es 8, entonces sale del lazo. Esto nunca sucede porque aqui ContCaracter siempre es cero, a pesar de que en las simulaciones con MPLAB SIM, el programa funciona correctamente.
return
;Si el primer caracter es "J" en el LCD se visualiza:
; J010J010J010J010
; J010J010J010J010
;El 1er "0" es el valor inicial del contador, el 1 es el valor inicial del contador luego de un incremento, y el 2do "0" es el valor del contador antes de ser comparado. El programa se queda en un lazo infinito[/color]
Ojalá puedan ayudarme a resolver este misterio...
Muchas Gracias,
Carlos.