Micro 8051

Pontificia Universidad Católica Madre y Maestra Facultad de Ciencias de la Ingeniería Departamento de Ingeniería Telemát

Views 127 Downloads 5 File size 325KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Pontificia Universidad Católica Madre y Maestra Facultad de Ciencias de la Ingeniería Departamento de Ingeniería Telemática

Entrega de: Laboratorio de Microprocesadores Clave: ITT-327-072 Reporte práctica #0 Tema: Set de instrucciones y arquitectura del MCU 8051/52

Presentado por: Hugo A. Reyes B.

Matricula: 2011-0371

Profesor: Ing. Luis Francisco

Jueves 23 de enero de 2014 Santiago de los Caballeros, Rep. Dominicana

Introducción En este reporte se describen los aspectos más relevantes del microcontrolador MCU 8051/52, como lo son, sus características, arquitectura sobre la cual se basa, modos de direccionamiento y el set de instrucciones del lenguaje ensamblador. Un microcontrolador es un circuito integrado programable, capaz de ejecutar las órdenes grabadas en su memoria. Está compuesto de varios bloques funcionales, los cuales cumplen una tarea específica. A pesar de los años que ya tiene en el mercado, en relación a los microcontroladores más modernos, el 8051 es uno de los de mayor popularidad hoy en día. Desde su invención, se han desarrollado muchos microcontroladores derivados y compatibles con el 8051. A continuación se dará una descripción de sus funcionalidades y características detalladamente, así como el set de instrucciones con ejemplos de sintaxis.

MUC 8051/52 1. Descripción y características arquitecturales El 8051 es un microcontrolador desarrollado por Intel en el año 1980 para su uso en productos embebidos, es decir, equipos de computación que realizan funciones dedicadas en sistemas de computación en tiempo real. Es un microcontrolador muy popular y su diseño es utilizado como base para la fabricación de otros microcontroladores de empresas diferentes a Intel, como Atmel, Dallas Semiconductor, Philips, Winbond, entre otros. El 8051 está basado en la arquitectura Harvard, lo que significa que en el existen espacios de direcciones separados para código y datos. Permite direccionar 64KB de ROM externa y 64KB de RAM a través de líneas separadas chip select para programa y datos. Contiene una memoria interna, la cual se divide en dos partes: los SFR y memoria de propósito general. Los SFR (Special Function Registers), son los registros proporcionados por el microcontrolador, y tienen asignadas direcciones en esta memoria interna. El acceso a la misma es más rápido que el acceso a la memoria externa, pero es de tamaño limitado. Parte de esta memoria interna además se usa como pila durante las llamadas a función y el proceso de interrupciones. También incluye una unidad de proceso booleano que permite que operaciones de nivel de bit lógica booleana se ejecuten de manera directa y eficientemente en registros internos. La mayoría de los 8051 incluyen una o dos UARTs, dos o tres temporizadores, 128 o 256 bytes de RAM interna, cuatro o cinco registros de entrada/salida y entre 0k-54K de memoria interna de programa. El núcleo 8051 original ejecuta un ciclo máquina cada 12 ciclos de reloj, requiriendo la mayoría de instrucciones uno o dos ciclos máquina. Pero actualmente la mayoría de fabricantes ofrecen versiones mejoradas que sólo requieren de 2 a 4 ciclos de reloj por cada instrucción máquina. El 8052 fue una versión mejorada del 8051, que incluye:    

256 bytes de RAM interna, en vez de 128 bytes 8 kB de ROM, en vez de 4 kB un tercer temporizador de 16-bit un segundo puerto serie

El 8051 tiene instrucciones de 8 bits de código de operación u opcode: • Existen 256 posibles instrucciones, de las cuales, 255 son implementadas. • Algunas instrucciones tienen uno o dos bytes adicionales para datos o dirección. • Hay 139 instrucciones de 1 byte, 92 instrucciones de 2 bytes, y 24 de 3 bytes. El 8051 es un dispositivo de 40 pines, de los cuales, 32 se usan para I/O.

