Docsity
Docsity

Prepara tus exámenes
Prepara tus exámenes

Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity


Consigue puntos base para descargar
Consigue puntos base para descargar

Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium


Orientación Universidad
Orientación Universidad

Manual en español 8051, Esquemas y mapas conceptuales de Electrónica

Es un buen contenido es es es 8052 hola déjenme de joder pagina horrible

Tipo: Esquemas y mapas conceptuales

2018/2019

Subido el 28/04/2019

jorge-palomar
jorge-palomar 🇦🇷

1 documento

1 / 17

Toggle sidebar

Esta página no es visible en la vista previa

¡No te pierdas las partes importantes!

bg1
GESTION DE MEMORIA
EN LOS MICROCONTROLADORES
DE LA FAMILIA MCS-51
SISTEMAS DIGITALES II
FEBRERO 2006
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff

Vista previa parcial del texto

¡Descarga Manual en español 8051 y más Esquemas y mapas conceptuales en PDF de Electrónica solo en Docsity!

GESTION DE MEMORIA

EN LOS MICROCONTROLADORES

DE LA FAMILIA MCS-

SISTEMAS DIGITALES II

FEBRERO 2006

- PUERTOS DE ENTRADA/SALIDA.

Consisten en 32 líneas de E/S direccionables individualmente que se reparten en 4 puertos P0, P1, P2 y P3. Ciertas líneas de estos puertos pueden desempeñar una función auxiliar programándolas adecuadamente.

  • TIMERS. Denominados T1 y T0, pueden trabajar como temporizadores y como contadores. Ambos son de 16 bits.
  • PUERTO SERIE. Es una UART, capaz de transmitir y recibir simultáneamente. Posee 4 modos de funcionamiento, que se diferencian en el formato de los datos y velocidad de la transmisión.
  • INTERRUPCIONES. En el 8051 hay 5 posibles fuentes de interrupción:
    • Dos entradas externas, que se programan según convenga para trabajar con niveles lógicos o con flancos de bajada.
    • Los timers T0 y T1, cuando se produce un desbordamiento en sus registros.
    • El puerto serie, tanto en recepción como en transmisión. Las interrupciones se pueden habilitar tanto global como individualmente y pueden llevar asociados 2 niveles de prioridad. Los vectores de interrupción marcan el comienzo de la rutina de atención a cada interrupción.

3.- Arquitectura interna del 80C552. ¿Dónde están las diferencias?

El microcontrolador 8xC552 es un derivado de la familia 80C51. Posee todas las funciones hardware del 80C51 y conserva el mismo conjunto de instrucciones, sin embargo se le han añadido algunas mejoras. En este apartado se procederá a describir las novedades que incorpora este microcontrolador respecto de la versión básica de la familia.

Las diferencias más destacadas en relación con los periféricos que integra son:

  • Incorpora un nuevo puerto de E/S y otro de sólo entrada, ambos de 8 bits.
  • Incluye un tercer timer (T2) que tiene funcionalidades avanzadas para captura de cuenta y generación de señales.
  • Integra un cuarto temporizador para funciones de seguridad denominado WatchDog.
  • Incorpora un generador de PWM de dos canales
  • Incluye un segundo puerto de comunicaciones serie síncronas denominada I2C.
  • Un conversor digital analógico de 8 canales.

4.- Primera aproximación al problema de la gestión de Memoria.

El acceso a la memoria se realiza exactamente igual en todos los elementos de la familia, siendo la única diferencia entre ellos el tamaño de la memoria interna que poseen.

Como se comentó anteriormente, los microcontroladores de la familia 8051 pueden direccionar separadamente la memoria de programa y la de datos. Además, se puede diferenciar entre la memoria interna y externa. Por tanto, se puede hablar de

  • Memoria interna de programa
  • Memoria externa de programa
  • Memoria interna de datos
  • Memoria externa de datos

