Diferencias entre tablas y indexados

Hola:

Programando en asm con los PIC16Fxxx. ¿Qué diferencia hay a la hora de programar tablas y indexados?

Para mi me parecen lo mismo, según leo en Internet, no lo es, pero no explica diferencias o al menos no lo he encontrado o entendido.

La diferencia que he podido entender hasta el momento es este, tabla sirve para hacer comportamiento de autómatas, dependiendo los sensores de la entrada, en su salida activa motores. Indexado es más bien para controlar display de 7 segmentos sin contar con puertos de entradas acordes a sus salidas, estas funcionan los Led a base de memorias. por ejemplo, el conteo del 1 al 9 y al revés. ojo, es lo que creo pero no estoy seguro.

Un saludo.
 
A mi parecer son dos cosas distintas: Tabla se llama a la forma en que están ACOMODADOS los datos mientras que INDEXADO es la manera de acceder a ellos.
Tampoco me convence la explicación que encontraste en internet, al final del cuentas, el dato leído de un grupo de sensores podría considerase como un offset para acceder a una determinada dirección.
Esperemos que comentan los demás compañeros
 
A mi parecer son dos cosas distintas: Tabla se llama a la forma en que están ACOMODADOS los datos mientras que INDEXADO es la manera de acceder a ellos.
Tampoco me convence la explicación que encontraste en internet, al final del cuentas, el dato leído de un grupo de sensores podría considerase como un offset para acceder a una determinada dirección.
Esperemos que comentan los demás compañeros

Eso de que están acomodados tampoco me convence mucho.
 
Si te referis a la directiva DT con tablas... la diferencia esta en que es necesario hacer un llamado con call para las tablas ya que estas te devuelven el valor, ya que cada valor es devuelto con una instrucción retlw (que es parecido a return) que tiene internamente cada caracter o valor dentro de tu tabla, en otras palabras estas ocupando un espacio en la pila con las tablas y con el salto indexado no, aunque con las tablas la cosa es mas sencilla y rapida y te devuelve el valor en el registro W justo después de la instrucción call con la que llamaste la tabla

el llamado seria de esta forma:

Código:
[COLOR="blue"]movlw[/COLOR]    "Numero de direccion que quieras acceder en la tabla"
[COLOR="Blue"]call[/COLOR]     Tabla

[COLOR="Magenta"]Tabla[/COLOR]
[COLOR="Blue"]addwf[/COLOR]    PCL,F
[COLOR="Blue"]DT[/COLOR] 0x01,0x02,0x0A,0x07

pero supongo que ya lo sabes,viéndolo de forma interna estaría ordenado asi:

Código:
[COLOR="blue"]movlw[/COLOR]    "Numero de direccion que quieras acceder en la tabla"
[COLOR="Blue"]call[/COLOR]     Tabla

[COLOR="Magenta"]Tabla[/COLOR]
[COLOR="Blue"]addwf[/COLOR]    PCL,F
[COLOR="Blue"]retlw    [/COLOR]0x01
[COLOR="blue"]retlw    [/COLOR]0x02
[COLOR="blue"]retlw    [/COLOR]0x0A
[COLOR="blue"]retlw    [/COLOR]0x07

Las tablas y la indexacion tienen el mismo objetivo, acceder a un dato de un conjunto de datos ordenados para utilizarlo luego, solo que en la indexacion no es posible volver al lugar de donde se lo llama (a menos que lo hagas manualmente con un goto), por lo tanto no ocupa espacio en la pila, los dos tienen sus pros y sus contras

PROS
Tabla: Sencillo y devuelve valor en la posición después de la llamada
Indexado: No ocupa espacio en la pila
CONTRAS
Tabla: Ocupa espacio en la pila
Indexado: No devuelve valor después de la posición de llamada,a menos que lo hagas manualmente

espero haberte ayudado, sino pues no se cual es tu duda jaja

saludos
 
Última edición:
Se puede tomar los datos de la tabla aumentados la posición de memoria, por ejemplo:

Código:
Tabla
addwf    PCL,F
retlw    0x01
retlw    0x02
retlw    0x0A
retlw    0x07
Mando esos 4 datos, pero luego quiero mandar con el orden.
Código:
retlw    0x02
retlw    0x0A
retlw    0x07
retlw    0x01
Luego
Código:
retlw    0x0A
retlw    0x07
retlw    0x01
retlw    0x02
Sin modificar la tabla. ¿Cómo lo podría hacer?
 
Última edición por un moderador:
Hola @gusfavio:

Me has ayudado.

Buenas @drxg:

No se si eso se puede hacer. Lo mismo puedes probar con los DT "Hola mundo", 0x00.
A lo mejor se hace controlando cuantos PCL,F quieres avanzar o retrocredes como si fuera un array.


Muchas gracias a tod@s.
 
Meta.
¿Cómo hago para usar una única tabla como lo que mencioné y hacer que una palabra se muestre letra por letra?

Ejemplo:

