Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

30/03/2014 #1

Avatar de juanma2468

Problema con salto a tabla
Hola que tal, estoy programando el micro MC9S08JM60 de freescale en el programa CodeWarrior V 6.3. Estoy teniendo un problema en una parte de una pequeña rutina que está en asembler, está escrita en asembler por una cuestión de optimización y rapidez. Lo que debe hacer la rutina es tomar un valor de una variable llamada CONTADOR y con ese valor ingresar a una tabla donde debe buscar un valor, la variable contador varia entre 0 y 5, el tema es que cuando llega a la instrucción en que debe saltar a buscar en la tabla, me tira un error de que estoy buscando en una posicón de memoria que no está inicializada, y la posición que me da como error no es la posición en donde se encuentra la tabla, pero revizando los valores en memoria en hexa todo esta bien. Dejo algunas imagenes para que vean y me digan si ven algo extraño o si detectan algo fuera de lugar, gracias y saludos.
CODIGO
Código:
export symbols
            XDEF asm_main

            ; Include derivative-specific definitions
            INCLUDE 'derivative.inc'

; variable/data section
Mi_pagina_cero: SECTION  SHORT
CONTADOR:  DS.B   1
;Sección de código
MiCodigo:     SECTION
            
asm_main:   LDX CONTADOR
            LDA TABLA,X
            STA PTBD
            
            RTS                     ; return to caller

TablaValores: SECTION
            
TABLA:          DCB.B 1, $01 ;0 El valor es en hexadecimal
                    DCB.B 1, $44 ;1
                    DCB.B 1, $30 ;2
                    DCB.B 1, $21 ;3
                    DCB.B 1, $10 ;4
                    DCB.B 1, $07 ;5
31/03/2014 #2


hola deberias enmascarar la variable con la que vas a hacer el salto, es decir si tu tabla de datos llega hasta 0x0F aplicale una operacion AND con este mismo valor, para que no tengas saltos descontrolados. saludos
31/03/2014 #3

Avatar de juanma2468

He trabajado con tablas anteriormente, pero con PICs y nunca tube que hacer lo que mencionas.
La tabla arranca justo donde termina el programa, el programa termina en la direccion 1A9D y la tabla arranca en la direccion 1A9E, pero cuando tiene que saltar a la dirección 1A9E, salta el error de que la direccion 3A9E no esta inicializada, pero no es la indicada.
Podes decirme como hacer eso que me indicas lo de unmascarar la variable?? Desde ya gracias.
31/03/2014 #4


hola la verdad no conozco el set de instrucciones de tu micro, pero si estas haciendo un salto indexado, lo puedes hacer agregando el valor de tu variable previamente enmascarada al contador de programa, es decri si tu tabla solo tiene 9 datos , al valor de tu variable le aplicas una and logica con el valor 15 en decimal por ejemplo, y asi solo puedes recoger 15 datos de la tabla sin importar que sea mas grande, ahora como tu solo ocupas los primeros 9 lugares de la tabla los restantes 9 los puedes llenar con 0s o 1s y asi evitas que el contador de programa salte a direcciones inesperadas

espero haberme explicado bien saludos
31/03/2014 #5

Avatar de juanma2468

OK, entendi, pero eso no resuelve mi problema, porque en realidad la variable que utilizo para hacer el salto indexado esta en cero, en ningun momento la incremento, ademas la tabla que puse fue para hacer un ejemplo, mi tabla real va a tener 255 valores, por lo que no voy a poder enmascarar nada ya que requiero que mi variable de indexado pueda llegar a 0xFF. Pero bueno eso no importa, el tema es que yo puedo controlar y ver el valor de mi variable CONTADOR, la misma se encuentra en cero y en ningun momento se modifica su valor, por lo que no entiendo porque no salta al lugar que se le indica.
01/04/2014 #6


bueno nunca he usado esos micros asi que no tengo idea de su funcionamento, (aunque en teria deberia ser igual a otras marcas de la misma arquitectura), pero le eche un vistazo rapido al datasheet y creo que el problema radica en que los registros de la CPU del micro son de 16 bits y tu estas tratando de saltar las tabals con solo 8 bits, entonces creo que ese puede ser el problema ya que no sabes el contenido de los otros bits restantes. checa que en la imagen que el PC y el index register son de 16 bits y entonces te faltaria ingresar el "index register high"
Imágenes Adjuntas
Tipo de Archivo: jpg 001.JPG (39,8 KB (Kilobytes), 2 visitas)
01/04/2014 #7

Avatar de juanma2468

Me ganaste de mano, ya lo solucione, si el problema era el registro X que es de 16 bits, este a su ves se divide en el H que es la parte alta y en el X que es la parte baja. Cuando yo hacia LDX COANTADOR, me cargaba el valor del contador en la parte baja del registro de indexado, pero la parte alta, o sea, el H no se modificaba y que daba con un valor que no era cero, luego la instruccion LDA TABLA,X toma la variable X de 16 bits, y la parte alta del registro hacia que saltara a cualquier lado, ya lo solucione, simplemente agregue la intruccion CLRH al comienzo, por lo que ahora la parte alta del registro de indexado no me hincha mas. Gracias igual por la ayuda, saludos.
01/04/2014 #8


con gusto compañero y que bueno que sigas adelante con tu codigo, un saludo y hasta luego
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.