Además, y si se desea, se puede deshabilitar la memoria interna con lo que toda la memoria debe ser externa.

La memoria interna de programa se encuentra ubicada en las direcciones más bajas del mapa. Dependiendo del elemento de la familia seleccionado la cantidad de memoria disponible varía:

  • Para el 80C51 esta memoria es de 4Kb y se encuentra entre la direcciones 0000h y 0FFFh
  • Para el 80C552 es de 8Kb y está mapeada entre las direcciones 0000h y 1FFFF.

El resto del mapa de memoria se puede completar con memoria externa hasta llegar a los 64Kbytes que es capaz de direccionar el microcontrolador. De forma gráfica el mapa de memoria de programa para el 80C51 quedará como muestra la figura 2.

OR

BYTES^ 60k EXTERNAL

AND

FFFF

1000

0FFF

0000

INTERNAL4k BYTES

64k EXTERNALBYTES

FFFF

0000

80C51 Program Memory

60K Memoria Externa

4K Memoria Interna

64K Memoria Externa

O

Figura 2. Mapa de memoria de programa

El modo en el que se encuentra mapeada la memoria interna de datos es más complejo que en el caso de la memoria de programa. Sin embargo, y en una primera aproximación, se puede indicar que toda la memoria interna de datos se encuentra en las direcciones más bajas del mapa. Igual que ocurría con el tamaño de la memoria de programa, el tamaño de la memoria de datos puede variar dependiendo del elemento de la familia. Así, por ejemplo, se tiene que:

  • El 80C51 dispone de 128 bytes entre las posiciones 0000h y 007Fh
  • El 80C552 dispone de 256 bytes entre las posiciones 0000h y 00FFh

A diferencia de lo que ocurría con el mapa de memoria de programa, el mapa de datos se puede completar con otros 64 Kbytes de memoria (hay que darse cuenta de que en este caso no se completa el mapa ya existente para llegar a los 64Kb si no que se colocan otros 64Kb externos). Esto provoca que haya direcciones de memoria de datos que se encuentren “solapadas”. O dicho de otro modo, si se desea acceder a la dirección 0000h de memoria de

MEMORIA INTERNA MEMORIA EXTERNA

0000

FFFF

0000

FFFF

DIRECCIONAMIEN - TO INDIRECTO

00

7F

80

FF

80

FF SFR

DIRECCIONAMIENTO DIRECTO

DIRECCIONAMIENTO DIRECTO O INDIRECTO

DIRECCIONAMIEN - TO INDIRECTO

00

7F

80

FF

80

FF SFR

O DIRECTO

DIRECCIONAMIENTO DIRECTO O INDIRECTO

Figura 4. Mapa de memoria de datos del 80C

Así, y de forma resumida, se puede indicar que hay una zona de memoria entre la 0000h y la 007Fh que puede estar mapeada sobre la memoria interna y sobre la externa por lo que su acceso debe diferenciarse por las instrucciones con las que se accede a una u otra^1. Además entre las direcciones 0080h y 00FFh hay solapadas tres memorias de modo que para diferenciar los accesos de unas a las otras se emplean instrucciones diferentes (una para la memoria externa y otra para la interna) y direccionamientos diferentes dentro de la interna (directo para la zona de registros de configuración e indirecto para la de memoria de datos).

Antes de continuar cabe plantearse una duda. ¿es necesario que el programador conozca todos estos detalles de la memoria y los tenga en cuenta a la hora de realizar sus programas?. La respuesta depende del lenguaje en el que se realice el programa. En el caso de que este lenguaje sea ensamblador es absolutamente necesario conocer estos detalles, sin embargo, si se emplea C es el compilador el que resuelve en muchas ocasiones todos los problemas relacionados con el direccionamiento de la memoria interna o externa. Para ello hay que indicarle el elemento de la familia con el que se va a trabajar, la cantidad de memoria externa disponible (para el caso de la externa) y dónde se encuentra mapeada.