N° de mensaje|Display1|display2|displa3|display4
1|H|O|L|A
2|O|L|A|H
3|L|A|H|O
Etc.
 
Última edición por un moderador:
Hola:

No lo he hecho y no se si se puede hacer. Prueba moviendo la posición del GPR (Registro de Propósito General), para entendernos, es la RAM del PIC. Selecciona la posición exacta de la letra y luego almacena en una variable temportal el dato.

Puedes ver la posición hecha en el MPLAB cuando hayas compilado para que te has una idea. En este caso como es Hola son 4 posiciones diferente donde se almacena los datos de 8 bits cada una. no olvides crear las 4 variables.

Tabla datos temporales para almacenar, debe estar vacío en el principio, se lee la tabla y queda así.
Variables|Datos
Variable_1|H
Variable_2|O
Varieble_3|L
Variable_4|A
Si quieres mover la tabla, en realidad una tabla definida a código no podrás hacerlo, exceptuando que modifiques su firmware así mismo, cosa que no es este caso. Ahora con la variable temporal, con la sinstrucciones adecuadas simplemente le das ódenes programándolo cambiar variable por variable. Debes tener otras 4 variables auxiliares, que primero hagan una copia para luego cambiar sus datos.

Por ejemplo:
Var auxiliar|Datos
Var_aux_1|O
Var_aux_2|L
Var_aux_3|A
Var_aux_4|H

Lo que debes hacer con las instrucciones es coger el valor de la tabla directamente del código escrito y almacenarla en las variables principales, luego a base de código asm, cambiar el valor de la Variable_1 = H por la otra variable Var_aux_1 = O, así una a una. Al final en las variables principales queda OLAH.

También tienes la posibilidad empezar desde el principio escoger la dirección (Adress) los datos de la tabla.

variable.gif

Te he dado idea de como hacerlo, espero que vengan más personas y lo haga mejor.

Mucha suerte y espero que lo intentes a ver que pasa. ;)
 
Hola de nuevo, encontré algún ejemplo parecido. Lo que se conoce como direccionamiento indirecto.

Código:
; Rellenar una zona de RAM con los datos de una tabla grabada en la memoria de programa.
; Se supone que la tabla nunca excederá el tamaño de la RAM libre.
; Este programa se comprueba mediante el simulador MPLAB.
;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

    CBLOCK    0x0C
    RAM_Contador
    ApuntaTabla
    RAM_PrimeraLibre
    ENDC

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0
Inicio
    movlw    TablaFinal-TablaInicio     ; Número de posiciones a escribir.
    movwf    RAM_Contador
    movlw    RAM_PrimeraLibre
    movwf    FSR                        ; Primera dirección de memoria RAM a escribir
    clrf    ApuntaTabla                ; Primera posición de la tabla a leer.
RAM_Escribe
    movf    ApuntaTabla,W
    call    Tabla                    ; Obtiene el dato de la tabla.
    movwf    INDF                    ; Escribe en la RAM.
    incf    FSR,F                    ; Apunta a la siguiente dirección de memoria.
    incf    ApuntaTabla,F            ; Apunta al siguiente valor de la tabla.
    decfsz    RAM_Contador,F            ; Comprueba que ha terminado de escribir todos
    goto    RAM_Escribe                ; los valores de la tabla.
Principal
    sleep
    goto    Principal

Tabla
    addwf    PCL,F
TablaInicio
    DT .1,.2,.3,.5,.7,.11,.13        ; Por ejemplo, la tabla de primeros números primos.
TablaFinal

    END

Un saludo.
 
hey meta tenes alguna documentacion que explique esto del registro INDF y el FSR de la ram?? con algun grafico si tenes? desde donde hasta donde ocupa ram el INDF? se que el FSR funciona como cursor, y que el INDF funciona para guardar datos temporales
 
Última edición:
Hola:

Abajo está ejemplos de como funcionan en gráfico y la explicación. Amplía el zoom e la imagen.

Ver información.

Más códigos de ejemplo.
Código:
; Este programa comprueba el funcionamiento del direccionamiento indirecto. Se trata de
; escribir con el valor de una constante a partir de la última dirección ocupada de
; la memoria RAM de datos hasta el final.
; Su correcto funcionamiento debe comprobarse con el simulador del MPLAB.
;
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

    CBLOCK    0x0C
    RAM_Contador
    ENDC

CONSTANTE        EQU    2Ah                ; Por ejemplo.
RAM_ULTIMA_DIR    EQU    4Fh                ; Ultima dirección de RAM de datos utilizada para
                                    ; el PIC16F84A.
; ZONA DE CÓDIGOS ********************************************************************

    ORG     0
Inicio
    movlw    RAM_ULTIMA_DIR-RAM_Contador    ; Número de posiciones a escribir.
    movwf    RAM_Contador
    movlw    RAM_Contador+1            ; Primera posición de RAM libre.
    movwf    FSR                        ; Primera dirección de memoria RAM a escribir.