Descripción de pines Pines 1-8: Puerto 1 – Cada uno de estos pines puede ser configurado como una entrada o como una salida. Pin 9: RS – Una lógica en este pin desactiva el microcontrolador y borra el contenido de la mayoría de los registros. Pines 10-17: Puerto 3 - Al igual que el puerto 1, cada uno de estos pines se puede usar como entrada o salida. Pero cada uno también tiene funciones alternativas. Pines 18,19: X2,X1 - Entrada y salida del oscilador interno. Un cristal de cuarzo que especifica la frecuencia de funcionamiento suele estar relacionado con estos pasadores. Pin 20: GND – Tierra.

Pines 21-28: Puerto 2 - Si no se requiere el uso de la memoria externa entonces estos pines se configuran como entradas/salidas generales. En caso de que se utilice la memoria externa, el mayor byte de direccionamiento, es decir, A8-A15 aparecerán en este puerto. Pin 29: PSEN - Si la ROM externa se utiliza para el almacenamiento de programa entonces un cero lógico (0) aparece en él cada vez que el microcontrolador lee un byte de la memoria. Pin 30: ALE – Este puerto se utiliza para transmisión de datos y direccionamiento. Antes de la lectura de la memoria externa, el microcontrolador pone el byte de dirección inferior (A0-A7) en P0 y activa la salida ALE. Pin 31: AE - Mediante la aplicación de cero lógico a este pin, P2 y P3 se utilizan para la transmisión de datos y de direcciones sin tener en cuenta si hay memoria interna o no. Pines 32-39: Puerto 0 - Al igual que P2, si no se utiliza la memoria externa, estos pines se pueden utilizar como entradas/salidas generales. De lo contrario, P0 se configura como salida de dirección (A0-A7) cuando se acciona el pin ALE alta (1) o como salida de datos (bus de datos) cuando el pin ALE es pulsado bajo (0). Pin 40: VCC – Fuente de alimentación de +5V.

2. Set de instrucciones del 8051/52 ACALL La instrucción ACALL llama a una subrutina ubicada en la dirección especificada. El PC se incrementa dos veces para obtener la dirección de la siguiente instrucción. El PC de 16 bits se almacena en la pila (byte de orden inferior primero) y el puntero de pila se incrementa dos veces. Ninguna bandera es afectada. Ejemplo: ACALL LABEL. ADD La instrucción ADD añade un valor de byte al acumulador y almacena los resultados de nuevo en el acumulador. Varios de los registros de la bandera se ven afectados. Ejemplo: ADD A, #03h ADDC La instrucción ADDC agrega un valor de byte y el valor de la bandera de acarreo al acumulador. Los resultados de la adición se almacenan de nuevo en el acumulador. Varios de los registros de la bandera se ven afectados. Ejemplo: ADDC A, #23h. AJMP Transfiere la ejecución del programa a la dirección especificada. La dirección está formada por la combinación de los 5 bits de orden superior de la dirección de la siguiente instrucción (por A15-A11), los 3 bits de orden superior del código de operación (por A10A8), y el segundo byte de la instrucción (para A7-A0). Ejemplo: AJMP LABEL. ANL La instrucción ANL realiza una operación AND bit a bit lógica entre el byte especificado o operandos bit y almacena el resultado en el operando destino. Ejemplo: ANL A, #3Fh. CJNE La instrucción CJNE compara los dos primeros operandos y salta al destino especificado si sus valores no son iguales. Si los valores son iguales, la ejecución continúa con la siguiente instrucción. Ejemplo: CJNE @R1, #24H, LABEL. CLR La instrucción CLR establece el operando destino especificado en un valor de 0. Ejemplo: CLR A. CPL La instrucción CPL complementa lógicamente el valor del operando destino especificado y almacena el resultado de vuelta en el operando destino. Los bits que anteriormente