5.- Memoria de programa.

5.1.- Memoria de programa interna La memoria de programa sólo es accesible para lectura y está implementada con una memoria de tipo ROM. Como ya es sabido hay versiones del microcontrolador que integran memoria de programa y otras que no. En las versiones que integran una ROM o una EPROM, esta memoria está colocada al principio del espacio de direccionamiento, pudiendo estar ocupada la parte alta del mapa por una memoria externa. En versiones sin ROM, toda la memoria de programa será externa.

La parte inferior del área de memoria de programa está ocupada por una ROM o EPROM de 4Kb en el caso del 8051 y de 8Kb en el del 8xC552. Como ya es sabido esta memoria puede ser deshabilitada. Para ello es necesario actuar sobre el pin EA. Si está a

(^1) para la memoria interna se emplea la instrucción MOV y para la externa la instrucción MOVX

nivel bajo (EA=0), la memoria queda desactivada y el microcontrolador emprende la búsqueda de instrucciones en memoria externa. En el caso de que EA=1 (el más usual), el programa puede ubicarse en la memoria interna de programa.

5.2.- Memoria de programa externa Para acceder a la memoria externa de programa es necesario poder conectarla al microcontrolador de algún modo. Por tanto hace falta disponer de un bus de datos, uno de direcciones y las señales de control que permitan generar las órdenes de lectura.

Para implementar estos buses se emplean algunos de los puertos de entrada salida. En concreto, y dado que se necesitan 16 líneas de direcciones y 8 de datos parece que sería razonable usar 3 puertos de 8 bits. Sin embargo esto provocaría que sólo quedara disponible un puerto (para el caso del 80552 quedarían tres). Con el fin de ahorrar recursos lo que se hace es emplear una técnica habitual en los procesadores de Intel que consiste en multiplexar la información de los buses. Dicho de otro modo, uno de los puertos, durante una parte del ciclo máquina, se usa como bus de direcciones, y durante otra parte como bus de datos. Con esta estrategia se necesitan sólo dos puertos para generar los buses de datos y direcciones. En concreto se emplea el puerto 0 (P0) como parte baja del bus de direcciones y como bus de datos y el puerto 2 (P2) como parte alta del bus de direcciones.

Sin embargo, esta estrategia tiene un claro inconveniente. ¿Cómo sabe la memoria si el P0 se esta usando como bus de datos o de direcciones?. Para ello es necesario emplear una señal extra denominada (ALE Address Latch Enable) que marca si se está usando como datos o como direcciones. Con la ayuda de esta señal es posible demultiplexar el bus, o dicho de otro modo, separar el bus de datos y direcciones sin mas que añadir un latch “que capture” la dirección para que ésta sea estable “a ojos” de la memoria.

A todo el problema asociado a los buses de datos y direcciones hay que añadir que de algún modo será necesario indicar si los accesos a memoria externa se realizan a la de datos o a la de programa. El único modo de poder distinguir entre estos accesos es que el microcontrolador active convenientemente alguna señal. Con este fin el microcontrolador posee las señales PSEN, RD y WR. La primera de ellas indica acceso a memoria externa de programa y las otras dos a memoria de datos externa en lectura y escritura respectivamente.

Para entender todo esto mejor quizás sea necesario analizar superficialmente el ciclo máquina de acceso a memoria de programa externa que se muestra en la figura 5. En dicho ciclo hay que prestar especial atención a la información del puerto 0 y compararla con la que aparece en el P2. En el segundo se muestra que la parte alta del bus de direcciones permanece estable durante todo el acceso a la memoria, sin embargo, en el primero se muestra como la parte baja de las direcciones sólo esta activa en momentos puntuales. Por tanto es en esos momentos en los que hay “que capturar” por lo que coinciden con el flanco de bajada de la señal ALE.

Con todo lo expuesto anteriormente hay que ver como se conecta una memoria a este mapa. Un esquema muy básico es el que se muestra en la figura 6.

