Contenido>Indice>Intro Tutor

MEMORIA DE DATOS



La memoria de datos (RAM) del µC 8051 se presenta dividida en dos; memoria de datos externa (RAM externa) y memoria de datos interna (RAM interna).

RAM Externa

Como sugiere el mismo nombre, la RAM externa es una memoria de acceso aleatorio, de lectura y escritura, que se encuentra fuera del chip. Los accesos a la RAM externa son más lentos y menos flexibles que los accesos a la RAM interna. Por ejemplo, para incrementar una posición en RAM interna sólo se necesita 1 instrucción y 1 ciclo máquina. En cambio, para incrementar una posición de RAM Externa se requieren 4 instrucciones y 7 ciclos máquina. En este caso, la memoria externa es 7 veces más lenta. 

Incrementar la posición 0x25 de RAM interna

Ciclos

INC 25H

1

 

Incrementar la posición 0x2043 de RAM Externa

Ciclos

MOV DPTR, #2043H

2

MOVX A,@DPTR

2

INC A

1

MOVX @DPTR, A

2

Pero lo que pierde la RAM Externa en velocidad y flexibilidad, lo gana en cantidad, ya que la RAM interna está limitada a 128 bytes, mientras que la RAM externa puede tener un tamaño máximo de 64Kbytes.

RAM Interna

El 8051 dispone de 128 bytes de RAM interna (en algunos derivados como  el 8052 alcanza los 256 bytes). Por encontrarse en el interior del chip es la memoria de lectura y escritura que proporciona mayor rapidez y flexibilidad en los accesos a los datos. La RAM interna es una memoria volátil, cuyo contenido desaparece cuando se quita la alimentación al µC.

Ram8051.gif (2602 bytes)

figura:MAPA DE MEMORIA INTERNA

La RAM interna se encuentra dividida en 2 secciones: los 128 bytes inferiores y el área de los registros de funciones especiales o SFRs. Los 128 bytes inferiores permiten el acceso directo e indirecto, los 128 bytes superiores sólo permiten el acceso indirecto, y los SFRs solo pueden ser accedidos directamente.

Los 128 bytes inferiores de la RAM interna están subdivididos como se muestra en el mapa de memoria. 

En los primeros 32 bytes de esta sección se encuentran 4 bancos de ocho registros R0-R7. El 8051 puede seleccionar uno de los 4 bancos de registros de los que dispone, mediante los bits RS0 y RS1 del registro de estado PSW. Después de un reset el 8051 utiliza el banco 0.

La memoria direccionable como bit y como byte está formada por las 16 posiciones de RAM interna situadas entre las direcciones 20H y 2FH.

Las restantes posiciones de RAM interna, desde la dirección 30H hasta 7FH, se utilizan para guardar las variables de usuario que requieren un acceso rápido y/o muy frecuente. 

La pila del microcontrolador puede ubicarse en cualquier lugar de RAM interna. Después de un reset el registro apuntador de pila queda cargado con 07H, con lo que la pila crece a partir la dirección siguiente respetando el contenido del banco de registros 0. La pila puede crecer hasta la dirección 7FH en el µC 8051.

i088.gif (541 bytes)El 8051 solo puede direccionar 64K de RAM. Para superar esta limitación es necesario utilizar técnicas especiales en el hardware y en el software.

 

Area de Registros de funciones especiales (SFRs)

Los SFRs son registros destinados, en su mayoría, al control de los periféricos integrados en el 8051. Por medio de distintos SFRs se puede: acceder a los puertos de entrada/salida del 8051;  leer o escribir en el puerto serie del µC; controlar los temporizadores y contadores; configurar el sistema de interrupciones, etc. No obstante, dentro de los SFR's también se encuentran los registros aritméticos (ACC, B, PSW), el apuntador de pila (SP), y los registros apuntadores de datos (DPH y DPL).

Los SFRs se encuentran en la RAM interna del microcontrolador, entre la dirección 80H y 0FFH, permitiendo el acceso directo exclusivamente.

Este tema se extiende en el capítulo 2 (Ver Descripción de los SFRs estándar)

i088.gif (541 bytes)Cada SFR tiene una utilidad y un formato específico. No todas las direcciones por encima de la 80H están asignadas a los SFR. Sin embargo, las direcciones de esta región, no asignadas a ningún SFR, son inexistentes y no pueden ser utilizadas como posiciones adicionales de memoria RAM.

 

Memoria de bit

El 8051, siendo un microcontrolador orientado al control, tiene la posibilidad de acceder a un número de variables de bit. Estas variables pueden tener por valores 0 ó 1.