contenían un 1 se cambiarán a un 0 y los bits que anteriormente contenía un 0 se cambiará a un 1. Ejemplo: CPL A. DA La instrucción DA ajusta el valor de ocho bits en el acumulador resultante de la adición anterior de dos variables (cada uno en formato empaquetado-BCD), la producción de dos dígitos de cuatro bits. Ejemplo: DA A. DEC La instrucción disminuye el operando especificado en 1. Un valor original de 00h a subdesborda 0FFh. No hay banderas se ven afectados por esta instrucción. Ejemplo: DEC @R1. DIV La instrucción DIV divide el entero sin signo de 8 bits en el acumulador por el entero sin signo de 8 bits en el registro B. Después de la división, el cociente se almacena en el acumulador y el resto se almacena en el registro B. Las banderas de acarreo y OV se borran. Ejemplo: DIV AB. DJNZ La instrucción DJNZ decrementa el byte indicado por el primer operando y, si el valor resultante no es cero, salta a la dirección especificada en el segundo operando. Ejemplo: DJNZ 40h, LABEL. INC La instrucción INC incrementa el operando especificado en 1. Un valor original de 0FFh o 0FFFFh desborda a 00h o 0000h. No hay banderas se ven afectados por esta instrucción. Ejemplo: INC @R0. JB La instrucción JB salta a la dirección especificada en el segundo operando si el valor del bit especificado en el primer operando es 1. El bit que se prueba no se modifica. No hay banderas se ven afectados por esta instrucción. Ejemplo: JB P1.2 LABEL JBC Esta instrucción salta a la dirección especificada en el segundo operando si el valor del bit especificado en el primer operando es 1. De lo contrario, la ejecución continúa con la instrucción siguiente. Ejemplo: JBC 44h.

JC La instrucción JC salta a la dirección especificada si la bandera de acarreo está establecida. De lo contrario, la ejecución continúa con la instrucción siguiente. No hay banderas que se vean afectadas por esta instrucción. Ejemplo: JC LABEL JMP La instrucción JMP transfiere la ejecución para la dirección generada sumando el valor de 8 bits en el acumulador con el valor de 16 bits en el registro DPTR. Ni el acumulador ni el registro DPTR se alteran. No hay banderas se ven afectados por esta instrucción. Ejemplo: @A+DPTR. JNB La instrucción JNB salta a la dirección especificada si el operando de bit especificado tiene un valor de 0. De lo contrario, la ejecución continúa con la instrucción siguiente. No hay banderas se ven afectados por esta instrucción. Ejemplo: P1.3, LABEL. JNC Transfiere el control del programa a la dirección especificada si la bandera de acarreo es 0. De lo contrario, la ejecución continúa con la instrucción siguiente. No hay banderas se ven afectados por esta instrucción. Ejemplo: JNC LABEL. JNZ Transfiere el control a la dirección especificada si el valor en el acumulador no es 0. Si el acumulador tiene un valor de 0, se ejecuta la siguiente instrucción. Ni el acumulador ni ninguna bandera se modifican mediante esta instrucción. Ejemplo: JNZ LABEL. JZ Transfiere el control a la dirección especificada si el valor en el acumulador es 0. De lo contrario, se ejecuta la siguiente instrucción. Ni el acumulador ni ninguna bandera son modificados por esta instrucción. Ejemplo: JZ LABEL. LCALL La instrucción LCALL llama a una subrutina ubicada en la dirección especificada. Esta instrucción suma primero 3 a la PC para generar la dirección de la siguiente instrucción. Este resultado se inserta en la pila byte bajo primero y el puntero de pila se incrementa en 2. Los de orden superior y de orden inferior bytes del PC se cargan desde el segundo y tercer bytes de la instrucción, respectivamente. La ejecución del programa se transfiere a la subrutina en esta dirección. Ejemplo: LCALL SUB1. LJMP Transfiere la ejecución del programa a la dirección de 16 bits especificado. El PC se carga con los de orden superior y de orden inferior bytes de la dirección de la segunda y tercera