001BH Timer 1 0023H Puerto Serie …… ……

6.- Memoria de datos

6.1.- Memoria de datos interna Tal y cómo se comentó anteriormente la memoria de datos puede ser interna o externa. En el caso de la memoria de datos, la capacidad que tiene la que se encuentra integrada en el microcontrolador es pequeña, ya que en el caso del 8051 es de tan solo 128 bytes mientras que en el 8xC552 es de 256 bytes. Por este motivo suele ser necesario disponer de memoria de datos externa.

La estructura de la memoria de datos interna ya se comentó anteriormente y se puede observar en las figuras 3 y 4. No obstante, conviene recordar que lo que estrictamente se considera memoria interna para datos del programa (variables por ejemplo) es el espacio que se encuentra entre las direcciones 0000h-007Fh para el 8051 y las direcciones 0000h-00FFh para el 8xC552.

Sin embargo, en buena parte de la literatura se incluye como memoria interna la zona correspondiente a la configuración de los periféricos (registros SFR –Special Function Registers-) a la que se accede empleando las direcciones del mapa de memoria interna que se encuentran mapeadas entre las direcciones 0080h y 00FFh. Estos registros se pueden considerar memoria de datos interna ya que se accede a ellos empleando las mismas instrucciones de acceso a ese tipo de memoria pero realmente no pueden ser empleados para ubicar datos del programa (por ejemplo variables). En cualquier caso, y por coherencia con la bibliografía, se van a considerar como si fueran parte de la memoria interna de datos.

Dicho esto se puede hablar por tanto de 3 zonas de memoria de datos interna que tienen peculiaridades diferentes. Estas zonas son:

  1. Memoria de datos interna entre las direcciones 0000h y 007Fh
  2. Registros de configuración (SFR) entre las direcciones 0080h y 00FFh^2
  3. Memoria de datos interna entre las direcciones 0080h y 00FFh (esta sólo está disponible en el 8xC552).

6.1.1.- Memoria de datos interna entre las direcciones 0000h y 007Fh. Esta es la memoria “básica” para los datos de los programas y a ella se puede acceder tanto con direccionamientos directos como indirectos. Dentro de esta zona se diferencian a su vez otras zonas más pequeñas con funcionalidades especiales. En concreto se puede hablar de tres subzonas:

  1. Registros universales (direcciones entre 0000h y 001Fh)
  2. Zona direccionable a nivel de bit (direcciones entre 0020h y 002Fh)
  3. Zona de libre disposición para los programas (entre 0030h y 007Fh)

(^2) Hay que recordar que para diferenciar los accesos a la memoria interna de datos que se encuentra

entre las direcciones 80h y FFh y los registros de configuración (SFRs) se emplean direccionamientos diferentes.

8 BYTES

78 70 68 60 58 50 48 40 38 30 28 20 18 10 08 00

7F 77 6F 67 5F 57 4F 47 3F 37 2F 27 1F 17 0F 07

SCRATCHPAD AREA

Area de Escritorio

... 7F 0 ... 3 2 1 0

ADDRESSABLE^ BIT SEGMENT

REGISTERBANKS

Direccionamiento de Bit

Bancos de Registros

Figura 7. Funcionalidades de la memoria interna de datos

Registros universales Los Registros universales ocupan los primeros 32 bytes de la RAM. Se puede decir que estos bytes están descompuestos en cuatro bancos de 8 bytes cada uno, aunque sólo uno de ellos puede estar activo en cada momento. El programa es el encargado de seleccionar el banco activo.

Cada banco contiene los registros denominados R0 a R7. Así R0, por ejemplo, puede designar la dirección 0000H, 0008H, 0010H y 0018H, según esté activo el banco 0, 1, 2 o 3. La utilidad de tratar así esta zona de memoria es, por ejemplo, proporcionar un medio rápido de salvaguarda el contexto durante un tratamiento de interrupción.

