miércoles, 22 de enero de 2020

TABLAS

¿Cómo se guardan los datos de las "tablas" en memoria de programa?

Para saber como se guardan los datos en las "tablas" se van a realizar unos ejemplos básicos:

Ejemplo1 :Almacenamiento de tabla .org 0x0000 

------------------------------------------------------------------------------------------------------------------------------------------------------
Figura1:ORG 0x0000

Como se observa en la figura 1 la "tabla" en la dirección 0x0000(Word) coincide con la dirección 0x00 en Byte.

Ejemplo2 :Almacenamiento de tabla .org 0x0001 

------------------------------------------------------------------------------------------------------------------------------------------------------


Figura2:.ORG 0x0001

En la figura 2 los valores de  la "tabla" se van guardando desde la dirección 0x02 en Byte y desde la dirección 0x0001(como lo ordena .ORG 0x0001). 

Ejemplo3 :Almacenamiento de tabla .org 0x0002 

------------------------------------------------------------------------------------------------------------------------------------------------------
Figura3:.ORG 0x0002

En la figura 3 los valores de  la "tabla" se van guardando desde la dirección 0x04 en Byte y desde la dirección 0x0002(como lo ordena .ORG 0x0002). 

Ejemplo4 :Almacenamiento de tabla .org 0x0003 

------------------------------------------------------------------------------------------------------------------------------------------------------
Figura4: .ORG 0x0003

En la figura 4 los valores de  la "tabla" se van guardando desde la dirección 0x06 en Byte y desde la dirección 0x0003(como lo ordena .ORG 0x0003). 

 Conclusiones 

  • La construcción de "tablas" se establecen dentro de memoria FLASH o memoria de programa.
  • Se observa que cuando el origen de la tabla " Adress(.org 0x000a)" este es WORD(16 bits) los datos se van a guardar en "Adress(.org 0x0[2a])" este es en Byte.
  • Por lo anterior se puede decir que cuando doy un origen a(dirección en word), los valores se van a guardar en a*2(dirección en byte) 
  • Al momento de llamar la dirección de la "tabla" en byte éste será el doble de la dirección de  origen(en word) de la "tabla".
  • Para llamar la dirección de la tabla(en byte) desplazada 1 posición hay dos maneras; la primera es [tabla*2] y la segunda  es [tabla<<1].

martes, 21 de enero de 2020

Uso de la instrucción "LD" y "ST"

LD(Load Indirect from SRAM(data Space) To Register using Index Y,X

  • Se carga Rd con el contenido que apunta el registro apuntador Y.
  • Carga indirecta del espacio de datos hacia Rd.

Instrucción LD
Como pueden ver  esta instrucción es muy similar a la instrucción LDS, pero ahora vemos que usa el registro Y(16 bits), éste registro Y, la cual  se usa como apuntador de dirección.

Descripción y puntos importantes.

  •  Para usar esta instrucción se debe cargar previamente el apuntador Y, ya que según  la dirección que este apuntado "Y" va a mover el dato que esta en esta dirección y la colocará en Rd .
  • En algunos casos en vez de "Y" encontraremos "Y+" o "-Y" , eso quiere decir que cuando se ejecute la instrucción va a aumentar o disminuir este registro apuntador"Y" de 16 bits.
  • Esta instrucción no la cuenta todos los microcontroladores ATMEL
  • Para algunos microcontroladores ATMEL que solo tienen 256Bytes de memoria solo es suficiente usar 8 bits(los menos significativos).
  • Para microcontroladores ATMEL con mayor memoria de datos ya se usan los 16 bits.
  • Recordemos que  la pila se ubica en la SRAM interno y su inicio es la última dirección de memoria, para el caso del Atmega32 la última dirección(RAMEND) es 0x85F.
  • Se pueden usar los punteros X,Y, los dos  de 16 bits.
  • Debemos tener en cuenta que el puntero X esta formado por los registros R26,R27, el puntero Y está formado por los registros R28,R29 y finalmente el puntero Z esta formado por los registros R30,R31, como se muestra en la siguiente imagen:
Punteros

Ejemplo

------------------------------------------------------------------------------------------------------------------------------------------------------
Agregar el contenido de la ubicación de la dirección de 0X1F(Correspondiente a R31) hacia el registro R16.
Código
Este es un método indirecto de cargar valores dentro la memoria de datos según la dirección que deseemos  de SRAM hacia la misma SRAM. 
Debug
------------------------------------------------------------------------------------------------------------------------------------------------------
ST(Store Indirect From Register to Data Space using index X,Y

  • Se carga el valor de la dirección apuntada por  Y con el contenido de Rr, 0<=r<=31
  • Carga indirecta de Rr  hacia la dirección de SRAM apuntada por Y.
Instrucción ST
  • Como pueden ver  esta instrucción es muy similar a la instrucción STS, pero ahora vemos que usa el registro Y(16 bits), éste registro Y, la cual  se usa como apuntador de dirección.
  • Como se observa este es el proceso inverso de la instrucción LD.
  • En algunos casos en vez de "Y" o "X" encontraremos "Y+" ,"-Y","X+","-X" , eso quiere decir que cuando se ejecute la instrucción va a aumentar o disminuir este registro apuntador"Y" o "X" de 16 bits.

Ejemplo

------------------------------------------------------------------------------------------------------------------------------------------------------
Agregar el contenido de la ubicación del registro R16 hacia la dirección de X.
------------------------------------------------------------------------------------------------------------------------------------------------------

Código

Este es un método indirecto de cargar valores dentro la memoria de datos según la dirección que deseemos  de SRAM hacia la misma SRAM. 
Debug
------------------------------------------------------------------------------------------------------------------------------------------------------

Uso del firmware original de la grabadora USBasp AVR en MX-USBASP (clon chino)

Te vendieron un USBisp pensado que es un USBasp?? Hace 2 meses compré un "USBasp" fui a probarlo y no funcionó....pensé me estafar...