bytes de esta instrucción, respectivamente. No hay banderas se ven afectados por esta instrucción. Ejemplo: LJMP LABEL. MOV La instrucción MOV mueve bytes de datos entre los dos operandos especificados. El byte especificado por el segundo operando se copia en la ubicación especificada por el primer operando. El byte de datos de origen no se ve afectado. Ejemplo: MOV @R0, A. MOVC La instrucción MOVC mueve un byte desde el código o la memoria del programa para el acumulador. Ejemplo: MOVC A, @A+DPTR. MOVX Transfiere datos entre el acumulador y la memoria de datos externa. La memoria externa se puede abordar a través de 16-bits en el registro DPTR oa través de 8-bits en los registros R0 o R1. Al utilizar 8 bits de direccionamiento, el puerto 2 debe contener el byte de orden superior de la dirección. Ejemplo: MOVX @R0, A. MUL La instrucción MUL multiplica el entero sin signo de 8 bits en el acumulador y el entero sin signo de 8 bits en el B la producción de un producto de 16 bit de registro. El byte de orden inferior del producto se devuelve en el acumulador. El byte de orden superior del producto se devuelve en el registro B. La bandera OV se establece si el producto es mayor que 255 (0FFh), de lo contrario, se restablece. La bandera de acarreo está siempre desactivada. Ejemplo: MUL AB. NOP La instrucción NOP no hace nada. La ejecución continúa con la siguiente instrucción. No hay registros o banderas que se ven afectados por esta instrucción. NOP se utiliza típicamente para generar un retraso en la ejecución o para reservar espacio en la memoria de código. Ejemplo: NOP. ORL La instrucción ORL realiza una operación lógica OR bit a bit de los operandos especificados, el resultado de que se almacena en el operando de destino. Ejemplo: ORL A, #01h POP La instrucción POP lee un byte de la dirección indirecta hace referencia el registro SP. El valor leído se almacena en la dirección especificada y el puntero de pila se decrementa. No hay banderas se ven afectados por esta instrucción. Ejemplo: POP 34h.

PUSH La instrucción PUSH incrementa el puntero de pila y almacena el valor del operando de bytes especificada en la dirección de la memoria RAM interna indirectamente referenciado por el puntero de pila. No hay banderas se ven afectados por esta instrucción. Ejemplo: PUSH A. RET La instrucción RET hace estallar los de orden superior y de orden inferior bytes de la PC de la pila (y disminuye el puntero de pila por 2). La ejecución del programa se reanuda desde la dirección resultante, que normalmente es la instrucción que sigue a un ACALL o instrucción LCALL. Ejemplo: RET. RETI La instrucción RETI se utiliza para terminar una rutina de servicio de interrupción. Esta instrucción hace estallar los de orden superior y de orden inferior bytes del PC (y disminuye el puntero de pila por 2) y restaura la lógica interrput aceptar interrupciones adicionales. No hay otros registros se ven afectados por esta instrucción. Ejemplo: RETI. RL La instrucción RL gira los ocho bits en el acumulador de la izquierda una posición de bit. El bit 7 del acumulador se hace girar en el bit 0, bit 0 en el bit 1, bit 1 en el bit 2, y así sucesivamente. No hay banderas se ven afectados por esta instrucción. Ejemplo: RL A. RLC La instrucción RLC gira los ocho bits en el acumulador y el bit de la bandera de acarreo dejó una posición de bit. El bit 7 del acumulador se hace girar en la bandera de acarreo mientras que el valor original de la bandera de acarreo se hace girar en el bit 0 del acumulador. El bit 0 del acumulador se hace girar en el bit 1, bit 1 en el bit 2, y así sucesivamente. Ejemplo: RLC A. RR La instrucción RR gira los ocho bits en el acumulador de la derecha de posición un poco. El bit 0 del acumulador se hace girar en el bit 7, el bit 7 en el bit 6, y así sucesivamente. No hay banderas se ven afectados por esta instrucción. Ejemplo: RR A. RRC La instrucción RRC gira los ocho bits en el acumulador y el bit de la bandera de acarreo derecha posición de un bit. El bit 0 del acumulador se hace girar en la bandera de acarreo mientras que el valor original de la bandera de acarreo se hace girar en el bit 7 del acumulador. El bit 7 del acumulador se hace girar en el bit 6, el bit 6 en el bit 5, y así sucesivamente. Ejemplo: RRC A.