Existen 128 variables de bit posibles, numeradas desde 00H hasta FFH. El programador puede modificar estas variables con instrucciones tales como SETB,  CLR, y CPL. 

Es importante tener en cuenta que la Memoria Bit es realmente parte de la RAM Interna. De hecho, las 128 variables bit ocupan los 16 bytes de RAM Interna desde la dirección 20H 2FH. Así, si se escribe el valor FFH en la dirección 20H de RAM Interna, los bits 00H hasta 07H se activan (1). Esto quiere decir que:

MOV 20h,#0FFh

es equivalente a:

SETB 00h
SETB 01h
SETB 02h
SETB 03h
SETB 04h
SETB 05h
SETB 06h
SETB 07h

Lo más importante a recordar es que realmente la Memoria Bit no es un tipo de memoria aparte, sino  una zona perteneciente a la RAM Interna.

i088.gif (541 bytes)Si en el programa no se usan variables bit, las direcciones de RAM interna desde 20H hasta 2FH se pueden utilizar como variables byte sin problemas. Sin embargo, si la idea es usar variables bit, estas zonas de memoria debe modificarse de forma cautelosa ya que se podría llegar a sobreescribir los valores de los bits.

Las variables Bit desde 00H hasta 7FH se utilizan para funciones definidas por el usuario en sus programas. Sin embargo, existen también variables bit desde 80H en adelante que son utilizadas para acceder a ciertos SFRs bit a bit. Por ejemplo, si las patillas de salida del puerto P0 (P0.0 hasta P0.7) están todas a 0, y se quiere poner a 1 la patilla P0.0, podemos ejecutar:

MOV P0,#01h

o también: 

SETB 80h (o SETB P0.0)

Ambas instrucciones realizan la misma función. Sin embargo, usando el comando SETB se activará la patilla P0.0 sin afectar a ninguno de los demás estados del P0. La instrucción MOV en este caso, efectivamente pone a 1 la patilla P0.0, pero modifica el resto de las patillas poniéndolas a 0.

i088.gif (541 bytes)Después de un reset al 8051 el Stack Pointer (SP o apuntador de la pila) queda cargado con 07H. Esto significa que la pila comienza desde la siguiente dirección y se expande hacia las posiciones de memoria sucesivas. Si se selecciona algún banco de registro distinto al banco 0, el SP debe ser inicializado por encima del banco de registro más alto que se esté utilizando, de otro modo se podría sobreescribir la pila. De forma similar, si usamos variables bit, normalmente es una buena idea inicializar el SP por encima del valor 2FH para garantizar que las variables bit quedan a salvo de la pila.

Bancos de Registro

El 8051 posee 8 registros (R0, R1, R2, R3, R4, R5, R6, y R7) que utiliza en muchas de sus instrucciones. Estos registros se usan generalmente para ayudar en la manipulación de valores y en el movimiento de datos de una zona de memoria a otra. Por ejemplo, para sumar el valor de R4 al Acumulador, se puede ejecutar la siguiente instrucción:

 

ADD A,R4

En este caso, si el Acumulador (A) tiene el valor 6 y R4 el valor 3, después de ejecutar la instrucción el Acumulador contendrá el valor 9.

Sin embargo, como el registro R4 se encuentra en la dirección 04H de RAM Interna, la siguiente instrucción debería realizar la misma operación:

ADD A,04h

La instrucción suma el valor contenido en la dirección 04H al Acumulador, dejando el resultado en este último. Entonces si realmente R4 está en la dirección 04H de RAM Interna, las dos instrucciones realizan la misma operación.

Pero ¡Cuidado! El 8051 tiene cuatro bancos de registro distintos. Normalmente se trabaja con el banco 0, sin embargo, por software se puede seleccionar otro banco de registros (banco 1, 2 ó 3). En este caso, R4 no será equivalente a la dirección 04H. Por ejemplo, si las instrucciones del programa selecciona el banco 3, el registro R4 será sinónimo a la dirección 1CH.

El concepto de bancos de registro proporciona flexibilidad al 8051, especialmente en el manejo de interrupciones. Sin embargo, lo más importante es recordar que los bancos de registro residen en los 32 primeros bytes de RAM Interna. 

i088.gif (541 bytes)En caso de que sólo se use el primer banco de registros (banco 0), se pueden utilizar las posiciones de RAM interna desde la dirección 08H hasta 1FH para otros menesteres. Pero cuando se desee seleccionar otro banco de registro (ya sea el banco 1, 2 ó 3), se hace necesario un cuidado especial al usar direcciones de memoria por debajo de 20H, ya que se podría sobreescribir el valor de algún registro.

   


   Contenido>Indice>Intro Tutor