









Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Los mejores documentos en venta realizados por estudiantes que han terminado sus estudios
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Descubre las mejores universidades de tu país según los usuarios de Docsity
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Es un buen contenido es es es 8052 hola déjenme de joder pagina horrible
Tipo: Esquemas y mapas conceptuales
1 / 17
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!
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.
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:
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
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:
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:
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
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.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.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:
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:
(^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.
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:
(^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.
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.
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:
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;