ATmega16 – SRAM

En la programación con lenguaje ensamblador es necesario conocer cómo está conformada la memoria SRAM ya que colocaremos de manera manual los datos con los que estemos trabajando. En lenguaje ensamblador usaremos los 32 registros de trabajo y los registros de entrada/salida.

Cuando se programa en C el compilador se encarga de reconocer cada tipo de registro y también coloca el programa en la zona de memoria adecuada.

La memoria del ATmega16 se distribuye de la siguiente manera:

  • Las 32 primeras posiciones son utilizadas por los registros de trabajo.
  • Las siguientes 60 posiciones son para los registros de Entrada/Salida, estos registros son utilizados por los recursos del uC para configurarlos y/o utilizarlos.
  • A partir de $60 hasta $45F (1024 posiciones) son posiciones de memoria destinados para el usuario.

Ejemplo:

// * Author: Victor Dueñas Guardia
// * Info: www.netzek.com
// @Ejemplo:
// – Colocar el valor $AA en los 100 primeros bytes de la memoria.
// – Realizar el copiado de los 100 primeros bytes de la memoria hacia la posición $0200 de la memoria.
// Pseudo-código:
// – Defino el número de bytes que serán copiados.
// – Defino la posición inicial donde serán colocados los "n" primeros bytes.
// – Defino la posición donde serán movidos los "n" bytes.
// – Coloco los "n" bytes usando modo de direccionamiento con post-incremento.
.INCLUDE "M16DEF.INC" //Incluye definición archivos ATmega16
LDI R16,10 //Cargo el numero de bytes a colocar
LDI XH,$00
LDI XL,$6 //Cargo el inicio de la RAM en el puntero X
LDI ZH,$02
LDI ZL,$0 //Cargo la posición $0200 en el puntero Z
LDI R18,$A //Cargo el valor $AA para colocar en los 100 primeros bytes de la RAM
Colocar:
ST X+,R1 //Coloco el valor $AA y post-incremento la dirección
DEC R16 //Decremento en uno el numero de bytes
BRNE Colocar //Salto a colocar hasta que no hayan más bytes para copiar
//Copio los 100 bytes a las posición $0200
LDI R16,10 //Cargo el numero de bytes a copiar
LDI XH,$00
LDI XL,$6 //Cargo el inicio de la RAM en el puntero X
Copiar:
LD R17,X //Cargo el valor de la posición de la RAM
ST Z+,R1 //Coloco el valor cargado en la posición $0200
DEC R16
BRNE Copiar
BUCLE: RJMP BUCLE //Bucle infinito
view raw SRAM.asm hosted with ❤ by GitHub

Simulación:
Realizaremos una simulación en el ISIS de Proteus (v7.9) para comprobar que nuestro programa está adecuadamente implementado, en este caso solo necesitamos el ATmega ya que no estamos usando recursos externos.

Haciendo doble clic sobre el uC nos sale una ventana como esta y elegimos la ubicación del archivo .hex:

Para ver la memoria RAM de nuestro uC hacemos los siguiente:

  • Presionamos en el botón Step.
  • Debug –> AVR Data Memory

Y como vemos, el copiado fue realizado exitosamente.