Los registros R0 a R7 son de uso universal, aunque sólo R0 y R1 permiten algunos direccionamientos complejos como pueden ser el indirecto por registro.

Bits direccionables individualmente. Entre la dirección 0020h y 002Fh se encuentran 16 bytes que permiten el acceso a nivel de bit. La dirección de cada uno de estos bits es expresada por un byte. Es decir, el bit menos significativo del byte 0020h puede ser direccionado por la dirección 00H, y el más significativo del byte 2Fh por 7Fh. Esta dirección es la que se emplea en las instrucciones específicas enfocadas a direccionamiento de bit.

El objeto de estos bits es optimizar el uso de la memoria interna de datos ya que en muchas ocasiones se emplean variables ( flags ) para señalizar si se ha producido un evento o no (variables que podríamos denominar booleanas ) y que por tanto solo requieren de un bit. En estos casos es interesante no emplear todo un byte para almacenarlas si no que con tan solo un bit se puede resolver el problema.

En cualquier caso, y si no se necesitan este tipo de variables booleanas siempre se pueden emplear estas posiciones de memoria como posiciones para almacenar variables “convencionales” de 8 bits.

Esto hace que sea necesario emplear un latch externo que separe ambos buses antes de conectarlos a la memoria.

La diferencia más sustancial con la ampliación de memoria de programa es que, en este caso, es necesario poder realizar lecturas y escrituras por lo que se dispone de dos señales que genere el microcontrolador automáticamente cada vez que se desea hacer un acceso a dicha memoria. Estas señales se denominan RD y WR. Con todo esto una posible estructura de ampliación de memoria es la que se muestra en la figura 9.

80C

Latch

SRAM

P

ALE

EA

P

RD OE

ADDR

WR WE

E

CE

CE

Direcci ones

Registro

Figura 9. Memoria externa de datos.

El control de la RAM se hace ahora por medio de las señales RD y WR, para accesos de lectura y escritura respectivamente. Estas señales, activas a nivel bajo, son funciones secundarias de alguno de los pines del puerto P3 (RD el pin 6 y WR el pin 7).

Tanto RD como WR permanecen inactivas durante los accesos a memoria externa de programa (gobernados por PSEN), mientras que ALE se usa en ambos casos.

Para finalizar el tema de los accesos a memoria externa de datos se presentan los cronogramas de los ciclos máquina que permiten temporizar los accesos a estas memorias y comprobar si éstas son suficientemente rápidas^3. En la parte superior se aprecia un ciclo máquina de lectura cuyas características, en líneas generales, son muy similares a las de un ciclo de lectura en memoria de programa externa (en el P0 el microcontrolador coloca la dirección que debe ser capturada por el latch y posteriormente deja el bus en alta impedancia para que la memoria coloque el dato). Por otra parte en el ciclo de escritura se aprecia cómo el procesador coloca primero la dirección y posteriormente el dato sobre el P0.

Antes de finalizar con la memoria de datos es necesario platearse la misma duda que se planteó con la memoria interna del programa. ¿es necesario que el programador tenga en cuenta todos estos detalles a la hora de realizar su aplicación?. Al igual que la otra oportunidad en la que se planteó esta pregunta, la respuesta depende del lenguaje de programación que se emplee. Si se usa ensamblador es imprescindible conocer estos detalles. Sin embargo, si se programa desde C, es el compilador el que se encargará de asignar las direcciones a las variables y gestionar los diversos tipos de memoria de datos interna. Para ello el compilador pone a disposición del programador una serie de tipos de datos especiales que permiten acceder a los diversos tipos de posiciones de memoria.

7.- Modos de direccionamiento y juego de instrucciones.

Aunque no sea directamente un tema relacionado con el acceso a memoria es necesario conocer los direccionamientos que permite el microcontrolador puesto que el acceso a determinadas zonas de la memoria depende del direccionamiento que se emplee.

