Autor Tema: Problemas de desbordamiento  (Leído 1871 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado zeppe9

  • PIC10
  • *
  • Mensajes: 2
Problemas de desbordamiento
« en: 01 de Mayo de 2015, 17:42:59 »
Hola,
soy un poco novatillo en esto de programar pic, bueno la cosa es que estoy realizando un programa en e cual tengo una tabla con textos, a la cual acude e programa principal para mostrar dichos mensajes. El problema viene que llevo introducidos 15 mensajes, pero en cuanto intento introducir uno mas se debe producir algún tipo de desbordamiento que todo el programa deja de funcionar como debería.
He intentado solucionarlo de forma un poco chapucera creando una nueva tabla y una nueva rutina para mostrar los mensajes en la pantalla pero no funciona.
A continuacion os dejo parte del codigo y a ver si me podéis ayudar, muchas gracias!!
Código: [Seleccionar]
;**************************************************************************************
;Tabla_Mensajes: Según el valor contenido en el registro W, se devuelve el carácter a visualizar

Tabla_Mensajes movwf PCL ;Calcula el desplazamiento sobre la tabla

;La directiva dt genera tantas instrucciones RETLW como bytes o caracteres contenga                                                               


Mens_1          equ     $ ;Inicio del 1er. carácter del mensaje 1
                dt "Seleccionar ",0x00
Mens_1_1          equ     $ ;Inicio del 1er. carácter del mensaje 2
                dt "sentido de giro",0x00
Mens_2          equ     $ ;Inicio del 1er. carácter del mensaje 3
                dt "(",0x2B,")Horario",0x00
Mens_3          equ     $ ;Inicio del 1er. carácter del mensaje 4
                dt "(",0xF2,")Antihorario",0x00
Mens_4          equ     $ ;Inicio del 1er. carácter del mensaje 1
                dt "Horario",0x00
Mens_5          equ     $ ;Inicio del 1er. carácter del mensaje 1
                dt "Antihorario",0x00
Mens_6          equ     $ ;Inicio del 1er. carácter del mensaje 1
                dt "Tension(%):",0x00
Mens_6_1         equ     $ ;Inicio del 1er. carácter del mensaje 1
                dt "tiempo de arranque",0x00
Mens_7          equ     $ ;Inicio del 1er. carácter del mensaje 1
                dt "(",0xF2,") Corregir",0x00
Mens_8          equ     $ ;Inicio del 1er. carácter del mensaje 1
                dt "Tiempo(s):",0x00
Mens_9          equ     $ ;Inicio del 1er. carácter del mensaje 1
                dt "Tecla invalida",0x00
Mens_10          equ     $ ;Inicio del 1er. carácter del mensaje 1
                dt "3dig MAX",0x00
Mens_11          equ     $ ;Inicio del 1er. carácter del mensaje 1
                dt "1dig MIN",0x00
Mens_12          equ     $ ;Inicio del 1er. carácter del mensaje 1
                dt "tension inicial",0x00
;Mens_13          equ     $ ;Inicio del 1er. carácter del mensaje 13
               ; dt "F!! ",0x00

include "teclado.INC" ;Incluye rutinas de manejo del teclado
include "lcd4bitsPIC16.inc" ;Incluir rutinas de manejo del LCD
include "MSE_Delay.inc" ;Incluir rutinas de temporización


;*********************************************************************************************
;Mensaje: Esta rutina envía a la pantalla LCD una cadena de caracteres. El inicio de dicha
;cadena debe estar indicado en el reg. W. Toda cadena debe finalizar con el código 0x00

Mensaje movwf Temporal_1 ;Salva el índice que apunta a la tabla de caracteres
Mensaje_1 movf Temporal_1,W ;Recupera el índice
call Tabla_Mensajes ;Busca el carácter a visualizar
movwf Temporal_2 ;Salva el carácter a visualizar
movf Temporal_2,F
btfss STATUS,Z ;Mira si es el último (0x00)
goto Mensaje_2 ;No
bcf PCLATH,0
return ;Si
Mensaje_2 call LCD_DATO ;Visualiza el carácter sobre el LCD
incf Temporal_1,F ;Incrementa el índice para buscar el siguiente carácter
goto Mensaje_1


;******************************************************************************
esta seria la tabla y la rutia que lo carga en la pantalla
y a continuación os muestro un ejemplo de como se llama a estas
Código: [Seleccionar]
movlw b'00000001'
call    LCD_REG ;Borra el LCD e inicia el cursor
                movlw   Mens_1         
                call    Mensaje        ;Visualiza "Seleccione sentido de giro"

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problemas de desbordamiento
« Respuesta #1 en: 02 de Mayo de 2015, 01:12:28 »
El tema es que estas limitado al rango de 8 bits con eso, es decir 256 caracteres SI es que tu tabla comienza en una direccion con el PCL en 0. Si comienza en 100 por ejemplo tendrias solo 155 lugares a direccionar.

Tus mensajes hasta el Mensaje12 ocupan 180 caracteres.
Imagino que se puede llegar a hacer un codigo que verifique el PCL cuando supera los 255 y asi aumentar el PCLATH, lo podes solucionar con un ORG 0x200 por ejemplo asi lo tenes en un comienzo de tu PCL

Para que se entienda:

Código: [Seleccionar]
movlw   Mens_1         
call    Mensaje        ;Visualiza "Seleccione sentido de giro"

Ahi moves tus 8 bits de menos peso a W, solo los 8 bits

Tal ves cambiando esto:

Código: [Seleccionar]
Mensaje_2 call LCD_DATO ;Visualiza el carácter sobre el LCD
incf Temporal_1,F ;Incrementa el índice para buscar el siguiente carácter
                                btfsc  STATUS,Z
                                incf    PCLATH,F
goto Mensaje_1

Podria solucionarlo, aunque hay un BCF PCLATH,0 en Mensaje_1 que deberia ser eliminado. O crear otro registro que pueda almacenar momentaneamente los datos de ambos PCLATH ( actual y el de mensaje , o tal ves con 1 solo basta)
Lo que intento hacer es que si por esa casualidad tu apuntador que es Mensaje_1 produzca un overflow de 0xFF a 0x00 , incremente PCLATH.
Esto te va a permtir manejar hasta 10 bits con el MOVWF PCL,F (aunque no es estoy seguro de si esta instruccion puede hacerlo, normlamente un ADDWF si funciona) , ya que GOTO y CALL solo usan los bits 3:4 ( Al menos el micro que yo vi ) no se que micro estas usando.

Desconectado zeppe9

  • PIC10
  • *
  • Mensajes: 2
Re: Problemas de desbordamiento
« Respuesta #2 en: 02 de Mayo de 2015, 13:37:18 »
El tema es que estas limitado al rango de 8 bits con eso, es decir 256 caracteres SI es que tu tabla comienza en una direccion con el PCL en 0. Si comienza en 100 por ejemplo tendrias solo 155 lugares a direccionar.

Tus mensajes hasta el Mensaje12 ocupan 180 caracteres.
Imagino que se puede llegar a hacer un codigo que verifique el PCL cuando supera los 255 y asi aumentar el PCLATH, lo podes solucionar con un ORG 0x200 por ejemplo asi lo tenes en un comienzo de tu PCL

Para que se entienda:

Código: [Seleccionar]
movlw   Mens_1         
call    Mensaje        ;Visualiza "Seleccione sentido de giro"

Ahi moves tus 8 bits de menos peso a W, solo los 8 bits

Tal ves cambiando esto:

Código: [Seleccionar]
Mensaje_2 call LCD_DATO ;Visualiza el carácter sobre el LCD
incf Temporal_1,F ;Incrementa el índice para buscar el siguiente carácter
                                btfsc  STATUS,Z
                                incf    PCLATH,F
goto Mensaje_1

Podria solucionarlo, aunque hay un BCF PCLATH,0 en Mensaje_1 que deberia ser eliminado. O crear otro registro que pueda almacenar momentaneamente los datos de ambos PCLATH ( actual y el de mensaje , o tal ves con 1 solo basta)
Lo que intento hacer es que si por esa casualidad tu apuntador que es Mensaje_1 produzca un overflow de 0xFF a 0x00 , incremente PCLATH.
Esto te va a permtir manejar hasta 10 bits con el MOVWF PCL,F (aunque no es estoy seguro de si esta instruccion puede hacerlo, normlamente un ADDWF si funciona) , ya que GOTO y CALL solo usan los bits 3:4 ( Al menos el micro que yo vi ) no se que micro estas usando.
Muchas gracias, voy a probar ahora tu solución a ver que tal ya te comento, el BCF PCLATH, 0 no deberia estar ahi, se me a colado, es de unas pruebas que hice ya incrementando y decrementando el PCLATH, se me pasaria borrarle. El pic que estoy utilizando es un 16F887

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re: Problemas de desbordamiento
« Respuesta #3 en: 02 de Mayo de 2015, 14:25:07 »
Me olvide poner en el codigo o decirte, que cuando comienza el envio de los datos, deberia poner el PCLATH a donde esta la tabla.