RAM_EscribeConstante
    movlw    CONSTANTE                ; Escribe el valor de la constante en la
    movwf    INDF                    ; posición apuntada por FSR. (W) -> ((FSR))
    incf    FSR,F                    ; Apunta a la siguiente dirección de memoria.
    decfsz    RAM_Contador,F
    goto    RAM_EscribeConstante
Principal
    sleep                            ; Pasa a reposo.

    END


Otro ejemplo más.
Código:
; Este programa comprueba el funcionamiento de la lectura y escritura en la memoria de 
; datos mediante direccionamiento indirecto.
;
; Se trata de escribir, a partir de la última dirección ocupada de memoria RAM de datos
; hasta el final, el contenido con el valor de la dirección. Así, por ejemplo, en la
; dirección 20h se escribe "20", en la dirección 21h se escribe "21", en la dirección 22h
; se escribe "22" y así sucesivamente. Se escribirá hasta la dirección 4Fh que son las
; direcciones implementadas en PIC16F84A.
;
; A continuación se procederá a la lectura de la memoria RAM de datos completa, desde la
; la dirección 00h hasta la 4Fh. En la pantalla se visualizará la dirección y su
; contenido. Observar que direcciones de 00h a 0Bh corresponden al SFR. Cada
; visualización se mantendrá durante medio segundo en pantalla.
;
; En los contadores se carga siempre un valor más, porque la instrucción
; "decfsz RAM_Contador,F" salta cuando es cero y no permite visualizar el contenido del
; último registro.
 
; ZONA DE DATOS **********************************************************************

    LIST        P=16F84A
    INCLUDE        <P16F84A.INC>
    __CONFIG    _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC

    CBLOCK    0x0C
    RAM_Dato                        ; Dato a escribir o leer.
    RAM_Contador
    ENDC

RAM_ULTIMA_DIR    EQU    4Fh                ; Ultima dirección utilizada.

; ZONA DE CÓDIGOS ********************************************************************

    ORG     0
Inicio
    call    LCD_Inicializa
    movlw    RAM_PrimeraLibre        ; Este es la primer dato a escribir en la RAM.
    movwf    RAM_Dato
    movlw    RAM_ULTIMA_DIR-RAM_PrimeraLibre+1 ; Número de posiciones a escribir.
    movwf    RAM_Contador
    movlw    RAM_PrimeraLibre
    movwf    FSR                        ; Primera dirección de memoria RAM a escribir
RAM_Escribe
    movf    RAM_Dato,W                ; Escribe el contenido de RAM_Dato en posición
    movwf    INDF                    ; apuntada por FSR.
    incf    FSR,F                    ; Apunta a la siguiente dirección de memoria.
    incf    RAM_Dato,F                ; Incrementa el dato a cargar.
    decfsz    RAM_Contador,F
    goto    RAM_Escribe
;
; El programa principal procede a leer la RAM desde la dirección 0.
;
Principal
    movlw    RAM_ULTIMA_DIR+1         ; Número de posiciones a leer.
    movwf    RAM_Contador
    movlw    0                        ; Primera dirección a leer.
    movwf    FSR
RAM_Lee
    movf    INDF,W                    ; Lee el contenido de RAM_Dato en posición
    movwf    RAM_Dato                ; apuntada por FSR.
    call    VisualizaRAM
    incf    FSR,F                    ; Apunta a la siguiente dirección de memoria.
    decfsz    RAM_Contador,F            ; Si no ha llegado al final pasa a leer la
    goto    RAM_Lee                    ; siguiente.
    goto    Principal
;
; Subrutina "VisualizaRAM" --------------------------------------------------------------
;
VisualizaRAM
    call    LCD_Linea1                ; Pasa a visualizarla.
    movlw    MensajeDireccion
    call    LCD_Mensaje
    movf    FSR,W                    ; Visualiza el número de la posición
    call    LCD_ByteCompleto
    call    LCD_Linea2
    movlw    MensajeContenido
    call    LCD_Mensaje
    movf    RAM_Dato,W                ; Visualiza el contenido de la posición
    call    LCD_ByteCompleto
    call    Retardo_500ms
    return

; "Mensajes" ----------------------------------------------------------------------------
;
Mensajes
    addwf    PCL,F
MensajeDireccion
    DT "Direccion: ", 0x00
MensajeContenido
    DT "Contenido: ", 0x00

    INCLUDE  <RETARDOS.INC>        ; Estos includes también reservan posiciones de
    INCLUDE  <LCD_4BIT.INC>        ; memoria RAM. Por tanto la última posición habrá 
    INCLUDE  <LCD_MENS.INC>        ; que definirla después de éstos.

    CBLOCK
    RAM_PrimeraLibre            ; Ultima posición de RAM ocupada por una variable.
    ENDC

    END

¿Ahora se entiende algo sobre este tema?

Saludo.
 
Las direcciones serían a partir de la imagen que estoy adjuntando?


PD: lo siento , creo que esas direcciones no se utilizan
 

Adjuntos

  • DSC_0543.jpg
    DSC_0543.jpg
    97.1 KB · Visitas: 6
Última edición:
Atrás
Arriba