Todos los miembros de la familia del 8051 emplean el mismo repertorio de instrucciones. Esto permite pasar de un dispositivo a otro con el único esfuerzo de estudiar los nuevos periféricos que éste implementa.

Se dispone de numerosos modos de direccionamiento que permiten, entre otras cosas, el acceso rápido a los datos contenidos en RAM interna, facilitando así las operaciones sobre pequeñas estructuras de datos. También es posible manejar directamente variables booleanas, sin tener que hacer las operaciones previas.

7.1.- Modos de direccionamiento. El microcontrolador dispone de numerosos modos de direccionamiento que se pueden resumir del siguiente modo:

  • Direccionamiento inmediato: El código de operación va seguido de un segundo byte que representa una constante. Ejemplo: Poner en A el valor 80H. MOV A,#80H
  • Direccionamiento directo: Uno de los operandos de la instrucción es una dirección sobre la cual se va a actuar. Este direccionamiento es el único modo de acceder a los registros con función especial (SFR). Además de los SFR, este direccionamiento permite acceder a los 128 bytes inferiores de la RAM. Ejemplo: Poner en A el dato contenido en la dirección 80H. MOV A,80H
  • Direccionamiento por registro: El (o los) operando(s) son valores contenidos en los registros a que se hace referencia. Ejemplo: Poner en A el contenido del registro R0. MOV A, R

(^3) Recuerde que si no son suficientemente rápidas sería necesario incluir estados de espera, cosa que

en la familia del 80C51 es imposible. Por tanto sería necesario buscar una memoria más rápida.

direccionados individualmente, lo que hace un total de 128. Algunos registros de función especial también son direccionables a nivel de bit y soportan estas instrucciones.

  • Instrucciones de salto: Tanto condicionales como incondicionales. Se usan distintas formas según el tipo de direccionamiento deseado. Este grupo contiene las llamadas a subrutinas y sus retornos.

8.- Gestión de la memoria y el Lenguaje C.

De manera añadida a los tipos de datos usualmente utilizados en lenguaje C, como son char, int, float, double, etc; existen los siguientes tipos de datos en el caso del compilador de keil.

  • “sbit”: variable que debe ubicarse en la zona de direcciones accesibles a nivel de bit.
  • “sfr”: registro de la zona de configuración al que se accederá por direccionamiento directo.
  • “reg”: variable que se asignará a uno de los registros universales.

Además, cualquier tipo de variable puede ser almacenada en un tipo de memoria concreto que el programador puede seleccionar. Para ello se utilizan las siguientes palabras clave, las cuales deberán preceder a la definición de la variable como se muestra en el ejemplo:

  • “code”: la variable se almacenará en memoria de código. Obviamente, este tipo de variables no pueden ser escritas. Se utilizan para almacenar cadenas y tablas de valores a utilizar por el programa al estilo de constantes. Se denominan “look-up tables”.
  • “data”: la variable se almacenará en los 128 bytes más bajos de la memoria interna de datos y se utilizará un direccionamiento directo.
  • “idata”: la variable se almacenará en los 256 bytes de la memoria interna de datos, y se utilizará un direccionamiento indirecto.
  • “bdata”: la variable se almacenará en los 16 bytes de memoria de bit.
  • “xdata”: la variable se almacenará en memoria externa de datos, utilizando el puntero de 16 bits DPTR.
  • “pdata”: la variable se almacenará en memoria externa de datos, utilizando el puntero de 8 bits R0 ó R1.

Ejemplos: char data letra; char code mensaje = “introduzca el dato, por favor”; flota xdata valor; int bdata indicadores;

Ejemplo: queremos que la variable de tipo bit “error” se corresponda con el valor del cuarto bit de la variable de ocho bits “banderas” que se encuentra almacenada en la memoria de tipo bit.

char bdata banderas; sbit error = banderas∧3;