SETB La instrucción SETB establece el bit operando a un valor de 1. Esta instrucción puede funcionar con la bandera de acarreo o cualquier otro bit directamente direccionable. Ejemplo: SETB 63h. SJMP La instrucción SJMP transfiere la ejecución a la dirección especificada. La dirección se calcula sumando el desplazamiento en el segundo byte de la instructoin a la dirección de la siguiente instrucción relativa firmado. Ejemplo: SJMP LABEL. SUBB La instrucción SUBB resta la variable de bytes especificada y la bandera de acarreo desde el acumulador. El resultado se almacena en el acumulador. Esta instrucción establece la bandera de acarreo si necesita un préstamo para el bit 7 del resultado. Si no se necesita pedir prestado, la bandera de acarreo se borra. Ejemplo: SUBB A, #01h. SWAP La instrucción SWAP intercambia los bocaditos de bajo orden y de orden superior dentro del acumulador. Ejemplo: SWAP A. XCH La instrucción XCH carga el acumulador con el valor del byte del operando especificado mientras al mismo tiempo almacenar el contenido previo del acumulador en el operando especificado. Ejemplo: XCH A, @R0. XCHD La instrucción XCHD intercambia el nibble de orden inferior del acumulador con el cuarteto de orden inferior de la posición de la RAM interna especificada. La RAM interna se accede indirectamente a través de R0 o R1. Ejemplo: XCHD A, @R1. XRL La instrucción XRL realiza una operación lógica OR exclusiva entre los operandos especificados. El resultado se almacena en el operando de destino. Ejemplo: XRL A, #0FFh.

3. Clasificación de las instrucciones o o o o o

Aritméticas: ADD, ADDC, SUBB, INC, DEC, MUL, DIV, DA, XCH, XCHD, NOP. Lógicas: ANL, ORL, XRL, CLR, CPL, RL, RR, RRC, RLC, SWAP, SETB. Control: JC, JNC, JB, JNB, JBC, JZ, JNZ, AJMP, LJMP. Transferencia de datos: MOV, MOVX, MOVC, PUSH, POP. Manipulación de bits: CLR, SETB, CPL, MOV, ANL, ORL.

4. Modos de direccionamiento o Directo En el direccionamiento directo, se indica la dirección a operar de forma absoluta. Para la familia de microcontroladores 8051, se dispone de 256 direcciones directas, correspondientes a (RAM interna + Registros SFR). o Por registro Para el direccionamiento por registro, el código de la operación (Opcode) contiene la información del registro a operar, del banco de registros seleccionado. o Indirecto Se especifica un registro que contiene la dirección del dato a operar. R0, R1, cuando se accede a la memoria interna de direccionamiento indirecto 256 bytes. DPTR para el acceso a la memoria externa 64K Bytes. o Implícito La instrucción indica implícitamente el registro sobre el que se ha de operar. o Inmediato El Opcode está seguido de una constante que representa el valor con el que se operará. o Indexado Se utilizan dos registros para apuntar a la dirección que contiene el dato. La suma del contenido del DPTR más el acumulador determina la dirección a operar.

Conclusión Finalizada la elaboración de este reporte, se tiene una perspectiva mucho mejor acabada sobre un microcontrolador, de lo que son sus características y operaciones más importantes. Específicamente se presentó el microcontrolador 8051/52 de Intel, y este representa la base para la fabricación de muchos otros microcontroladores que le sucedieron, por ello se puede relacionar su funcionamiento y cualidades con la de los demás. Se pudo notar el amplio set de instrucciones que un programador debe manejar para poder trabajar con el mismo, y estas instrucciones se pueden dividir o clasificar en diversos grupos, esto debido a que realizan funciones similares, como por ejemplo, aritméticas, lógicas, de control, transferencia de datos, etc. También se destacaron los modos de direccionamiento de este microcontrolador, que básicamente se refiere a la forma en la que opera el dispositivo al manejar las instrucciones, ya sea de manera directa, indirecta, implícita, por registro, etc.

Bibliografía o http://www.keil.com/support/man/docs/is51/is51_instructions.htm o http://www.alciro.org/alciro/microcontroladores-8051_24/modosdireccionamiento_233.htm o http://es.wikipedia.org/wiki/Microcontrolador

o http://es.scribd.com/doc/58762580/Set-de-Instrucciones-Intel-8051