Curso de microcontrolador MCS51

86
Curso de Microcontroladores I Contenido: 1 Portada. 2 Temario. 3 Manual del Curso. 4 Anexos

description

Un manual muy bueno de microcontroladores de la familia MCS51, del M.C. Eduardo Sánchez Arellano que puede servir como referencia para el micro AT89S8252

Transcript of Curso de microcontrolador MCS51

Page 1: Curso de microcontrolador MCS51

Curso de Microcontroladores I

Contenido: 1 Portada. 2 Temario. 3 Manual del Curso. 4 Anexos

Page 2: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 2-

Contenido Capitulo 1. La familia MCS-51

1.1. Características de la familia 1.2. Características de los Microcontroladores 8051 1.3. Pinout de los Microcontroladores Intel 1.4. Características de las memorias EPROM integradas en los Microcontroladores 8751.

1.4.1. Introducción 1.4.2. Programación de la EPROM Interna. 1.4.3. Sistema de protección de la información en la EPROM Interna. 1.4.4. Borrado de la información en la EPROM Interna.

Capitulo 2. Configuración de la memoria en el Microcontrolador 8751

2.1. Memoria de programa y datos. 2.2. Memoria de programa. 2.3. Memoria de datos. 2.4. Area de direccionamiento sólo indirecto. 2.5. Area de direccionamiento directo e indirecto. 2.6. Area de registros o funciones especiales 2.7. Operación Reset.

Capitulo 3. Programación de los Microcontroladores

3.1. Introducción 3.2. Modos de direccionamiento 3.3. Ciclo de instrucción 3.4. Tipo de instrucciones 3.5. Instrucciones aritméticas. 3.6. Instrucciones lógicas. 3.7. Instrucciones de transferencia ó movimiento de datos.

3.7.1. Transferencia de datos sobre la RAM interna 3.7.2. Transferencia de datos sobre la RAM externa. 3.7.3. Memoria de programas para el tratamiento de tablas

3.8. Instrucciones Booleanas 3.9. Instrucciones de salto.

3.9.1. Instrucciones de salto incondicional. 3.9.2. Instrucciones de salto condicional.

3.10. <<SET>> de instrucciones de la familia MCS-51 Capitulo 4. Presentación del software y equipo para el desarrollo de aplicaciones

4.1. Introducción 4.2. El Macroensamblador: 4.3. Operaciones del editor. 4.4. Operaciones de ensamblado. 4.5. Operaciones de Encadenado. 4.6. Operaciones de Simulación 4.7. Ejecución y estudio de programas en el Macroensamblador.

Capitulo 5. Control de puertos de Entrada/Salida.

5.1. Introducción 5.2. El Microcontrolador como Microprocesador. 5.3. Operaciones de escritura en los puertos del Microcontrolador. 5.4. El puerto P0 en modo salida. 5.5. Operaciones de lectura en los puertos. 5.6. Control de procesos Industriales básicas. 5.7. Control del LCD. 5.8. Control del Teclado. 5.9. Adquisición de datos mediante ADC

Capitulo 6. Interrupciones.

7.1. Introducción. 7.2. Tipos de Interrupciones. 7.3. Proceso de interrupción en los Microcontroladores. 7.4. Niveles de prioridad. 7.5. Interrupciones externas. (INT0) e (INT1) 7.6. Interrupciones internas producidas por Timer 0 y1.

Capitulo 6. Temporizadores y Contadores.

6.1. Introducción 6.2. Timer 0 (T0) y Timer 1 (T1). 6.3. Temporizador/Contador de 13 y 16 bit, arranque por software. 6.4. Programas.

Page 3: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 3-

Capitulo 1 INTRODUCCIÓN A LOS MICROPROCESADORES

1.1 LA EVOLUCION DEL MICROPROCESADORES

Antes de comenzar a analizar los microprocesadores modernos, se debe primero

entender qué fue lo que puso a estos dispositivos en los primeros años. La historia dice que

Se construyeron gigantescas máquinas computadoras en las décadas de 1940 y 1950,

construidas con relevadores y tubos de vacío (bulbos). Más adelante, se utilizaron los

transistores y los componentes electrónicos de estado sólido para construir las poderosas

computadoras de la década de 1960. Con el advenimiento, de los circuitos integrados se

llegó al perfeccionamiento del microprocesador y de los sistemas de microcomputadoras.

El microprocesador de 4 bits

En 1969, Intel Corporation y el talento creativo de Marcian E. Hoff lanzaron el primer

microprocesador: el 4004, de 4 bits. Este microprocesador, programable en un solo

encapsulado era insuficiente, según las normas actuales, porque sólo direccionaba 4096

localidades de 4 bits en la memoria. El 4004 contenía un conjunto de instrucciones que

ofrecían sólo 45 instrucciones diferentes. Como consecuencia, el 4004 sólo se podía emplear

en aplicaciones limitadas, como en los primeros juegos de vídeo y en controladores

pequeños basados en microprocesadores. Cuando surgieron aplicaciones más complejas

para el microprocesador, el 4004 resultó inadecuado.

El microprocesador de 8 bits

Más tarde, en 1971, al percatarse que el microprocesador era un producto, viable

para, comercialización, Intel Corporation produjo el 8008, el primer microprocesador de 8

bits. El tamaño ampliado, de la memoria (16K * 8) y las instrucciones adicionales (un total

de 48). Con este nuevo microprocesador brindaron la oportunidad de muchas aplicaciones

más avanzadas (1K es igual a 1024 y un byte es un número de 8 bits).

Conforme los ingenieros desarrollaban usos más demandantes para el

microprocesador, la memoria y el juego de instrucciones del 8008 pronto limitaron su

utilidad. Por tanto, en 1973, Intel Corporation introdujo el 8080, el primero, de los

microprocesadores modernos de 8 bits. Pronto, otras empresas empezaron a lanzar sus

Page 4: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 4-

propias versiones de los procesadores de 4 y de 8 bits. En la tabla 1-1 se enumera muchos

de estos primeros microprocesadores.

MICROPROCESADORES DE 8 BIT.

AÑO MICRO COMENTARIOS

1969 Intel 4004 No fue un producto comercial.

1971 Intel 8008 Primer microprocesador de 8 bits.

1973 Intel 8080 Surge la industria de las microcomputadoras.

1974 Motorola 6800 Primer micro de Motorola.

1975 Zilog Z80 Aparece el sistema operativo CP/M.

1976 Intel 8085 Mostek 6502

Aparece Apple iniciando el auge de las microcomputadoras.

1978 Motorola 6809 Mejor micro de 8 bit.

Tabla 1-1

UNIDAD CENTRAL DE PROCESAMIENTO (CPU).

El CPU es el corazón de la µC, es el encargado de decodificar las instrucciones, hacer más

eficientes las operaciones aritméticas, y controlar algunas otras partes de la maquina.

Cuenta con cuatro partes básicas.

(1) Registros,

(2) Unidad Aritmética y lógica,

(3) Circuito de temporización y control.

(4) Circuito de Decodificación.

Los Registros: Son localizaciones que sirven para almacenar temporalmente datos,

pueden ser de 8 o de 16 bits. Los tres registros más usados son, el acumulador para

propósito general, el contador de programa y el registro de instrucciones que son de

(1) Acumulador. (ACC)

Reg de Instrucción.

Contador del Programa

Decodificadorde Instruccion

(4)

Timing andControl.

(3)

(2)Unidad

Aritmetica.y Logica.

(ALU)

Page 5: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 5-

propósito específico. El acumulador almacena temporalmente el resultado de las

operaciones aritméticas y lógicas. El registro de Instrucciones es usado para almacenar la

instrucción que se está ejecutando en ese momento por el microprocesador. El contador de

Programa contiene la dirección de la siguiente instrucción del programa.

El circuito de decodificación: Involucra el proceso de trasladar un patrón binario

en una operación o secuencia de operaciones. Por ejemplo si el siguiente patrón binario

10111001 representa “ADD”, el circuito de decodificación lo reconoce y manda señales a

todas las otras partes del µP para que ocurra la decodificación.

El Circuito de temporizador y control: Es una red secuencial que acepta un

código que define la operación que se va a ejecutar y luego prosigue a través de una

secuencia de estados, generando una correspondiente secuencia de señales de control.

Estas señales de control incluyen el control de lectura - escritura y señales de dirección de

memoria válida en el bus de control del sistema. Otras señales generadas por el controlador

se conectan a la unidad aritmética - lógica y a los registros internos del procesador para

regular el flujo de información en el procesador y a, y desde, los buses de dirección y de

datos del sistema.

La unidad aritmético-lógica (ALU, Arithmetic-logic unit): es una red

combinacional. Acepta dos palabras de datos y una palabra de control que especifica el tipo

de operación que ha de ejecutarse con los datos. El bus de datos del sistema o cualquiera

de los registros internos del procesador pueden proporcionar palabras de datos. La palabra

de control se define por la unidad de control. La ALU realiza la operación especificada y

genera una palabra de salida que representa el resultado de la operación aritmética o lógica

y un conjunto de señales de estado que indican, por ejemplo, si se produjo un acarreo o

desbordamiento aritmético. La palabra resultado se puede dirigir a cualquiera, de los

registros internos o al bus de datos. El destino específico se define por la unidad de control,

dependiendo de la naturaleza de la Operación que se esta realizando. Las señales de estado

se dirigen a un registro interno específico del procesador para almacenamiento, denominado

registro de códigos de condición.

Page 6: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 6-

1.2 “Arquitectura de los Microprocesadores”

El Acumulador: almacena datos para procesar por la ALU. Suelen tener el mismo

número de bits que el bus de datos. El acumulador se utilizan con el bus de datos y la ALU

en el proceso de datos. Por ejemplo, dos palabras binarias se pueden sumar, cargando la

primera en el acumulador A, sumando la segunda, cargando el resultado en el acumulador y

después transfiriendo los resultados desde el Acumulador, a la memoria. Durante la

transferencia de los primeros datos, el bus de datos sirve como una entrada al Acumulador.

Durante la segunda, la ALU realiza una suma en la que el bus de datos proporciona una

entrada y el acumulador A la otra; la salida de la ALU se conecta a la entrada del

acumulador A para almacenar el resultado. Durante la tercera operación, la salida del

Acumulador se conecta al bus de datos, de modo que los resultados se transfieren a

memoria.

Page 7: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 7-

El contador de programa (PC): Es un registro de 16 bits que contiene la dirección

de la palabra siguiente del programa. Su salida se conecta al bus de direcciones siempre

que una palabra del programa se lea desde la memoria. Cada vez que el contador de

programa proporciona una dirección, se modifica de modo que contiene siempre la dirección

de la palabra siguiente del programa.

El puntero de pila (SP, stack pointer): El puntero de pila es, un registro de

autoincrementación y autodecrementación, que significa que cada vez que se proporciona

un dato su contenido se incrementa o decrementa automáticamente. En los

microprocesadores, el puntero de pila contiene la dirección de la siguiente posición de

memoria vacía en la pila. A continuación, proporciona esta dirección al bus de direcciones

durante un ciclo del bus de lectura. La pila se utiliza de muchos modos; por ejemplo, se

utiliza para almacenar la dirección de retorno cuando las transferencias de control a

subrutinas o rutinas de interrupción de servicios.

El registro de códigos de condición: (PSW) ó (CCR) Almacena la información

que describe los resultados de operaciones anteriores. Esta información se almacena

asignando un bit en el registro. En algunos microprocesadores, el registro del código de

condición. Contiene ocho bits, El bit menos significativo es el bit de acarreo, o bit C, que se

pone a 1 cuando se produce un acarreo aritmético. El bit de desbordamiento, o bit V, se

pone a 1 si se produce un desbordamiento. El bit cero, o bit Z, el tercer bit en el registro de

códigos de condición se pone a 1 cuando se produce el resultado cero. El bit negativo, o bit

N, se pone a 1 cuando el resultado es negativo. El bit de semi acarreo, o bit H, se pone a 1

cuando se produce un acarreo desde el bit 3. El bit H se utiliza con cálculos aritméticos con

datos codificados en BCD. Los bits C, V, Z, N y H se ponen a 1, o a 0, automáticamente por

el procesador, dependiendo de la naturaleza de la operación que se está ejecutando y el

resultado de está operación, además, los bits C, V e I pueden ser puestos a 1, o a 0, por el

programador utilizando instrucciones especiales para cada bit.

Page 8: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 8-

Capitulo 2 Introducción a los Microcontroladores Intel

• Antecedentes históricos.

En el año de 1971 cuando surge el primer microprocesador de 4 Bit Intel, las técnicas de

diseño de los equipos de instrumentación y control sufrieron un cambio. Los fabricantes de

microprocesadores, conscientes de la importancia de este mercado, pusieron a disposición

de los ingenieros una gran variedad de circuitos integrados complementarios los cuales

constituyen, para cada fabricante, su familia.

Figura 2.1

n el año de 1976, gracias al aumento en la densidad de integración, salió a la luz la

primera computadora en un chip, es decir, se integraron junto con el

microprocesador los subsistemas que anteriormente formaban unidades

especializadas e independientes, pero unidas por las pistas de circuitos impresos con el

microprocesador formando lo que se conoce como sistema mínimo. A este nuevo circuito

integrado se le denominó MICROCONTROLADOR.

No hay duda que disponer de un chip que cuente con tantos subsistemas, es un gran

avance y consecuentemente muy rentable.

Los MICROCONTROLADORES INTEL de 8 Bit que estudiaremos en esta unidad integran

los siguientes subsistemas.

♦ Un CPU de 8 bit.

♦ 256 Byte de RAM interna.

E

Page 9: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 9-

♦ 4 Kbyte de ROM(8051) ó EPROM(8751) interna.

♦ 4 Puerto de Entrada /Salida.

♦ 2 Contadores y temporizadores de 16 bits.

♦ Circuito de reloj incorporado.

♦ Bajo consumo de corriente(power down) en las versiones CHMOS.

♦ Alta inmunidad al ruido eléctrico.

♦ Ampliación del set de instrucciones con algunas muy potentes para la adquisición y

tratamiento de datos, tablas, multiplicación, división, etc.

♦ Instrucciones lógicas y de brinco orientadas al proceso de señales bit a bit

(procesador booleano).

♦ Espacios de la memoria de programa y de datos separadas (memoria segregada).

♦ Protección de la memoria de programas (encriptación).

♦ Comunicación serie estándar con otros sistemas. Tipo Full-Duplex.

♦ 5 interrupciones programables con niveles de prioridad.

En estos momentos los MICROCONTROLADORES de 8 bits son el estándar para

aplicaciones en controladores de mediana complejidad, por su facilidad de manejo y su alto

nivel de prestaciones.

Además la arquitectura permite que el MICROCONTROLADOR sea utilizado como

Microprocesador. Naturalmente esto trae como consecuencia una reducción de su capacidad

autónoma de controlar periféricos a través de sus puertos.

MICROCONTROLADORES INTEL 8XXX

Características de la Familia de MICROCONTROLADORES Intel.

Con ROM sin ROM con EPROM ROM RAM TIMER TECNO

8048AH 8040AH P8748H 1K 64 1 HMOS

8049AH 8039AHL P8749H 2K 128 1 HMOS

8050AH 8035AHL No Existen 4K 256 1 HMOS

8051 8031 8751 4 K 128 2 HMOS

8051AH 8031AH 8751H 4 K 128 2 HMOS

8052AH 8032AH 8752BH 8 K 256 3 HMOS

80C51BH 80C31B 87C51 4 K 128 2 CMOS

TABLA 2.1

Page 10: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 10-

ARQUITECTURA BASICA DE LOS MICROCONTROLADORES 8051

FIGURA 2.2

DIAGRAMA GENERAL DE LOS MICROCONTROLADORES 8031-8051-8751

FIGURA 2.3

Page 11: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 11-

PINOUT DEL 8XX1

FIGURA 2.4

Descripción de los pines: Vcc: Voltaje de alimentación positiva (+5 Volts.) Vss: Conexión a tierra (0 volts). PUERTOS: Los MICROCONTROLADORES 8051 tienen 4 puertos de 8 bits bidireccionales (P0, P1, P2 y P3). Esto quiere decir que pueden programarse y operar como entrada o salida.

Page 12: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 12-

PUERTO 0(P0): Se encarga de multiplexar en el tiempo por sus 8 líneas la parte baja del Bus de direcciones durante el acceso a la memoria externa, y el Bus de datos. PUERTO 1(P1): Este puerto además de ser de proposito general también recibe la parte baja de direcciones, durante la programación y verificación de la memoria EPROM interna. PUERTO 2 (P2): El puerto 2 emite la parte alta del Bus de direcciones en los accesos de memoria externa cuando utilizan 16 bits de dirección (MOVX @DPTR, A). Durante el acceso a la memoria de datos externa con direccionamiento de 8 bits (MOVX @R1,A), los pines del Puerto 2 emiten el contenido del registro P2 del SFR (Registro de funciones especiales). PUERTO 3 (P3): Este puerto puede usarse para propósito general cuando trabaja como microcontrolador pero tiene otras funciones especiales cuando trabaja como microprocesador o con acceso a memoria de datos externa, como se muestra en la sig. Tabla.

Pin Descrip Funciones 10 P3.0 RXD (Entrada puerto Serie) 11 P3.1 TXD (Salida puerto serie) 12 P3.2 INTO (Interrupción 0. Externa) Neg. 13 P3.3 INT1 (Interrupción 1. Externa) Neg 14 P3.4 T0 (Entrada externa. Timer 0) 15 P3.5 T1 (Entrada externa. Timer 1) 16 P3.6 WR (Autorización escritura de datos) Neg. 17 P3.7 RD (Autorización escritura de datos) Neg.

TABLA 2.2

ALE/PROG: (Address Latch Enable) es un pulso que emite el MICROCONTROLADOR para

amarrar el <<byte bajo>> del Bus de direcciones en el acceso a la memoria externa. ALE

se emite con una frecuencia de 1/6 de la frecuencia de emisión del reloj.

PROG: Es el pin de entrada de los pulsos de programación de la memoria EPROM lo utiliza

solamente el programador de micros.

PSEN: Es la señal de strobe para leer en la memoria de <<programa externo>>. La

memoria externa tiene dos modalidades, de programa y de datos. Para diferenciarlas, utiliza

la señal PSEN. PSEN no se activa cuando se está ejecutando el programa de la ROM o

EPROM interna.

EA/VPP: (External Access), cuando se mantiene un nivel alto, se ejecuta sólo el programa

de la EPROM interna, a menos que el contador de programa exceda de FFF (4K) para el

8751. Si EA se mantiene un nivel bajo, se ejecuta el programa de la memoria externa

siempre, independientemente de la dirección del programa.

Page 13: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 13-

Es decir cuando EA=1 actúa como MICROCONTROLADOR.

EA=0 actúa como MICROPROCESADOR.

VPP: Es la tensión de programación de la EPROM.

XTAL1 y XTAL2: Son la entrada y salida respectivamente, de un amplificador inversor que

puede ser configurado para su uso como un chip oscilador. Se puede utilizar indistintamente

un cristal de cuarzo o un resonador cerámico.

RESET: Señal de inicialización del sistema. Un reset interno al sistema se produce cuando

se pone el pin RST a un nivel alto durante un cierto tiempo, esto se logra de modo

automático conectando el pin RST a Vcc mediante un capacitor de 10 µF y a tierra medinte

una resistencia de 8.2 kΩ .

Los microcontroladores CHMOS no requieren esta resistencia devido a que cuentan con un

pulldown interno en el pin de reset, el capacitor puede ser reemplazado por uno de 1 µF.

Page 14: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 14-

CARACTERÍSTICAS DE LA EPROM INTERNA. El 8751 cuenta con una memoria EPROM de 4K bytes que se programa a un voltaje

de VPP=21v, con unos pulsos de 50ms, por byte a través de la línea PROG. Considerando

que el 8751 tiene 4 Kbytes de memoria, tardaria 4 minutos en su programación.

Con un algoritmo de programación <<QUIK-PULSE>>, que permite programar estos

dispositivos con una tensión de VPP=12.75v y una serie de 25 pulsos de 100µs por cada

byte programado por la línea PROA, Este tiempo de programación se reduciria a 13s.

SISTEMAS DE PROTECCION DE LA INFORMACIÓN PROGRAMADA EN LA EPROM

Para proteger el programa grabado en la EPROM contra la piratería se han establecido

dos niveles de protección.

• Nivel 1 de protección: Cadena de encriptación (ancryption array).

Dentro de la memoria EPROM hay 32 bytes que forman la cadena de encriptación, que

inicialmente esta desprogramada. Cada vez que un byte es direccionado durante la

verificación, se utilizan 5 líneas de dirección para seleccionar al byte de la cadena de

encriptación. Este byte es sometido a la operación lógica XNOR con el código byte de

información creando un byte encriptado. Si la cadena de encriptación está desprogramada

(todos los bit a UNO), al efectuar la operación XNOR con el dato éste no resultara

modificado y podrá ser leído fácilmente.

• Nivel 2 de protección: Bit cerrojo (lock bits).

También en el micro hay dos bit cerrojo que pueden ser programados (P) o desprogramados

(D) para obtener los resultados que se indican en la siguiente tabla de características.

Bit 2 Bit 1 Características D D • Funcionamiento sin protección D P • No se permite acceder externamente a los códigos de la memoria de programa

interno. • Además no se permite ser programada.

P P • Externamente no puede accederse a la información de la memoria de programa interno.

• No permite ser programada. • No permite la verificación del programa.

Al borrar la EPROM también se borra la cadena de encriptacón y los bits cerrojo, lo

que permite al usuario una nueva reprogramación.

Page 15: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 15-

Borrado de la información programada en la EPROM

El borrado de la EPROM se produce cuando el Microcontrolador es expuesto a una luz

con una longitud de onda corta entre 2000 y 4000 Angstroms. La exposición a la luz del sol

y a la luz artificial de un tubo fluorescente, que tienen longitud de onda dentro de este

rango, durante un tiempo prolongado puede causar el borrado accidental de la memoria

EPROM. Se recomienda que se coloque una etiqueta opaca en la ventana, que sirva al

mismo tiempo para proteger de la luz y sirva para identificar el programa, la versión y la

fecha de grabación.

Para iniciar el borrado de la EPROM, se recomienda su exposición a la luz de una

lampara ultravioleta (2,537 Angstoms) de 12,000 µW/cm2, durante 10 a 15 minutos, a una

distancia de la ventana de la EPROM de 2 a 3 centímetros.

Los nuevos Microcontroladores con tecnologuia flash se borran en el mismo

programador sin necesidad de exponerlos a la luz ultravioleta.

Page 16: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 16-

Capitulo 3

ORGANIZACIÓN DE LA MEMORIA EN EL Microcontrolador 8751.

MEMORIA DE PROGRAMAS Y MEMORIA DE DATOS.

Los MICROCONTROLADORES 8751 tienen separados los espacios de direcciones para

memoria de programa y memoria de datos.

La memoria de programa sólo puede ser leída y tiene como máximo 64K byte

externos. (Internamente el 8751 es de 4K byte). La señal de autorización de lectura en la

memoria de programa externa es PSEN. El pin EA del MICROCONTROLADOR puesto a Vcc

(+5V) indica que el puntero de programa busca direcciones desde la posición de memoria

0000H hasta la 0FFFH de la memoria interna y de la 1000H a la FFFFH, en la memoria

externa. Si el pin EA es puesto a Vss(0v), la búsqueda de direcciones del programa se dirige

a la memoria externa en todo momento.

MEMORIA DE PROGRAMA

En la parte baja de la memoria de programa se encuentran ciertas posiciones de

memoria especiales asignadas por el fabricante para el tratamiento de las rutinas de

interrupciones.

Page 17: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 17-

FUENTE DE INTERRUPCION DIRECCIONES DEL VECTOR 0FFFH Flag que se activan RI Y TI 0023H...PUERTO SERIE TF1 001BH...INT TIMER 1 IE1 0013H... INT EXTERIOR 1 TF0 000BH...INT TIMER 0 IE0 0003H...INT EXTERIOR 0 RESET 0000H... RESET

Tabla 3.1

Una interrupción puede ser provocada de manera externa o de manera interna, es

decir puede ser producida por un periférico externo o por software. La interrupción con más

prioridad es RESET la cual no puede ser enmascarada.

Cuando un RESET ocurre el programa comienza a partir de la dirección 0000H, del

programa.

Cuando una interrupción es producida, el Contador de Programa (PC) almacena

su contenido temporalmente dentro del SP (apuntador de apilamiento) y se carga con la

dirección de la localidad donde se encuentra la rutina de servicio de la interrupción

correspondiente. Una vez posicionado en esa localidad deberá de comenzar la ejecución de

la rutina de servicio, hasta que encuentre la instrucción RETI, que le permitirá al PC

recuperar nuevamente su valor original almacenado en el SP, y continuar con el programa

anterior a la interrupción.

Por ejemplo a la interrupción 0, se le asigna la localidad 0003H, si la interrupción no

se utiliza, esta localidad puede utilizarse para propósitos generales del programa, si la

interrupción ha sido permitida, (estableciendo el bit correspondiente dentro del

registro de control IE), en el momento que exista una activación de la interrupción (estado

bajo en la línea INT0) el PC se cargará con 0003 y saltará a esa localidad para comenzar a

ejecutar la rutina de servicio.

Como se puede observar en la Tabla 1 Anterior el intervalo físico entre dos

interrupciones es de 8 bytes, espacio capaz de albergar una pequeña rutina, pero si éste no

fuera suficiente se desviaría el contador del programa (PC) mediante una instrucción de

salto (JMP) a una zona amplia de la memoria de programa capaz de contener dicha rutina.

Como se ha dicho la memoria de programa puede ser interna (en el propio micro) ó

externa (en otro chip). La selección se realiza por hardware, con la señal EA (External

Access). Conectado a Vcc ó Vss respectivamente.

Page 18: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 18-

El hardware de configuración del Microcontrolador como Microprocesador utilizando

memoria de programa externa se muestra en la Fig. 2

Se puede observar en al Figura 2 que las 16 líneas de dirección corresponden al

Puerto 0 y al Puerto 2, que están dedicados como bus de direcciones; aun más el Puerto 0

sirve como bus de direcciones y bus de datos multiplexado en el tiempo. Esta operación

característica de la familia de Microprocesadores Intel, se realiza de la forma siguiente.

Figura 3.2

• El Puerto P0 emite el <<byte bajo>> del contador del programa PC (PCL). Una vez

estabilizada la señal sobre P0, la señal ALE (Address Latch Enable) introduce esta

dirección dentro del circuito integrado latch 74LS373, que pasa a apuntar la dirección de

la memoria externa de programas. Al mismo tiempo que el Microcontrolador emite el

PCL por P0, la parte alta del contador del programa (PCH) se emite por P2. Entonces

PSEN autoriza la lectura al Microcontrolador del código de instrucción a través del Puerto

P0. En las siguiente Fig. se muestra el funcionamiento y diagramas de tiempos de esta

operación.

Page 19: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 19-

Figura 3.3

CICLO MAQUINA:

Un ciclo maquina, para esta familia de Microcontroladores, consiste en una secuencia

de 6 <<estados>>, nombrados S1 a S6. Cada estado esta formado dos periodos de la señal

de reloj que se denominan <<fases>> (fase 1 y fase 2). Teniendo en cuenta que cada ciclo

maquina tiene 12 periodos (6 estados por 2 fases), si el oscilador genera una señal de reloj

de una frecuencia de 12 Mhz, la duración del ciclo maquina será de 1 µsegundo.

La secuencia de búsqueda/ejecución son las mismas, sea la memoria de programas

interna o externa al Microcontrolador; es decir, los tiempos de ejecución no dependen de

que se utilice la memoria interna o externa.

Page 20: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 20-

La figura 2.3 muestra el diagrama de tiempos de las señales implicadas en la secuencia de

búsqueda, cuando la memoria de programa es externa. La señal PSEN se activa dos veces

por ciclo de maquina, para autorizar la lectura en la memoria de programa. Si se produce

un acceso a la memoria de datos, como se muestra en la figura 3.4, no se emiten los dos

impulsos PSEN, puesto que el acceso a la memoria de datos no los necesita ni utiliza.

Observe como el acceso a la memoria de datos toma dos ciclos más de BUS que la

memoria de programas. Las figuras 3.3 y 3.4 muestran los diagramas de tiempos relativos

a ambas secuencias de acceso, destacando la emisión de direcciones por P0 y P2, y las

señales ALE y PSEN. La señal ALE se utiliza para latchear el <<byte bajo>> de direcciones

dentro del latch.

Cuando el CPU esta ejecutando un programa en la memoria interna PSEN no se

activa y las direcciones no se emiten por los puertos. Sin embargo ALE se sigue emitiendo

dos veces por cada ciclo de maquina, pudiendo ser utilizada como señal de reloj externo.

No obstante, como se puede ver en la figura 3.4, cuando se accesa a un operando utilizando

la instrucción MOVX, la señal ALE desaparece.

Figura 3.4

Page 21: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 21-

En la figura anterior se pudo observar cómo se realiza un acceso a la memoria

externa de programas para tomar una instrucción y en el segundo ciclo de accede a la

memoria de datos externa para tomar datos.

MEMORIA DE DATOS. El 8751 puede direccionar hasta 64 kbytes de memoria de datos externa. En la sig.

Figura se pude ver el mapa de memoria de datos. La memoria interna se encuentra dividida

en dos bloques, los 128 bytes bajos y el espacio ocupado, en parte, por los Registros de

Funciones Especiales (SFR).

FFFF FF 80 7F 00 0000

FIG. 3.5

En la memoria de datos interna se puede acceder a un total de 256 bytes para el

8751 incluido el área de los registros especiales (SFR),

ÁREA DE DIRECCIONAMIENTO DIRECTO E INDIRECTO.

Los 128 bytes a los que puede acceder desde ambos direccionamientos, directo e

indirecto, pueden ser divididos en tres segmentos.

Banco de registros (banco 0, 1, 2 y 3). Registros R0 a R7 por banco.

Los registros se localizan desde la dirección 00H a 1FH (32 bytes). Después de un Reset,

el banco operativo por default es el banco 0. La selección de otro banco de registros debe

hacerse por software escribiendo en el registro de estado PSW.

Dirección Inicial Dirección Final 00H Banco 0 07H 08H Banco 1 0FH 10H Banco 2 17H 18H Banco 3 1FH

SFR Solo Directo.

Directo é Indirecto

64 KBytes Memoria Externa RD WR

Page 22: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 22-

El reset inicializa el Stack Pointer (SP) en la posmem 07H y se incrementa

inmediatamente a la posmem 08H, que es el primer registro R0 del segundo banco de

registros, el SP se puede inicializar en otra localización de memoria.

SUBÁREA DIRECCIONABLE BIT A BIT:

Esta área tiene una longitud de 16 bytes (del segmento 20H a 2FH). Cada uno de los

128 bits de este segmento se puede direccionar directamente (00H a 7FH).

Los bits se pueden direccionar por los bytes que contiene (20H a 2FH). Esto es, los bits 0 al

7 pueden ser referidos como los bits 20.0 a 20.7, etc.

20H 27H 28H 2FH SUBÁREA SCRATCH PAD:

La memoria scratch pad se entiende como la memoria común es decir un block de

notas de rápido acceso, pero de escasa capacidad. Ocupa las posiciones de memoria 30H a

7FH 80 Bytes. Es la memoria de trabajo RAM del usuario.

30H 3FH 40H 4FH 50H 5FH 60H 6FH 70H 7FH

ÁREA DE REGISTROS O FUNCIONES ESPECIALES.

La sig. Tabla muestra los registros especiales que utiliza el 8751, así como sus direcciones.

No. Símbolo Nombre Dirección 1. *ACC Acumulador Acumulador. 0E0H 2. *B Registro B Registro B. 0F0H 3. *PSW Program Status Word Palabra de Estado del Programa. 0D0H 4. SP Stack Pointer Puntero de la memoria de la PILA. 81H 5. DPTR Data Pointer 2 Bytes Apuntador de datos. ------- 6. DPL Low Byte del DPTR Byte bajo. 82H 7. DPH High Byte del DPTR Byte alto. 83H 8. *P0 Port 0 Puerto 0 80H 9. *P1 Port 1 Puerto 1 90H 10. *P2 Port 2 Puerto 2 0A0H 11. *P3 Port 3 Puerto 3 0B0H 12. *IP Interrupt Priority Control Control de prioridad de interrupciones. 0B8H 13. *IE Interrupt Enable Control Control de autorización de Interrupciones. 0A8H 14. TMOD Timer/Counter Mode Control Control Modo Temporizador/Contador. 89H 15. *TCON Timer/Counter Control Control Temporizador/Contador. 8CH 16. TH0 Timer/Counter 0 High Byte Byte alto temporizador/Contador 0 88H 17. TL0 Timer/Counter 0 Low Byte Byte bajo temporizador/Contador. 0 8AH 18. TH1 Timer/Counter 1 High Byte Byte alto temporizador/Contador 1 8DH 19. TL1 Timer/Counter 1 Low Byte Byte bajo temporizador/Contador. 1 8BH 20. *SCON Serial Control Control de comunicación serie. 98H 21. SBUF Serial Data Buffer Buffer de datos de comunicación serie. 99H 22. PCON Power Contol Control de consumo de potencia. 87H *= Registros Direccionable bit a bit. Tabla 3.2

Page 23: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 23-

ACC: Acumulador: Es un registro de propósito general y por su frecuencia de intervención,

el más importante.

B: Registro B es usado durante operaciones de multiplicación y división, para otras

instrucciones puede ser tratado como un registro común.

PSW: Program Status Word: Contiene información del estado del CPU en cada ciclo de

instrucción.

b7 b6 b5 b4 b3 b2 b1 b0 CY AC F0 RS1 RS0 OV - P

BIT NOMBRE Y COMENTARIO b0 P: bandera de paridad del Acumulador (ACC).

- Si P=1 el número de unos en el ACC es impar.

- Si P=0 el número de unos en el ACC es par.

b1 Bandera disponible por el usuario.

b2 OV: Bandera de Overflow.

b3-b4 RS0-RS1: Selección del banco de registros.

0 - 0 Banco 0 (00-07H)

1 - 0 Banco 1 (08-0FH)

0 - 1 Banco 2 (10-17H)

1 - 1 Banco 3 (18-1FH)

b5 F0: Bandera 0. De propósito general. Definida por el usuario.

b6 AC: Bandera de acarreo Auxiliar. Para operaciones en BCD.

b7 C: Bandera de Acarreo.

SP: Stack Pointer: es un registro de 8 bits, este es incrementado antes de que el dato sea

almacenado, con un Push o Call. El Stack puede recidir en cualquier lugar de la RAM. El

Stack Pointer es inicializado a 07H después de un reset, esto hace que el Stack empiece en

la localidad 08H.

DPL y DPH: Data Pointer: Este registro puede ser manipulado como un registro de 16 bits o

como dos registros de 8 bits.

P0,P1,P2,P3: Son registros “Latches” de los puertos 0,1,2,3 respectivamente.

Los otros registros se esxplicaran postriormente.

Page 24: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 24-

Capitulo 4 Programación de los Microcontroladores Intel MCS-51

INTRODUCCION:

Todos los modelos de la familia MCS-51 ejecutan el mismo set de instrucciones.

Estas instrucciones están optimizadas para el control de aplicaciones de 8 bits.

LENGUAJE ENSAMBLADOR:

Un programa en lenguaje ensamblador es un conjunto de instrucciones que se

pueden convertir en un programa ejecutable en lenguaje máquina. Estas instrucciones se

dividen en tres categorías:

1) Pseudoinstrucciones (Directivos), se emplean para proporcionar información con el

fin de convertir el programa de ensamblador a una versión en lenguaje máquina.

2) Descriptores de Datos, utilizados para definir valores constantes y reservar posiciones

de memoria de datos necesarias en el programa.

3) Instrucciones Ejecutables, equivalentes a las instrucciones en lenguaje máquina.

INSTRUCCIONES EJECUTABLES:

Cada instrucción ejecutable en lenguaje ensamblador es una representación

simbólica de una instrucción en lenguaje máquina. Por lo tanto, la instrucción en lenguaje

ensamblador debe definir la operación aritmética - lógica; el modo de direccionamiento y el

operando, dirección o desplazamiento de la dirección cuando sea necesario. Además las

instrucciones ejecutables en lenguaje ensamblador suelen contener una sentencia o

comentario que indica la razón fundamental de la instrucción. Por último, es frecuente

asignar una etiqueta, o nombre a una función, para facilitar su referencia. Toda esta

información se organiza en cuatro campos:

Campo Etiqueta. : Campo Operación Campo Operando ; Campo Comentario

Las instrucciones en los microprocesadores son actualmente una secuencia de 0 y 1’s

que representan la operación que se ejecutara. La notación hexadecimal es usada para

abreviar la representación de la instrucción. Una forma fácil de escribir y entender un

programa es escribirlo en Lenguaje ensamblador. En lenguaje ensamblador, la combinación

de bits es representada por un nombre o un mnemónico al cual le corresponde la acción de

Page 25: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 25-

la instrucción. Por ejemplo la instrucción del 8051 que suma el contenido del registro R7

con el Acumulador A es representada por:

00101111B ó 2FH. En ensamblador ADD A, R7

Esta representación es llamada Lenguaje Maquina debido a que esta representación

es la que utiliza el Microprocesador. Esta instrucción tiene dos campos distintos, estos

campos son la operación y el registro fuente, como se muestra en las tablas de

instrucciones.

A continuación se estudiarán los modos de direccionamiento y el set de instrucciones

agrupado por especialidades de la siguiente manera:

• Instrucciones aritméticas.

• Instrucciones lógicas.

• Instrucciones para la transferencia de datos en:

a) RAM interna.

b) RAM externa.

• Instrucciones para el tratamiento de tablas.

• Instrucciones Booleanas.

• Instrucciones de salto.

MODOS DE DIRECCIONAMIENTO.

Direccionamiento Directo.

En este direccionamiento el operando se especifica en la instrucción por un campo de

dirección de 8 bits. Sólo la RAM interna de datos (primeros 128 bytes) y la zona de SFR se

pueden direccionar de esta forma.

Ejemplo:

ADD A, 4CH es decir, suma el contenido del acumulador con el contenido de

la posición de memoria (4CH):

A<-- (A)+(4C)

Nota: Un registro o número entre paréntesis se refiere al contenido. Así

(A) es el contenido del acumulador.

(4C) es el contenido de la posición de memoria 4C.

ADD A, 7FH ;El acumulador es sumado al dato que se encuentra en la dirección 7FH de la

Ram interna y el resultado será almacenado en el acumulador.

Page 26: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 26-

MOV A, 2EH ; El Acumulador es cargado con el dato que se encuentra en la dirección 2EH

de la memoria RAM interna.

MOV 3DH, 4EH ; El contenido de la dirección 3DH es cargado con el dato que se

encuentra en la dirección 4EH.

Direccionamiento Indirecto:

La instrucción específica un registro que contiene la dirección del operando. Tanto la

memoria RAM interna, como la externa se pueden direccionar indirectamente.

Los registros para direccionar sobre el mapa de 8 bits son el R0 y R1 del banco de

registros seleccionado, o el Stack Pointer. El registro para direccionar sobre 16 bits sólo

puede ser el DPTR.

Ejemplo:

ADD A, @R0 ; Así, si (R0)=4CH la operación será:

A<--(A)+(4C) (@) es el indicador del direccionamiento indirecto.

MOV A, @R0 El Acumulador es cargado con el dato que se encuentra en la dirección

apuntada por RO.

MOVX A, @DPTR; El Acumulador es cargado, con el dato que se encuentra en la dirección

apuntada por el DPTR.

MOVX @DPTR, A El contenido del acumulador es guardado en la dirección

apuntada por el DPTR.

Direccionamiento por Registro

Los Microcontroladores 8751, contienen cuatro bancos seleccionados por los bit 3 y 4

del PSW, y cada banco de registros tiene ocho registros del R0 al R7. El propio código de

operación de la instrucción especifica con qué registro se opera; es decir, cuando la

instrucción es ejecutada se accede a uno de los 8 registros del banco seleccionado y en la

mayoría de los casos son más rápidas.

Ejemplo: MOV Rn,A

Page 27: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 27-

Código: 1 1 1 1 1 r r r Operación: (Rn) (A)

Dependiendo del registro implicado el código de instrucción tomará distintos valores.

Así

MOV Ro,A 1111 1000B = F8H

MOV R1,A 1111 1001B = F9H

MOV R2,A 1111 1010B = FAH

MOV R7,A 1111 1111B = FFH

Otro ejemplo:

MOV Rn, #data

Código: 0 1 1 1 1 r r r

Operación: (Rn) #dato.

Direccionamiento Implícito.

En estas instrucciones se especifica, implícitamente, el registro sobre el que van a

operar, como el acumulador, el puntero de datos, etc. No necesitan especificar el operando

por que está implícito en el código de operación.

Ejemplo:

INC A; Incrementa el contenido del acumulador:

A (A) + 1

INC DPTR; Incrementa puntero de datos;

DPTR (DPTR) + 1

DEC R0; Decrementa el registro R0.

Direccionamiento Inmediato

Al código de operación le sigue una constante en la memoria de programas.

Ejemplo:

MOV A, #255 ; Carga en el acumulador el número decimal 255.

Generalmente se expresan en hexadecimal:

MOV A, #0FFH

o en binario:

Page 28: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 28-

MOV A, #11111111B

MOV A, #64H ;El acumulador es cargado con el dato 64H inmediatamente.

ADD A, #120 ;El acumulador es sumado al número decimal 120 y el resultado

;se almacena en el acumulador.

MOV DPTR, #1245H ;El DPTR es cargado con el dato 1245H en forma inmediata.

• Direccionamiento Indexado

Este direccionamiento sólo es posible en la memoria de programas y sólo permite la

lectura. Es utilizado para la lectura de tablas. Un registro base de 16 bits (el DPTR o el

Contador del Programa) apunta a la base de la tabla y el contenido del acumulador es el

offset que permite acceder a la lectura de esa posición de la tabla.

MOVC A, @A+DPTR ;Mueve una constante que se encuentra en la, memoria del programa.

El Acumulador es, cargado con el dato que se encuentra apuntado por la dirección formada

por la suma del Acumulador A y el Apuntador de Datos.

MOVC A,@A+PC; El Acumulador es cargado con dato que se encuentra, en la dirección

formada por la suma del mismo Acumulador A y el Contador del Programa (PC).

4.3 CICLO DE INSTRUCCIÓN

La ejecución de un ciclo de instrucción comienza en el estado 1 del ciclo máquina,

cuando el código de operación es almacenado en el Registro de Instrucción. (Para

comprender este apartado tener a la vista la figura 3.1 y la tabla 4.5 Set de

instrumentaciones)

Como norma general, una instrucción requiere de uno o más ciclos máquinas, en función

de:

a) El código de operación

Por ejemplo, la instrucción INC A (figura 3.1 A) tiene 1 de byte de instrucción y requiere

1 ciclo máquina, la instrucción INC DPTR, también, de 1 byte de instrucción requiere de 2

ciclos máquina (figura 3.1C) y la instrucción MUL AB requiere de 4 ciclos máquina para su

total ejecución y ocupa 1 byte en la memoria.

b) El número de bytes

Por ejemplo, la instrucción MOV A, # data tiene 2 bytes de instrucción y requiere de 1

ciclo máquina (figura 3.1B). En cambio la instrucción MOV direct, # data al constar de 3

bytes necesita de 2 ciclos máquina. Esto no ocurre siempre, es decir, a más bytes más

ciclos máquina, como puede verse en la figura 3.1 B correspondiente a la instrucción, MOV

Page 29: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 29-

A, # data y en la figura 3.1D MOVX A,@Ri. La primera instrucción tiene 2 bytes y la

segunda sólo 1, en cambio la primera requiere 1 ciclo máquina y la segunda 2.

Ante la imposibilidad de establecer una norma o regla que facilite el conocimiento del

número de bytes y ciclo de instrucción se ha editado la tabla 4.5 con el set completo de

instrucciones.

Cabe destacar también en la figura 3.1 que en cada ciclo máquina se producen 2

accesos a la memoria. El primero, si es comienzo de ciclo de instrucción, siempre leerá el

código de operación, el segundo que normalmente se descarta. Se utiliza para leer el

segundo byte, operando de la instrucción, como ocurre en la figura 3.1B.

Page 30: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 30-

4.4 TIPOS DE INSTRUCCIONES

El set de instrucciones de Intel MCS-51 se puede dividir según las especialidades:

• Instrucciones aritméticas,

• Instrucciones lógicas.

• Instrucciones de transferencia de datos.

• Instrucciones booleanas.

• Instrucciones de salto.

Las instrucciones aritméticas, lógicas, de transferencia y de salto son comunes en la

mayoría de microprocesadores. Los microcontroladores tiene un área especial de aplicación,

que es el área del control de procesos; en este campo las operaciones están orientadas,

muy a menudo, a bits. Los microcontroladores leen, procesan, escriben e intercambian

información con los sistemas exteriores, en formato <<bit a bit>> o <<palabra a

palabra>>. Un procesador booleano con un set de instrucciones booleanas muy

completo se encarga de realizar este tipo de operaciones. Esta particularidad, así como su

inmunidad al ruido eléctrico, le hacen valioso en el mundo del control de procesos

industriales.

En este capítulo y en el siguiente se aborda el estudio de las instrucciones por

especialidades, aparece todo el set de instrucciones, 111 en total, de la familia 51; en

cambio, en las tablas simplificadas que utilizaremos primero solo curntan con 69

instrucciones. La razón de esta diferencia está en la propia tabla y justamente en la

columna encabezada por <<modos de direccionamiento>>. Esto quiere decir que según los

direccionamientos una instrucción puede tener hasta cuatro códigos de operación y

operandos distintos. Esta situación se resuelve utilizando la palabra <byte>, que tomará el

siguiente significado (tabla 4.1):

TABLA 4.1

En la tabla simplificada

Según el modo de direccionamiento

Significado

<byte> direct Direccionamiento directo. Se refiere a una posmem. <byte> @Ri Direccionamiento indirecto a través del registro R0 y R1. <byte> Rr Direccionamiento por registro. <byte> # data Direccionamiento inmediato. Constante de 8 o 16 bits

En las tablas simplificadas también se indica el posible flag (C= Carry, OV=

overflow, AC= Auxiliar Carry) afectado por la instrucción según el siguiente código:

No es afectado.................................... Sí es afectado...................................... X Afectado poniéndolo a ...................... 0 Afectado poniéndolo a........................ 1

Page 31: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 31-

En algunas tablas no son afectados los flags, y esto se indica con un mensaje en la

parte inferior de las mismas.

Los tiempos de ejecución Se han tomado utilizando como referencia una frecuencia

de reloj de 12 MHz.

3.5 INSTRUCCIONES ARITMETICAS

En la tabla 4.2. Se muestra el menú de las instrucciones aritméticas. Se indican en la

tabla los modos de direccionamiento que permite la instrucción y los flags afectados.

Los tiempos de ejecución que se indican en la tabla están evaluados sobre una

frecuencia de reloj de 12 MHz.

Nemónico Operación Modos de direccionamiento Tiempo de Ejecución

Flag afectados

Dir Ind Reg Imm µs C OV AC ADD A,<byte> A=A+<byte> X X X X 1 X X X ADDC A,<byte> A=A+<byte>+C X X X X 1 X X X SUBB A,<byte> A=A-<byte>-C X X X X 1 X X X INC A A=A+1 Accumulator only 1 INC <byte> <byte>=<byte>+1 X X X 1 INC DPTR DPTR=DPTR+1 Data pointer only 2 DEC A A=A-1 Accumulator only 1 DEC <byte> <byte> = <byte> -1 X X X 1 MUL AB B:A = B x A ACC and B only 4 0 X DIV AB A = int [A/B]

B = Mod [A/B] ACC and B only 4 0 X

DA A Decimal Adjust Accumulator only 1 X Tabla 4.2

X =Si =No

Al leer dicha tabla se observa que:

• Se puede incrementar o decrementar un byte en la memoria de datos interna sin la

intervención del acumulador.

• Una de las instrucciones INC opera sobre los 16 bits del puntero de datos (DPTR).

• La instrucción MUL AB multiplica el contenido del acumulador con el dato situado en el

registro B y el producto, en formato 16 bits, aparece en los registros Acumulador y B

(Sobreescribe a los operandos).

• La instrucción DIV AB divide el contenido del acumulador con el dato contenido en B,

apareciendo el resultado, cociente, en el acumulador y el resto en el registro B.

Page 32: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 32-

Ejemplo:

A = 5FH

DIV AB B = 0AH

1001 A

1010 0101 1111

0101 B

• La instrucción DA A justa el resultado en binario puro producido por las instrucciones

ADD y ADDC a formato BCD. Esta instrucción no convierte el contenido del acumulador

en BCD, sino que hace ajuste BCD de la suma (resultado), por lo tanto, esta instrucción

debe ir inmediatamente después de la instrucción ADD o ADDC.

Esta es, de forma simplificada, la operación que realiza:

Si [ [(A3-0)> 9] * OR * [(AC) = 1] ]

Entonces (A3-0) (A3-0) + 6

Y si [[(A7-4) > 9] * OR.* [(C)= 1]]

Entonces (A7-4 ) (A7-4) + 6

INSTRUCCIONES LOGICAS

La tabla 4.3 muestra la lista de instrucciones lógicas y los modelos de

direccionamiento que permiten así como los flags afectados.

La duración de ejecución de 1 ó 2 microsegundos considerando un cristal de 12 MHz.

• Las primeras instrucciones corresponden a las operaciones AND, OR, EXOR y NOT.

Ejemplo:

ANL <byte>, # 3 F

Si <byte> = (3A) = 0011 1010

# 3F = 0000 1111

0000 1010 = 0AH

(<byte> se refiere, en este caso, a una posición de memoria.)

Nemónico Operación Modos de direccionamiento Tiempo de

Flag afectados

Dir Ind Reg Imm Ejecución

µs C OV AC

ANL A,<byte> A=A.AND.<byte> X X X X 1

ANL <byte>,A <byte>=<byte>.A X 1

ANL <byte>,#data <byte>=<byte>.And. X 2

ORL <byte> A=A.OR. <byte> X X X X 1

ORL <byte>, A <byte>=<byte>.OR.A X 1

Page 33: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 33-

ORL <byte>. # data <byte>=<byte>.OR.# data X 2

XRL A,<byte> A =A.XOR.<byte> X X X X 1

XRL <byte>, A <byte>=<byte> .XOR. A X 1

XRL <byte> , #data <byte>=<byte> .XOR. #data X 2

CLR A A=00H Accumulator only 1

CPL A A=.NOT.A Accumulator only 1

RL A Rotate ACC Left 1 bit Accumulator only 1

RLC A Rotate left through Carry Accumulator only 1 X

RR A Rotate ACC Right 1 bit Accumulator only 1

RRC A Rotate Right through Carry Accumulator only 1 X

SWAP A Swap Nibbles in A Accumulator only 1 Tabla 4.3

X =Si =No

• Continuando con el set de instrucciones, aparecen instrucciones de manipulación de la

información, como las instrucciones de Rotación y de intercambio (SWAP).

• Las instrucciones de Rotación RL y RR A desplazan el acumulador 1 bit a la izquierda y

derecha, respectivamente, sin afectar al bit de acarreo.

C b7 ACC b0

Ejemplo: Rotación a la izquierda (Left)

(A) = 0C5H=1100 0101 B (antes de ejecutarla) RL A (A) = 8BH= 1000 1011B (después)

• Las instrucciones de Rotación RLC A y RRC A desplazan el contenido del acumulador

implicando al bit de acarreo.

C B7 ACC B0

• La instrucción SWAP A intercambia los nibbles en el acumulador. Generalmente se utiliza

en las manipulaciones de números en BCD.

Ejemplo:

(A) = 3H = 0000 0011B (antes de la operación) SWAP A

A 0011 0000 (después)

Page 34: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 34-

INSTRUCCIONES DE TRANSFERENCIA DE DATOS

Se consideran tres modalidades, según la transferencia se realice sobre:

• La RAM interna.

• La RAM externa.

• La memoria de programa para el tratamiento de tablas.

4.7.1. Movimiento de datos sobre la RAM interna

En la tabla 4.4 se muestra la tabla de instrucciones disponibles para mover datos dentro de

los espacios de memoria RAM interna, considerando los distintos direccionamiento para

cada una de las instrucciones

Tabla 4.4

Modos de direc. Tiempo de Nemónico Operación Dir Ind Reg Imm ejecución (µs)

MOV A.<src> A=<src> X X X X 1

MOV <dest>, A <dest> = A X X X 1

MOV <dest>, <src> <dest> = <src> X X X X 2

MOV DPTR, #data 16 DPTR= 16-bit immediate constant. X 2

PUSH <src> INC SP : MOV “@SP”, <src> X 2

POP <dest> MOV <dest>, “@SP” :DEC SP X 2

XCH A,<byte> ACC and <byte> exchange data X X X 1

XCHD A, @Ri ACC and @ Ri exachange low nibbles X 1 No son afectados los flags. X = Sí =No • La instrucción MOV <dest>, <src> permite transferir datos entre alguna de las

dos RAM interna o el espacio de localización del SRF (referencia Figura 2.8) Este

tipo de instrucción permite la transferencia sin el concurso del acumulador.

<dest> = <destino>

<src> = <fuente>

Ejemplo:

Antes de ejecutar la instrucción:

(3A)= 35H : (3D) = 78H

MOV 3AH, 3DH Después de ejecutarla:

(3A)= 78H : (3D) = 78H

Page 35: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 35-

• La instrucción MOV DPTR.# data 16 bits, permite transferir datos de 16 bits para

inicializar el DPTR (Data pointer = puntero de datos) en el tratamiento de tablas en la

memoria de programas o para acceder a los datos de la memoria externa.

• La instrucción PUSH <src> actúa incrementando el SP (stack pointer = puntero de la

pila) y copiando el dato dentro de la pila. La instrucción POP <dest> actúa

decrementando el SP y reponiendo el dato en su registro. La pila está situada dentro de

la RAM interna, por defecto en el banco de registros 1 (véase figura 2.11), pero puede

posicionarse en el área SCRATCH PAD, como se ha indicado en el capítulo anterior.

En resumen, éstas son las operaciones que realiza la unidad de control del

microcontrolador.

PUSH <src> POP <dest>

• (SP) (SP) +1 <dest> ((SP))

• ((SP)) <src> (SP) (SP) – 1

• La instrucción XCH A,<bite>, intercambia los datos del acumulador y del byte

direccionando. La instrucción XCHD A,@Ri es similar a la anterior, pero sólo implica en el

intercambio el nibble bajo; es una instrucción especializada en la manipulación de datos

en el código BCD.

Ejemplos:

Antes de ejecutar la instrucción:

(A)= 37H y (2D) = 23H

XCH A, 2DH Después de ejecutarla:

(A) = 23H y (2D) = 37H

Antes de ejecutar la instrucción:

XCHD A, @R0 (R0) = 2DH = 37H y (A) = 23H

Después de ejecutarla:

(A) = 27H y (2D) = 33H

4.7.2 transferencia de datos sobre la RAM externa

La tabla 4.5 muestra la lista de instrucciones sobre transferencia de datos que acceden a la

memoria de datos. Sólo se puede utilizar el direccionamiento indirecto con este grupo de

instrucciones.

Page 36: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 36-

Dirección con Nemónico Operación Tiempo de ejecución (µs)

8 bits MOVX A, @Ri Read external RAM @ Ri 2

8 bits MOVX @Ri Write external RAM @Ri 2

16 bits MOVX A, @ DPTR Read external RAM @DPTR 2

16 bits MOVX @DPTR,A Write external RAM @DPTR 2 Tabla 3.5

No son afectadas las banderas.

Conviene observar que para este tipo de acceso siempre interviene el acumulador

como registro fuente o destino.

El usuario debe escoger entre el tipo de instrucción MOVX A, @Ri o MOVX @Ri,A

(siendo Ri, bien el registro R0 o R1 del banco de registros seleccionado), direccionando con

8 bits o bien utilizando un direccionamiento de 16 bits, usando el registro DPTR (MOVX

A,@DPTR o MOVX @DPTR,A) y tener que sacrificar el puerto 2, cuando sólo se va a utilizar

un pequeño espacio de memoria RAM. Existe una solución intermedia que permite

direccionar sólo unos pocos kbytes de RAM externa, pero obteniendo algunas líneas hábiles

del puerto 2 como entradas y salidas (E/S). Esta es la solución que se mostró en la figura

2.7 del capitulo2. De todas formas la solución adecuada debe ser función de las

características que necesita la aplicación. Suponiendo, en principio, que la implementación

de la misma sobre la elección de los microcontoladores 8052/8051 sea la correcta.

Las líneas de control de lectura y escritura, RD y WR (pines 16 Y 17), sólo son

utilizadas cuando se ejecutan las instrucciones MOVX; si no se va a utilizar memoria RAM

externa, es obvio que se ganarán una líneas extras de E/S (figura 4.7)

Ejemplo: Estudiar la secuencia de instrucciones.

MOVX A, @R1

MOVX @R0,A

Antes : (R1) = F3H

F3H 3AH MOVX A,@R1 ejecución: A (F3H)

Después: (A) = 3AH

85H ?

Antes : (A) = 3AH y (R0) = 85H

MOVX @R0,A ejecución: (R0) (A)

R1 F3H Después: (85h) = 3AH

R0 85H

Page 37: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 37-

¿Qué sucedería si se tuviera que implementar estas instrucciones en al zona de

memoria por encima de la dirección 2000H? Es decir:

Sustituida

85H ------------------- 2085H

F3H------------------- 20F3H

Se llegaría a la conclusión de que no se podría procesar estas instrucciones,

contando que los registros R0 y R1 no pueden direccionar por encima de la posición de

memoria FFH. Pero aquí es donde entran en juego las instrucciones MOVX con el DPTR

como operando. La sustitución, en el caso de tener que operar en el espacio de memoria

comprendiendo entre 0000H y FFFFH. Sería:

Sustituida

MOVX A, @Ri -------------------- MOVX A, @DPTR

MOVX @ Ri, A -------------------- MOVX @DPTR,A

Recuérdese que en la tabla 3.4 hay una instrucción que es:

MOV DPTR, # data 16

Con la que se podría acceder a todo el mapa de memoria.

4.7.3 Memoria de programas para el tratamiento de tablas.

La tabla 3.6 muestra las dos instrucciones disponibles para la lectura de tablas en la

memoria de programas (independientemente del algoritmo que pueda crear el usuario con

otras instrucciones),obsérvese que las tablas sólo pueden ser leídas y no actualizadas. El

nemónico es MOVC (Mover constante).

Si la tabla accede a la memoria de programa externa, recordar que esta lectura es

autorizada por la señal de control PSEN (pin 29). Obsérvese la figura 2.5 del capítulo

anterior.

Tabla 4.6

nemónico Operación Tiempo de ejecución (µs)

MOVC A, @ A + DPTR Read pgm memory at (A + DPTR) 2

MOVC A, @ A + PC Read pgm memory at (A + PC) 2

No son afectados los flags.

Page 38: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 38-

La primera instrucción de la tabla permite la lectura en tablas con accesos no

superiores a 256. El acceso deseado es cargado en el acumulador, y el data pointer (DPTR)

Establece el puntero de comienzo de la tabla. La lectura es cargada dentro del registro

acumulador.

MOVC A, @A+DPTR A ((A) + (DPTR))

La segunda instrucción es similar a la primera, salvo que el program counter (PC) el que

actúa como indicador de la dirección base de la tabla.

PC (PC) + 1 MOVC A, @A+PCM A ((A) + (PC))

Se presenta esta instrucción dentro de una subrutina, estando la tabla de

información después de la instrucción de retorno de la subrutina (RET).

Ejemplo:

Se trata de demostrar el funcionamiento sobre una tabla de 4 datos. A la izquierda

aparece el mapa de memoria del programa

90H MOV

91H #01H

92H CALL

93H Dire, rutina

A0H INC A

A1H MOV A. @+PC

A2H RET

A3H 20H

A4H 21H

A5H 22H

A6H 23H

MOV A, #01H

CALL TABLA

TABLA: INC A

MOVC A. @A+PC

RET

DATO0

DATO1

DATO2

DATO3

Page 39: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 39-

Se pretende acceder inicialmente al DATO1, por esta razón se carga al acumulador

con 01H, se salta a la rutina de tratamiento de la tabla.

Ya en al rutina, se incrementa el acumulador, con lo que su valor será:

(A) ------ (A) +1

02H ------01H + 1

En la instrucción MOVC A, @A+PC el valor del acumulador es 02 y el PC apunta a la

instrucción RET, por lo que la suma A2H + A4H, luego:

A (A4H)

(A) = 21H

INSTRUCCIONES BOOLEANAS

La familia de microcontroladores 51 y concretamente los microcontroladores

8052/8051 tienen un procesador booleano incluido en el chip.

Estos microcontroladores poseen dos áreas que permiten el direccionamiento <bit a bit>:

Una corresponde al segmento de RAM interna de dirección comprendida entre la

posmem 20 a 2FH, en total 128 bits (figura 2.10), y la otra corresponde a los registros

marcados con asterisco en el area de SFR.

El conjunto de instrucciones que permiten este tipo de procesos, tan interesante para

las aplicaciones industriales, se encuentran relacionado en la siguiente tabla

Nemónico Operación Tiempo de ejecución (us) C OV AC

ANL C. Bit C = C . AND. Bit 2 X

ANL C./bit C= C. AND. NOT . BIT 2 X

ORL C.bit C=C .OR.bit 2 X

ORL C./bit C=C .OR..NOT.bit 2 X

MOV C.bit C = bit 1 X

MOV bit.C bit = C 2 X

CLR C C = 0 1 0

CLR bit bit = 0 1

SETB C C = 1 1 1

SETB bit Bit = 1 1

CPL C C = .NOT.C 1 X

CPL bit Bit = .NOT. bit 1

JC rel Jump jf C = 1 2

JNC rel Jump if C =0 2

JB bit. rel Jump if bit = 1 2

Page 40: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 40-

JNB bit. rel Jump if bit = 0 2

JBC bit. rel Jump if bit =1; CLR BIT 2 Tabla 4.8

X =SI: = No

Las instrucciones que aparecen en las tablas son: MOVE, SET, CLEAR, NOT, OR y AND.

Se observa cómo en casi todas las instrucciones se hace referencia al flag Carry (C).

Se podría decir que cumple todas las características que tiene el acumulador en el

procesamiento de palabras. El flag Carry se direcciona directamente dentro de la palabra de

estado PSW, en la posición <<bit7>>.

b7 b5 b0 C F0

Todos los bits del PSW son direccionables bit a bit, como todos los registros

señalados del SRF. Es importante reseñar la presencia del flag F0 (b5 del PSW) de propósito

general, disponible como flag del usuario. ¿Por qué no utilizarlo como indicador, en las

operaciones aritméticas de signo (flag N)?

Comentario aparte exige el tratamiento de las instrucciones booleanas de salto. Hay

instrucciones que producen el salto cuando el bit direccionado está en estado <<1>>, como

son las instrucciones JC,JB y JBC; también están las que producen el salto cuando el bit

direccionado está puesto <<0>>, como son las instrucciones JNC, y JNB. JBC Produce el

salto si el bit direccionado es <<1>> y pone a <<0>>este bit, siendo la única instrucción

que detecta y pone a <<0>> el bit direccionado.

Secuencias de operaciones:

JC rel JNC rel

(PC) (PC) +2 (PC) (PC) + 2

Si (C) = 1 Si (C) = 0

Entonces entonces

(PC) (PC) + rel (PC) (PC) + rel

JB bit, rel JNB bit, rel JBC bit, rel --------------------- ---------------------- ---------------------- (PC) (PC) + 3 (PC) (PC) + 3; (PC) (PC) + 3;

Si (bit) = 1 Si (bit) = 0 Si (bit) = 1

Entonces Entonces Entonces

(PC) (PC) + rel (PC) (PC) + rel (bit) 0

(PC) (PC) + rel

Page 41: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 41-

Ejemplos:

A) poner el Carry a set (1) si el bit0 del puerto 1 es <<1>> (P1,0 = 1), el bit7 del

acumulador es <<1>> (A.7=1) y el flag OV = 0.

• Programa:

MOV C, P1. 0 ; Carga el Carry (c) con el bit0 del puerto 1.

; C (P1.0)

ANL C, A . 7 ; Operación AND con el Carry (C ) y el bit7

; del acumulador, es decir: C ( C ). AND .(A.7)

ANL C,/OV ; Operación AND con el Carry ( C ) y el valor

; complementado del flag de overflow (OV)

; del registro PSW. C (C) .AND./NOT.OV

B) Realizar la operación EXOR bit a bit, entre el b0 del puerto 0 (P0.0) y el b1 del puerto 1

(p1.1). depositando el resultado en el b7 del puerto2.

Para realizar la operación EXOR, el usuario debe crear un algoritmo, puesto que la

instrucción EXOR no la tienen implementada los microcontroladores de la familia 51.

La operación a realizarse es:

P2.7 P0.0 .EXOR. P1.1

• Programa: MOV C,P0.0 ;Carga el bit0 del puerto P0 en el flag Carry

; C (P0.0 ) JNB P1. 1, SALTA ;Si p1.1 =0. C contiene el resultado

; correcto y entonces salta; pero si P1.1=1 ;el complemento de C es el resultado correcto.

CPL C ; Complementa C. SALTA: MOV P7.2,C ;El contenido del Carry (C) lo almacena en ; el bit7 del puerto P2. ;P7.2 (C )

La dirección del destino del salto, en la memoria de programa, viene especificada,

cuando el programa está escrito en Ensamblador, por una etiqueta. Así, en el ejemplo

anterior, la etiqueta (SALTA:) Indica el origen y el destino del salto. Una vez ensamblado el

programa del usuario, la dirección del salto se convierte en un número (OFF-SET) del

tamaño de un byte, que representa una dirección relativa, representada en el sistema de

numeración binario en complemento a dos. El rango del salto (operando de la instrucción)

puede estar comprendido entre –128 y127 bytes. Si él operando es positivo, el salto es

adelante (direcciones crecientes de memoria); si en negativo, el salto es atrás (direcciones

decrecientes de memoria).

Page 42: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 42-

4.4 INSTRUCCIONES DE SALTO

Un programa es una secuencia de instrucciones que el contador de programa (PC)

rompe en función de:

a) Haber concluido la secuencia de instrucciones y salta a otra o recomienza la misma. Este

es un salto Incondicional.

b) La palabra de estado del programa (PSW) o del estado de uno o más bits de la

entrada/salida de periféricos. Este es un salto condicional.

4.4.1 instrucciones de salto incondicional

La tabla 3.9 muestra la lista resumida de los saltos incondicionales. Aunque sólo figure la

instrucción <<JMP addr>>, de hecho hay tres tipos: SJMP. LMP, y AJMP, que difieren en el

formato de la dirección de salto.

Tabla 3.9

Nemónico Operación Tiempo de ejecución (us)

JMP addr Jump to addr 2 JMP @A + DPTR Jump to A + DPTR 2 CALL addr Call subroutine at addr 2 RET Return from subroutine 2 RETI Return from interrupt 2 NOP No operation 1 No son afectados las banderas.

SJMP rel : (short jump). La dirección destino del salto viene dada por un <<offset

relativo>>, igual que en las instrucciones de salto booleanas. La instrucción tiene dos bytes,

correspondientes al código de operación y al byte de offset relativo. El rango del salto está

limitado a –128 y + 127 byte relativos. al primer byte siguiente a la instrucción de salto.

(PC) (PC) +2

CPC) (PC) +

LJMP addr 16: ( Long jump). La dirección destino del salto viene dad por una constante de

16 bits. La instrucción está formada por 3 bytes, 1 byte para el código de operación y 2

para la dirección del salto. Por tanto, la dirección de destino está ubicada dentro del área de

los 64K de la memoria de programa.

PC addr 16

AJMP addr 11: (Absolute jump). La dirección destino del salto viene dada por una constante

de 11 bits. La instrucción tiene 2 bytes, uno para el código de operación que también

contiene en sí misma 3 de los 11 bits de direcciones, y otro byte que contiene los 8 bits

bajos de la dirección de destino. El código de la instrucción y el operando es :

Page 43: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 43-

a10 a9 a8 0 0 0 0 1 A7 a6 a5 a4 A3 a2 a1 a0

CODIGO DE OPERACIÓN OPERANDO

Por tanto, el destino del salto tiene que estar comprendido dentro del bloque de los 2

K bytes referenciado respecto a la siguiente instrucción a la del salto.

PC (PC) + 2

(PC 10-0) dirección de la página

En cualquier caso, el programador especifica la dirección de destino, bien como una

etiqueta o como una dirección constante de 16 bits, en el programa escrito en lenguaje

ensamblador. Este se encarga de darle el destino. En el formato correcto, según el código

de operación. Si este formato no soporta la distancia del salto. Aparecerá un mensaje como

éste << Destination out of range>>. Que nos previene del error.

JMP @A+DPTR: Se trata de una instrucción de salto indirecto, suma el byte contenido en el

acumulador con los 16 bits del puntero de datos (DPTR) y carga el resultado de la suma en

el contador de programa (PC). Esta será la dirección para la subsiguiente búsqueda de la

instrucción.

Ejemplo: Se trata de establecer cinco caminos de ramificación del programa, dependiendo

de que el acumulador tome valores comprendidos entre 0 y 4.

• Programa:

MOV DPTR,# TABLA_ SALTO ;Se carga el DPTR con la dirección de la tabla de saltos.

MOV A, INDI ; Se carga el acumulador con la variable índice (INDI).

; 0 <INDI< 4.

RL A ;El valor cargado sufre un desplazamiento de un bit

;a la izquierda (multiplica por 2 el contenido del acumulador).

JMP @A +DPTR ;Se efectúa la suma: PC (A) + (DPTR)

; y se produce el salto a otra instrucción

; de salto que a su vez saltará al

; subprograma a ejecutar.

----------------------------------

INDI: AJMP SALTO0

AJMP SALTO1

AJMP SALTO2

AJMP SALTO3

AJMP SALTO4

Page 44: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 44-

La instrucción RL A convierte la variable INDI (valor comprendido entre 0 y 4) en un

número par de rango entre 0 y 8 para salvar, en el salto, los datos bytes de longitud que

tiene cada entrada de salto, AJMP SALTO0,AJMP SALTO 1...

_ Siguiendo con las instrucciones incondicionales, de la tabla 4.3 ésta muestra la instrucción

CALL addr que tiene 2 formatos, LCALL y ACALL, que difiere en la forma en la que la CPU

implementa la dirección donde se encuentra la subrutina.

Nota: CALL es el nombre genérico con que el programador se refiere a estas instrucciones

de salto, y que se traducen en una <<llamada>> (generalmente suelen producirse varias

llamadas desde el programa principal. De ahí su interés por el ahorro de memoria para la

máquina y de trabajo para el progamador) a un subprograma (subrutina). Que en sí mismo

tiene su identidad para realizar una tarea definida.

LCALL addr 16 : utiliza un formato de 16 bits para direccionar la subrutina y esa área de

direccionamiento es el máximo de 64 Kbytes de la memoria de programas.

Secuencia de operaciones:

• (PC) (PC) + 3 • (SP) (SP) + 1 • ((SP)) (PC 7-0 ) • (SP) (SP) + 1 • ((SP)) (PC15-8 ) • (PC) addr15-0 ACALL addr 11: utiliza un formato de direccionamiento de 11 bits, por lo que la subrutina

debe estar dentro del área de los 2 Kbytes, a partir de la siguiente instrucción.

Secuencia de operaciones: • (PC) (PC) +2 • (SP) (SP) + 1 • ((SP)) (PC7-0) • (SP) (SP) + 1 • ((SP)) (PC15-8) • (PC10-0) dirección de la página Lo mismo que se indicó en los saltos incondicionales, el programador cuando trabaja en

ensamblador sólo debe preocuparse de colocar la etiqueta; el programador ensamblador

determinerá la longitud del salto y el formato que debe dar al código de instrucción según la

longitud del salto.

RET: Las subrutinas terminan su ejecución con la instrucción RET, que es la instrucción que

indica la vuelta al programa principal, justo en la dirección de memoria de la instrucción

siguiente a la instrucción CALL.

Page 45: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 45-

Secuencia de operaciones:

• (PC15-8) ((SP))

• (SP) (SP) – 1

• (PC7-0) ((SP))

• (SP) (SP) – 1

RETI: Utilizada para retornar de las rutinas del servicio de interrupciones. Las interrupciones

se estudian de forma especial en el capitulo 10.

Secuencias de operaciones:

• (PC15-8) ((SP))

• (SP) (SP) – 1

• (PC7-0) ((SP))

• (SP) (SP) – 1

4.2.2 INSTRUCCIONES DE SALTO CONDICIONAL

La tabla 3.10 muestra la lista de las instrucciones de salto condicional. Estas

instrucciones son las que van a permitir al microcontrolador tomar decisiones (siguiendo

secuencialmente una parte del programa u otra) ante una propuesta binaria. Que en el

lenguaje coloquial se contesta con una afirmación o negación 1 propuesta de bifurcación de

la secuencia del programa se halla implícita dentro del código de operación y es el operando

el que señala la dirección del salto en el formato de <<offset relativo>>, por lo que la

distancia del salto está limitada a –128 y +127 bytes referida a la instrucción siguiente a la

del salto condicional. Trabajando con el programa ensamblador es suficiente señalar con

una etiqueta la dirección del salto o con una constante de 16 bits.

Nemónico Operación Modos de direccionamiento

Tiempo de Flag afectados

Dir Ind Reg Imm Ejecución µs C OV AC

JZ rel Jump if A=0 Accumulator only 2

JNZ rel Jump if A<>0 Accumulator only 2

DJNZ <byte>,rel Decrement and jump if not zero

X X 2

CJNE A,<byte>,rel Jump if A<> <byte> X X 2 X

CJNE <byte>,#data,rel Jump if <byte><.> #data X X 2 X

X =Si =No

Page 46: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 46-

Nota: en la tabla 3.10 se señalara como posible operando <byte>, pudiendo ser <byte>:

a) El acumulador.

b) Los registros R0 a R7 con direccionamiento directo.

Los registros R0 y R1 con direccionamiento indirecto.

JZ y JNZ:

Salta si es cero y salta si no es cero. Para determinar si cumple las condiciones de las

instrucciones JZ, y JNZ, la CPU no pasa revista al registro de estado como ocurre en otros

micros, sino que directamente el registro acumulador, pues este microcontrolador no tiene

<< flag cero >> en el registro de estado.

Secuencias de operaciones:

JZ rel JNZ rel

• (PC) (PC) + 2 (PC) (PC) + 2

• Si (A) = 0 Si (A)<> 0

entonces entonces

(PC) (PC) + rel (PC) (PC) + rel

DJNZ:

Decrementa y salta si no es cero. Esta instrucción está especializada en lazos de control.

Para que ejecute un lazo n veces se carga un <<contador>> con n y, cada vez que se

ejecute el contenido del lazo, el contador decrementa una unidad, saliendo del lazo cuando

el contenido del contador sea cero.

• (PC) (PC) + 2

• (<byte>) (<byte>) – 1

• Si (<byte>)> 0 o (<byte>)< 0

Entonces

(PC) (PC) + rel

Ejemlpo:

Ejecutar el lazo 10 veces.

MOV CONTADOR, # 10

LAZO: (comienzo del lazo)

------------------------ Instruciones que se van a ejecutar mientras

-------------------------- CONTADOR sea distinto de <<cero>>.

( fin del lazo)

Page 47: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 47-

DJNZ CONTADOR , LAZO

CJNE:

Compara y salta, si el resultado de la comparación no es igual.

En este caso hay dos formatos, según la comparación se haga con el acumulador o con un

operando tipo <byte>, que puede ser:

• Con direccionamiento indirecto ( registros R0 y R1).

• Con direccionamiento directo ( registros R0 y R7 )

CASO 1.MODELO CJNE A,<byte>, salto relativo

Secuencia de operaciones:

• (PC) (PC) + 3

• Si (A) <> (<byte>)

Entonces

(PC) (PC) + rel

Si (A) < (<byte>)

Entonces

(C) 1

sino

(C) 0

Ejemplo:

Ejecuta las instrucciones que hay dentro del lazo hasta que la lectura del periférico a

través del puerto 0 (P0), se corresponda con el valor de la posmen 7FH.

MOV A, P0 LAZO: ---------- ---------- ---------- ---------- CJNE A,7F, LAZO CASO 2. MODELO CJNE <byte>, # dato, salto relativo

Otra aplicación de estas instrucciones es la comparación <<mayor que>> y <<menor

que>>. Si de los dos bytes del campo de operandos el primero es menor que el segundo,

entonces e <<flag CARRY>> del PSW se pone a <<uno>>. Si el primero byte es mayor o

igual que el segundo, entonces el <<flag CARRY>> es <<cero>>. Estos y otros aspectos

están aclarados en el Apéndice A.

Secuencia de operaciones:

Según se trate de direccionamiento indirecto (registros R0 y R1 (@Ri) o

direccionamiento directo (registro R0 y R7 (Rn)) es:

Page 48: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 48-

CJNE @Ri,# data, rel CJNE Rn, # data, del • (PC) (PC) + 3 • Si ((Ri)) <>data Entonces (PC) (PC) + rel • Si ((Ri)) < data Entonces (C) 1 Si no (C) 0

• (PC) (PC) + 3 • Si (Rn)<>data Entonces (PC) (PC) + rel • Si (Rn) < data Entonces (C) 1 Si no (C) 0

Seguidamente, y como resumen, se muestra el set de instrucciones de la familia 51

(tabla 3.11).

Al comienzo de estas tablas se señalan las instrucciones que afectan a los flags del

PSW, asi como unas notas sobre los símbolos utilizados en estas tablas, y a continuación

todas las instrucciones con todos los tipos de direccionamientos que admiten: por esta

razón la lista aparece muy dilatada.

<<SET>> DE INSTRUCCIONES FAMILIA –51

Tabla 4.11. Instrucciones que afectan a las banderas.

Instrucción C OV AC Instrucción C OV AC ADD X X X CLR C O ADDC X X X CPL C X SUBB X X X ANL C, bit X MUL 0 X ANL C,/bit X DIV 0 X ORL C, bit X DA X ORL C,/bit X RRC X MOV C, bit RLC X CJNE SETB C 1 Notas sobre el significado de los operandos de las instrucciones que se describen a continuación: Rn..................... Registros R0-R7 del banco de registros seleccionado. Direct............... Dirección del dato de 8 bits de la memoria interna. Puede ser un dato de

la RAM interna (0-127 para el 8051 o 0-225 para el 8052) o un registro del SFR (por ejemplo, puerto de E/S, registro de control, registro de estado (128-255).

@Ri.................. Se refiere a los registros R0 y R1, que permiten el direccionamiento indirecto para acceder a los datos de 8 bits de la RAM interna (80-FFH) Solapada con el SFR para el 8052 y (000-7FH) para el 8052/8051.

# data............... Operando constante de 8 bits # data 16.......... Operando constante de 16 bits. addr 16............. Dirección destino de 16 bits. Utilizada por las instrucciones de salto LCALL

y LJMP para permitir el salto dentro del espacio de 64K bytes de la

Page 49: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 49-

memoria de programas. addr 11........... Dirección destino 11 bits. Utilizada por las instrucciones de salto ACALL y

AJMP para permitir el salto dentro de la página de 2Kbytes de la memoria de programas a partir del primer byte de la siguiente instrucción.

Rel.................. Salto relativo en formato de 8 bits en complemento a 2. Utilizado por la instrucción SJMP y todos los saltos condicionales. El rango del salto (8 bits) está comprendido entre –128 a = 127 bytes a partir del primer byte de la siguiente instrucción.

Bit................. Direccionamiento directo <<bit a bit>> dentro del área de la memoria RAM interna y de los registros SFR que lo permiten.

rrr................ En la columna de codificación indirecta el registro implicado en las instrucción (Rn). Así: R r r Registro

0 0 0 R0 0 0 1 R 1 0 1 0 R 2

1 1 1 R 7 i..................... En la columna de codificación indica el registro implica en la instrucción de

direccionamiento indirecto (@Ri). Así: i............ Registro

0 @R0 1 @R1

Tabla Instrucciones aritméticas

Nemónico Descripción Codificación Byte Período de oscilador

ADD A,Rn Add register to Accumulador 0010 1rrr 1 12

ADD A,direct Add direct byte to Accumulador. 0010 0101 Direct address 2 12

ADD A, @Ri Add inditect RAM to Accunulador 0010 011i 1 12

ADD A, # data Add immediate data to Accumulador 0010 0100 Dato Inmediato 2 12

ADDC A,Rn Add register to Accumulador with Carry 0011 1rrr 1 12

ADDC A, direct Add direct byte to Accumulador with Carry 0011 0101 Direct address 2 12

ADDC A,@Ri Add indirect RAM to Accumulador with Carry 0011 011i 1 12

ADDC A,# data Add immediate data to Acc with Carry 0011 0100 Immediate data 2 12

SUBB A,Rn Subtract Register from Acc with boorrow 1001 1rrr 1 12

SUBB A, direct Subtrac direct byte from Acc with boorrow 1001 0101 Direct address 2 12

SUBB A,@Ri Subtract indirect RAM from ACC with boorrow 1001 011i 1 12

SUBB A, # data Subtract immediate data from Acc with boorrow 1001 0100 Immediate data 2 12

INC A Increment Accumulador 0000 0100 1 12

INC Rn Increment regitrer 0000 1rrr 1 12

INC Direct Increment direct byte 0000 0101 Direct address 2 12

INC @Ri Indrement direct RAM 0000 011i 1 12

DEC A Drecrement Accumulator 0001 0100 1 12

DEC Rn Decrenemt register 0001 1rrr 1 12

DEC Direct Decrement indirect byte 0001 0101 Direct address 2 12

Page 50: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 50-

DEC @Ri Decrement indirect RAM 0001 011i 1 12

INC DPTR Increment data pointer 1010 0011 1 24

MUL AB Multiply A&B 1010 0100 1 48

DIV AB Divide A by B 1000 0100 1 48

DA A Decimal Adjuste Accumulator 1101 0100 1 12

TABLA Instrucciones Lógicas

ANL A,Rn AND Register to Accumulator 0101 1rrr 1

ANL A,direct AND direct byte to Acumulator 0101 0101 Direct address 2

ANL A,@Ri AND indirect RAM to Accumulator 0101 011i 1

ANL A,# data AND immediate data to Accumulator 0101 0111 Immediate data 2

ANL Direct,A AND Accumulator to direct byte 0101 0010 Direct address 2

ANL Direct,# data AND immediate data to direct byte 0101 0011 Direct address Immediate data 3

ORL A,Rn OR register to Accumulator 0100 1rrr 1

ORL A,direct OR direct byte to Accumator 0111 0101 Direct address 2

ORL A,@Ri OR indirect RAM to Accumator 0101 011i 1

ORL A,#data OR immediate data to Accumulator 0100 0100 Immediate data 2

ORL Direct,A OR Accumulator to direct byte 0100 0010 Direc address 2

ORL Direct.#data OR immediate data to direct byte 0100 0011 Direct address Immediate data 3

XRL A,Rn Exclusive-OR register to Accumulator 0110 1rrr 1

XRL A,direct Exclusive-OR direct byte to Accumulator 0110 0101 Directs address 2

XRL A,@Ri Exclusive-OR indirect RAM to Accumulator 0110 011i 1

XRL A.#dat Exclusive-OR immediate data to Accumulator 0110 0110 Immediate data 2

XRL Direct,A Exclusive-OR Accumulator to direct byte 0110 0010 Direct address 2

XRL Direct,# data Exclusive-OR immediate data to direct byte 0110 0011 Direct address Inmediate data 3

CLR A Clear Acumulator 1111 0100 1

CPL A Complement Accumulator 1111 0111 1

RL A Rotate Accumulator Left 0010 0011 1

RLC A Rotate Accumulator Left through the Carry 0011 0011 1

RR A Rotate Accumulator Right 0000 0011 1

RRC A Rotate Accumulator Right through the Carry 0001 0011 1

SWAP A Swap nibbles within the Accumulator 1100 0100 1

TABLA 4.8 Instrucciones de Transferencia de Datos

MOV A,Rn Move register to Accumulator 1110 1rrr 1

MOV A,direct Move direct byte to Accumulator 1110 0101 Direct address 2

MOV A,@Ri Move indirect RAM to Accumulator 1110 100i 1

MOV A,#data Move immediate data to Accumulator 0111 0100 Immediate data 1

MOV Rn, A Move Accumulator to register 1111 1rrr 1

MOV Rn,,direct Move direct bute to regiter 1010 1rrr Direct address 2

MOV Rn,#data Move immediate data to regiter 0111 1rrr Immediate data 1

MOV Direct,A Move Accumulator 1111 0101 Direct address 2

MOV Direct,Rn Move register to direct byte 1000 1rrr Direct address 2

Page 51: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 51-

MOV Direct,direct Move direct to direct 1000 1010 Dir. Addr. (src) Dir. Addr (dest) 3

MOV Direct,@Ri Move indirect RAM to direct byte 1000 011i Direct address 2

MOV Direct,# data Move immediate data to direct bute 0111 0101 Direct address Immediate data 3

MOV @Ri,A Move Accumulator to indirect RAM 1111 011i 1

MOV @Ri,direct Move direct byte to indirect RAM 1010 011i Direct address 2

MOV @Ri,# data Move immediate data to indirect RAM 0111 011i Immediate data 2

MOV DPTR,#data 16 Load data pointer with a 16-bit constant 1001 0000 Immed. Data 15-8. Immed. Data 7-0 3

MOVC A,@A+DPTR Move code byte relative to DPTR to Acc 1001 0011 1

MOVC A,@A+PC Move code byte relative to PC to Acc 1000 0011 1

MOVX A,@Ri Move External RAM (8-bit addr) to Acc 1110 001i 1

MOVX A,@DPTR Move External RAM (16-bit addr) to Acc 1110 0000 1

MOVX @Ri,A Move Acc to external RAM (8-bit addr) 1111 001i 1

MOVX @DPTR,A Move Acc to External RAM (16- bit addr) 1111 0000 1

PUSH Direct Push direct byte stack 1100 0000 Direct address 2

POP Direct Pop direct byte from stack 1101 0000 Direct address 2

XCH A,Rn Exchange regiter with Accumulator 1100 1rrr 1

XCH A,direct Exchange direct byte with Accumulator 1100 0101 Direct address 2

XCH A,@Ri Exchange indirect RAM with Accumulator 1100 011i 1

XCHD A,@Ri Echange low-order digit indirect RAM with Acc

1101 011i 1

Tabla 4.9 instrucciones booleanas

CLR C Clear Carry 1100 0011 1 12

CLR Bit Clear direct bit 1100 0010 Bit address 2 12

SETB C Set Carry 1101 0011 1 12

SETB Bit Set direct bit 1101 0010 Bit address 2 12

CPL C Complement Carry 1011 0011 1 12

CPL BiT Complement direct bit 1011 0010 Bit address 2 12

ANL C.bit AND direct bit to Carry 1000 0010 Bid address 2 24

ANL C,/bit ANDcomplement of direct bit to Carry 1011 0000 Bid address 2 24

ORL C,bit OR direct bit to Carry 0111 0010 Bid address 2 24

ORL C,/bit OR complement of direct to Carry 1010 0000 Bid address 2 24

MOV C,bit Move direct bit to Carry 1010 0010 Bid address 2 12

MOV Bit, C Move Carry to direct bit 1001 0010 Bit address 2 24

JC Rel Jump if Carry is set 0100 0000 Rel address 2 24

JNC Rel Jump if Carry not set 0101 0000 Rel address 2 24

JB Bit,rel Jump if direct bit is set 0010 0000 Bit address Rel, address 3 24

JNB Bit,rel Jump if direct bit is not set 0011 0000 Bit address Rel, address 3 24

JBC Bit,rel Jump if direct bit is set & clear bit 0001 0000 Bit address Rel, address 3 24

Tabla 3.10 Instrucciones de Salto

ACALL Addr 11 Absolute Subroutine Call a10 a9 a8 1 0001 a7 a6 a5 a4 a3 a2 a1 a0 2

Page 52: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 52-

LCALL Addr 16 Long Subroutine Call 0001 0010 addr15-addr8 addr7-addr0 3

RET Return from Subroutine 0010 0010 1

RETI Return from interrupt 0011 0010 1

AJMP Addr 11 Absolute jump a10 a9 a8 0 0001 a7 a6 a5 a4 a3 a2 a1 a0 2

LJMP Addr 16 Long jump 0000 0010 addr15-addr8 addr7-addr0 3

SJMP Rel Short jump (relative addr) 1000 0000 rel.address 2

JMP @A+DPTR Jump indirect relative to the DPTR 0111 0011 1

JZ Rel Jump if Accumulator is zero 0110 000 rel.address 2

JNZ Rel Jump if Accumulator is not zero 0111 0000 rel.address 2

CJNE A,direct,rel Compare direct byte to Acc and jump if not Equal

1011 0101 diret.address rel.address 3

CJNE A,#data , rel Compare immediate to Acc and jump if not Equal

1011 0100 immediate data rel.address 3

CJNE Rn,#data,rel Compare immediate to registrer and jump if not Equale

1011 1rrr immediate data rel.address 3

CJNE @R1,#data,rel Compare immediate to indirect and jump if Not Equale

1011 010i immediate data rel.address 3

DJNZ Rn,rel Decrement register and jump if Not Zero 1101 1rrr rel.address 2

DJNZ Direct,rel Dcrement direct byte and jump if Not Zero 1101 0101 direct address rel.address 3

NOP No operation 0000 0000 1

Page 53: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 53-

Capitulo 5

Presentación del Software y Equipo de Desarrollo

CROSS-ASSEMBLER

• El ensamblador (AVMAC51) traslada mnemónicos, pseudooperaciones, y direcciones

simbólicas, a código de operación a nivel maquina, y direcciones numéricas así como

manejo de macros, directivas de procesador y directivas condicionales de ensamblador.

• EL encadenador (AVLINK) habilita la utilización por segmentos para código

relocalizable (así como absoluto), datos. Etc. así como modularización de archivos

fuente.

• Las librerías (AVLIB) colecta múltiples modules objeto para simplificar el

encadenamiento.

• El generador de reportes cross-reference (AVREF) ayuda en la coordinación de

proyectos grandes.

• EL (HEXFORM) formateador de archivos HEX, produce un archivo binario, o un archivo

HEX revisado.

Page 54: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 54-

EL ENSAMBLADOR AVMAC51

El AVMAC51 es un programa, que acepta como entrada un archivo hecho en un

editor de texto, con código fuente en lenguaje ensamblador del 8751, el cual tiene una

extensión .ASM

El AVMAC51, primero procesa el archivo, desarrolla los macros, y después lo

ensambla.

El AVMAC51 genera un archivo listado (FILE.PRN), y un archivo objeto (FILE.OBJ) en

código maquina. Opcionalmente puede generar un archivo con expansión de macros (.MXP)

utilizando la operación MACFILE (filename).

Puede generarse un archivo CROSS-REFERENCE (FILE.XRF) usando la opción XREF.

EJEMPLOS:

AVMAC51 file.asm

AVMAC51 file.asm NOMACEVAL ; Lo procesa y lo ensambla.

AVMAC51 file.asm NOPROCESS ; Lo ensambla únicamente.

AVMAC51 file.asm ALLPUBLIC ; Lo preprocesa únicamente.

AVMAC51 file.asm XREF1 ; Genera un .XRF

AVMAC51 file.asm MACFILE(filename) ; Genera un .MXP

EL MANEJADOR DE LIBRERIAS AVLIB Es un programa que coordina numerosos archivos objeto dentro de una librería,

“File.lib”, facilitando el encadenamiento de módulos objetos frecuentemente usados.

EJEMPLO:

AVLIV routines.lib = one.obj, two.obj, tree.obj

Donde one.obj, two.obj, tree.obj son archivos objeto previamente ensamblados y

son incluidos en la librería llamada routines.lib.

Page 55: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 55-

EL ENCADNADOR AVLINK El encadenador es un programa que acepta como entrada uno o varios módulos

objeto, y produce un solo modulo de salida, encadenado, con código relocalizado y listo

para ser cargado en memoria.

El AVLINK entrega un archivo de salida en formato .HEX (INTEL), o

.MOT(MOTOROLA) ó .TEK(TEKTRONICS).

Así como un archivo .MAP el cual muestra las localidades de segmentos y símbolos.

EJEMPLOS:

AVLINK outfile=file.obj

AVLINK outfile=one.obj, two.obj, rutinas.obj

AVLINK outfile=file.obj OF=MOT

AVLINK outfile=infile.obj -SYMBOLS ;genera un .SYM

EL CROSS-REFERENCE REPORT GENERATOR AVREF

Es una ayuda muy útil, particularmente en la generación de proyectos grandes con

múltiples archivos y/o segmentos.

La entrada a AVREF es un archivo .SYM y uno o más archivos .XRF y la salida es un

reporte .RPT, el cual contiene información detallada de los segmentos, procedimientos y

símbolos locales y públicos.

El .XRF se genera ensamblando con la opción XREF

AVMAC51 file.asm XREF

El .SYM se genera encadenando con la opción –SYMBOLS

AVLINK fileout=file1.obj -SYMOLS

El reporte se genera

AVREF filename=fileout.sym,file1.xrf

Page 56: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 56-

HEX FILE FORMATER

Normalmente el archivo .HEX se genera en el orden que los módulos fueron

cargados.

Hexform permite soportar el archivo .HEX y tiene una sola salida en forma Binaria o

hexadecimal.

EJEMPLO:

HEXFORM filename=filein.hex -> .BIN

HEXFORM filename.hx2=filein.hex -TOHEX -> .HEX

***** PSEUDO - OPS *****

Usando los pseudo-op DEFSEG y SEGs...

Note que "DEFSEG" define un nombre para un segmento (llamado un segmento definido

por el usuario), mientras "SEG" es colocado dentro de un segmento. Usted permanece en

un segmento hasta que usted lo especifica (usando otro pseudo-op "SEG") que usted desea

estar en un segmento diferente.

DEFSEG nombre_del_segmento_1

SEG nombre_del_segmento_1

db 1

DEFSEG nombre_del_segmento_2

SEG nombre_del_segmento_2

db 2

Usted puede asignar atributos a un segmento especificando el atributo "ABSOLUTE"

permite el uso de la palabra "ORG" (origen del inicio de dirección absoluta) dentro del

segmento.

DEFSEG NOMBRE_SEGMENTO, ABSOLUTE

SEG NOMBRE_SEGMENTO

ORG 100H

db 3

ORG 200H

db 4

Page 57: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 57-

El pseudo-op "ORG" puede ser ademas usado en un segmento relocalizado el cual

tiene el atributo "START=", pero si el segmento reside completamente dentro de un

modulo. Si el "ORG" es usado en un segmento relocalizable, del tipo "START=" en mas de

un modulo, entonces ese segmento debera ser “OVERLAID".

Note que usted puede usar opciones AVLINK en segmentos relocalizables, pero no

en segemntos "ABSOLUTES" y eso lo deberá advertir el encadenador (linker) si usted

sobreescribir segmentos relocalizables pero no si un segmento "ABSOLUTE" sobreescribe

cualesquier otro segmento.

DEFSEG SEG_RELOC, START=250H

SEG SEG_RELOC

db 5

ORG 300H

db 6

Desde que "SEG_RELOC" es relocalizable el siguiente segmento causa un preventivo

(warning) 'sobreescritura' al tiempo de encadenar (AVLINK) . . .

DEFSEG segover, start=2F0H

seg segover

db 7

El atributo "OVERLAID" puede ser usado solamente por el mismo nombre del segmento

en mas de un modulo . . .

DEFSEG segol, OVERLAID

seg segol

db 55H

Uso del atributo "CLASS=" . . . Usted puede asignar cualesquier atributo clase aplicable

con la oración "CLASS="

DEFSEG seg1code, CLASS=CODE

SEG seg1code

db 8

Page 58: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 58-

Usted pude asignar un segmento a la clase "DATA" . . .

DEFSEG seg1data, CLASS=DATA

SEG seg1data

db 9

Algunos chips usan otras clases, por ocasiones la clase "PAGE0", con la cual coloca datos

en pagina0 . . .

; DEFSEG segzero, CLASS=PAGE0

; SEG segzero

; db 1

Note que cualquier CLASS aplicable a un chip tiene un nombre de segmento predefinido

conocido para el ensamblador, por ejemplo:

SEG CODE

db 0AH

SEG DATA

db 0BH

Note que el campo de la dirección del file '.PRN' mostrara después de la dirección:

& -> Para un segmento definido por el usuario

' -> Para un segmento predefinido como CODE

'' -> Para un segmento predefinido como DATA

@ -> (Si es aplicable) para un segmento predefinido PAGE0

* -> Para una etiqueta externa

Usted puede especificar la alineación de un segmento, usando el atributo "ALIGN=", donde

el valor deberá ser una potencia de 2 --

DEFSEG segalign, ALIGN=100H

SEG segalign

db 0DH

Usted puede además especificar el tamaño del bloc de un segmento, usando "BLOCK="

donde el valor deberá ser una potencia de 2 --

DEFSEG segblock, BLOCK=200H

Page 59: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 59-

SEG segblock

db 0EH

(Para propósitos de compatibilidad, ciertos sinónimos han sido agregados como pseudo-

ops validos. Esos deberán ser notados en las siguientes tres secciones.)

USO DE LOS pseudo-ops DS DB, DW, ...

DS es usado para reservar un cierto numero de espacio de BYTES sin inicializar . . .

DS 8

RMB y DEFS son sinónimos de DS..

RMB 6

DEFS 4

DW define un numero de 16-bit,

DW 123H

DW puede definir mas de una palabra...

DW 123H, 456H, 789H

DEFW es una sinónimo de DW...

DEFW 5

DEFW 100H, 256

FDB es como DW, excepto que además permite dos o más comas consecutivas previendo

un valor cero entre cada dos comas . . .

FDB 1,2,,3,,,4

DB define un byte a la vez

DB 4

DB 1,2,3

DB es además usado para textos (strings) de código ASCII . . .

DB "hola, Tecnológico"

; DEFB y DEFM son sinónimos de DB...

DEFB 1, 2, "hello"

DEFM 'world', 3

FCB es como DB, excepto (como en FDB) que además permite dos o más comas

consecutivas, previendo valor de cero entre cada dos comas . . .

FCB 5,,6,7

FCC es un pseudo para definir un texto con dos sintaxis validas. En el primero un numero

decimal seguido por una coma, que indica que esta iniciando el siguiente carácter

(diferente de espacio o tab), un texto del numero indicado de caracteres será tomado.

FCC 4,string

Page 60: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 60-

FCC 10,string

Note que el texto "string" no es tan largo como el numero indicado, será recortado

cuando sea menor y se le agregaran espacios (caracteres) cuando sea mayor; el numero

mas alto permitido es 132.

En la segunda sintaxis permitida del primer carácter después del pseudo-op FCC es

considerada el limite del texto; hasta que ese carácter sea visto, el texto continuara siendo

procesado.

FCC /monday/

FCC zmondayz

FCC 7monday7

FCC &monday&

Uso de EQU y TEQ...

Usted puede igualar un símbolo con un valor numérico usando las directivas EQU y TEQ. El

psuedo-op EQU simplemente asigna un valor a una etiqueta, mientras que TEQ permite

además que la misma etiqueta sea redefinida tiempo después.

labelname EQU 2

labeltwo TEQ 3

labeltwo TEQ 4

SET, ASET y DEFL son sinónimos de TEQ..

labeltwo SET 5

labeltwo ASET 5

labeltwo DEFL 6

Note que cualquier etiqueta "DEBERA" iniciar en la columna 1.

Uso de PUBLIC y EXTERN...

Usted puede usar usa símbolos atraves de módulos (ej., programas en archivos fuentes

separados) usando los pseudo-ops PUBLIC y EXTERN.

El pseudo-op PUBLIC es usado para indicar un símbolo el cual es definido en el presente

modulo para el cual será tomado como referencia desde un modulo diferente

PUBLIC otherlabel

otherlabel DB 5

Note que usando la opcion ALLPUBLIC hará que todas las etiquetas usadas en el presente

modulo sean como PUBLIC.

Page 61: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 61-

XDEF y GLOBAL son sinónimos de PUBLIC.

Para tomar como referencia un símbolo que es definido en otro modulo, use el pseudo-op

EXTERN ...

EXTERN outlabel

Usando la directiva EXTERN permite que la etiqueta sea usada en el presente modulo, aun

cuando no esta definida allí.

Sinónimos de EXTERN incluyen EXT, EXTRN, EXTERNAL, y XREF.

Uso de PROCedures...

Usando PROC permite el uso local de símbolos, esto es, símbolos cual identidad es

conocida solamente entre lo que precede a PROC y antes de ENDPROC.

proclab PROC

L?local db 5

ENDPROC

proc2lab PROC

L?local db 6

ENDPROC

Note que el símbolo 'L?local' no causa un error 'multiply-defined symbol'. Note además,

que los símbolos locales deberán iniciar con L?

END...

El pseudo-op END deberá aparecer en un archivo (file) hasta el final del mismo (el

ensamblador terminara su trabajo al reconocer END).

END

Page 62: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 62-

Capitulo 6 Control de Puertos de Entrada y Salida

6.1 INTRODUCCION:

Los cuatro puertos del 8052/8051 son bidireccionales, es decir, permiten la lectura y

escritura en el periférico correspondiente. Las salidas están <<latcheadas>>, lo que

permite mantener el dato indefinidamente hasta que sobre escriba la información original.

Otra característica importante es que los puertos pueden ser utilizados como buses

de direcciones, datos y control, debido a estas caracteristicas se dice que el

microcontrolador puede trabajar como microprocesador.

6.2 EL MICROCONTROLADOR COMO MICROPROCESADOR

Los drivers de salida de los puertos P0 y P2 y los buffers de entrada del puerto P0 se

pueden utilizar para acceder a la memoria externa del sistema. En estas condiciones, el

puerto P0 se configura como salida del byte bajo del bus de direcciones (A0 a A7), de un

bus que consta de 16 bits (capacidad de direccionamiento 64K). Multiplexado en el tiempo

como bus de datos bidireccional (D0 a D7). El puerto P2 se configura como salida del byte

alto del bus de direcciones (A8 a A15). De esta manera el microcontrolador se configura a

modo de CPU de un sistema externo con unas capacidades de expansión definibles por el

usuario naturalmente, en estas condiciones, le queda como puerto íntegro, para el control

de periféricos, el puerto P1 y parte del puerto P3, puesto que hay señales que se utilizan

para el control del sistema (bus de control).

En la figura 6.1 se muestran los cronogramas correspondientes a un ciclo de lectura

en la memoria externa de programas y a un ciclo de lectura y escritura en la memoria de

datos externa. También, se hace referencia a los parámetros representados en la figura 6.1

y en el cuadro 6.1 sin hacer mención a los tiempos reales que dependen del tipo de

microcontrolador y de la frecuencia de trabajo.

Page 63: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 63-

Page 64: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 64-

Para una mayor información consulte las hojas de características en donde se

establecen los tiempos de los parámetros según condiciones y las características eléctricas

de las señales.

Para un mejor entendimiento y seguimiento de los cronogramas anteriores, en la

figura 6.2 se dibuja un esquema en el que aparece el microcontrolador comandando una

memoria RAM (43256C) y una memoria EPROM (2764).

6.2.1 Ciclo de lectura en la memoria externa de programas

Para acceder a la memoria externa de programas utiliza la señal PSEN (Program

Store Enable) como señal de autorización de lectura (Figura 6.1 (A) y 6.2).

La señal <<latchea>> el byte bajo del bus de direcciones en el primer estado (ciclo

de reloj), y así permite direccionar, durante todo el ciclo de instrucción, mientras esas

mismas líneas son utilizadas, en el resto del ciclo de instrucción, como bus de datos. En la

Figura 6.2 se puede observar que la lectura en la memoria de programas se realiza cuando

PSEN está a nivel bajo y las líneas A13, A14 y A15 se encuentran a nivel alto, siendo el resto

de las líneas de dirección las que establecen la posmen exacta del byte de instrucción u

operando que ha de ser leído.

Para el acceso a la memoria de programas, utiliza los 16 bits del bus de direcciones,

su posición en el mapa general de memoria es la que se encuentra al final de los 64 Kbytes,

puesto que A15=A14=A13=1, concretamente comienza en la posmen

1110.0000.0000.0000=E000H y termina en la posmen FFFFH, en total 8 Kbytes.

Si el usuario escribe en el Puerto P0 durante el ciclo de búsqueda en la memoria

externa, el byte de código puede ser modificada. Se recomienda no escribir en el Puerto P0

si es utilizada para leer en la memoria de programa externa.

A la memoria de programas externa se accede bajo dos condiciones:

1. Cuando la señal EA es activa, caso de la Figura 6.2

2. Cuando el contador de programa (PC) contiene un número más grande que 0FFFH para

el 8051 o para el 8052.

En las versiones de microcontroladores sin ROM (8031 y 8032) tienen la señal de control EA

puesta a nivel bajo permanentemente para leer el programa en la memoria externa.

Page 65: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 65-

Figura 5.2

5.2.2 Ciclo de lectura en la memoria externa de datos

Para el acceso a la memoria externa de datos utiliza la señal de control RD (función

alternativa de P3.7) y puede utilizar los 16 bits de dirección (M0VX A,@DPTR) o bien 8 bits

(MOVX A,@Ri) (véase Figura 5.1 (B) ).

En un ciclo de lectura el byte de entrada es aceptado en el Puerto P0 justo antes de

que la señal de control RD que autoriza la lectura sea desactivada.

6.2.3. Ciclo de escritura en la memoria externa de datos

Para la escritura en la memoria externa de datos utiliza la señal de control

WR(función alternativa P3.6) y puede utilizar los 16 bits de dirección (MOV @DPTR.A) o bien

8 bits (MOV @Ri) (Figura 8.1.(C)).

En el ciclo de escritura, el byte de dato debe permanecer sobre el Puerto P0 antes y

después de que la señal de control de escritura WR sea desactivada.

En general, tanto para la lectura como para la escritura, cuando una dirección de 16

bits es utilizada (MOVX @DPTR), el byte alto de dirección sale por el Puerto P2, donde

permanecerá mientras dura el ciclo de lectura o escritura.

Page 66: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 66-

Si se utiliza una dirección de 8 bits (MOVX @Ri), el contenido del Puerto P2 en el SFR

permanece sobre los pines de P2 durante todo el ciclo de acceso a la memoria externa.

Resumiendo, si se utilizan los puertos para comandar unidades de memoria externa

o interface, los puertos quedarán en esta situación:

P0: Bus de direcciones bajas (A0 a A7) y bus de datos (D0 a D7) multiplexados en el

tiempo.

P1: puerto de E/S.

P2: Bus de direcciones altas (A8 a A15).

P3: Bus de control.

6.3 OPERACIÓN DE ESCRITURA EN LOS PUERTOS DE LOS Micros

La operación de escritura, utilizando los puertos del Micro, puede ser realizada por

cualquiera de ellos; no obstante, el puerto P0 es el que presenta una mayor cargabilidad,

permitiendo comandar ocho cargas TTL-LS, mientras que los otros tres permiten cuatro

cargas TTL-LS.

En la ejecución de una instrucción que cambia el valor del latch del puerto, el nuevo

valor llega al latch durante el estado 6, fase 2 del final del ciclo de instrucción, según indica

la Figura 6.3

Antes de comenzar con el estudio y comprobación de los puertos de E/S, se dibuja la

interface para la conexión de los puertos a los dispositivos de salida, que en un principio

pueden servir unos simples LED (Figura 6.4).

Para controlar cargas de mayor consumo de energía, como relés, se recomienda

utilizar, entre el puerto y la carga, drivers no inversores, como el ULN 2003, e inversores,

como el ULN 2803, que tienen una cargabilidad de 500 mA y soportan hasta 50v.

Page 67: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 67-

Figura 6.3

Figura 6.4

Como ya se sabe, el 8052/8051 presenta dos señales de control, una para ejecutar

la lectura (RD) y otra para la escritura (WR). Por esto la activación de estas señales

depende del formato de la instrucción. Para la operación de ESCRITURA en el puerto, la

instrucción más habitual es la siguiente:

MOV PX, <DATO> ; PX <DATO>

X toma valores 0, 1, 2 y 3 según el puerto.

Admitiendo <DATO> todos los tipos de direccionamiento estudiados en el capítulo 3.

EJEMPLO 6.1 El puerto P0 en modo de salida

Este ejercicio muestra cómo se deben tratar los cuatro puertos cuando se tiene que enviar una

información de salida al microcontrolador. Una operación de escritura. El ejercicio se realiza con el

puerto P0. Pero el usuario puede comprobar que el programa funcionará igual si sustituye el puerto P0

por el P1, P2 ó P3.

El programa muestra distintas formas de escritura en el puerto. Asi:

• En las primeras instrucciones, mediante una máscara, se ponen todos los bits del puerto P0 a

CERO.

• Se incrementa el acumulador y se transfiere al Puerto P0, por lo que el contenido de dicho puerto

se incrementará, así hasta contar hasta 5.

• Direccionando directamente los bits 0 y 2 del Puerto P0, que en la última operación habían

quedado a UNO, se pone a CERO. En este instante todos los bits de P0 están a CERO.

• SE PONE A uno el bit 7 de P0 y con direccionamiento inmediato se carga P0 con 55H.

Page 68: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 68-

• Finalmente, se complementa (operación lógica NOT) la información de P0 cambiando los UNOS por

CEROS y los CEROS por UNOS.

Se observará que entre las distintas operaciones se ha incluido un lazo de retardo para poder

seguir la evolución de la secuencia anteriormente descrita.

;************************************************************** ;* PROGRAMA 1 PUERTOS * ;**************************************************************

ORG 0H MOV A, # 00H ;Pone a cero ACC. MOV R0, A ;Poner a cero registro 0

ANL P0, A ;pone a cero P0 CALL RETAR1 ;producir retardo

SALO: INC A ;Incrementa ACC MOV P0, A ;escribe en el puertoP0 CALL RETAR1 CJNE A, #05H, SALO ;Si se han realizado 5 incremento de P0 sale CLR P0.0 ;Pone el bit o de P0 a cero

CLR P0.2 ;Pone el bit2 de P0 a cero. CALL RETAR1 SETB P0.7 ;Pone el bit 7 de P0 a UNO. CALL RETAR1 MOV P0,#55H ;Carga P0 con 55H CALL RETAR1 MOV A,#0FFH XRL P0,A ;Complementa P0 NOP

RETAR1: MOV RO, #4OH ;Se CARGA el registro R0 con #40H SAL0: MOV R1, #85H ;Se CARGA R1 con #85H SAL1: MOV R2, #FFH ;Se CARGA R2 con #FFH SAL2: DJNZ R2, SAL2 ;Decrementa R2 y repite el lazo hasta que R2=0

DJNZ R1, SAL1 ;lo mismo que la instrucción anterior, pero por cada ;lazo de R1, ejecuta FFH veces el lazo R2

DJNZ R0, SAL0 ;Lo mismo que las instrucciones anteriores, pero por ; cada lazo de R0, ejecuta 85H lazos de R1 y 85H FFH ;lazo de ;R0

RET END

6.4 OPERACIÓN DE LECTURA EN LOS PUERTOS

La operación de lectura o de adquisición de datos no representa ningún tipo de

problema; solamente se deberá cambiar el orden de los operandos en la instrucción

respecto a la operación de escritura.

Para la operación de lectura, el formato de la instrucción más habitual es el siguiente:

MOV <DATO>, PX ; <DATO> PX

Se presentan dos circuitos de interface muy sencillos para poder introducir datos a

los puertos del microcontrolador, cuando éste trabaja en modo lectura. El primero, muy

simple, es útil para la comprobación de la mayor parte de los ejercicios que aquí se

exponen; no obstante, tiene el problema de los <<rebotes>>(Figura 5.5). El segundo

circuito está pensado especialmente para los ejercicios que se refieren al tema de las

Page 69: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 69-

interrupciones. Este circuito es, hasta cierto punto, inmune a los rebotes de los contactos

(Figura 6.6).

6.2 operación de lectura en el puerto P0 y de escritura en el puerto P1

Este ejercicio trata de mostrar cómo se manipula el Puerto P0 para utilizarlo como

entrada y el P1 como salida, de tal forma que la información leída por el Puerto P0 y

después de ser tratada adecuadamente sale escrita por P1. En este caso concreto, la

información leída por P0 sale por P0 sale intacta por el Puerto P1.

En la figura 5.7 se muestra la disposición de ambos puertos.

Figura 5.5

Figura 5.6

Page 70: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 70-

DEFSEG INOUT,ABSOLUTE SEG INOUT

ORG 0H MOV A,P0

MOV P1,A END

EJEMPLO 6.3 LECTURA Y ESCRITURA EN EL MISMO PUERTO

Este ejercicio muestra cómo se puede realizar la operación de lectura y escritura por

el mismo Puerto P0. Para ello dividimos el Puerto P0 en dos nibbles, el nibbles bajo (P0.0 a

P0.3) leerá la información que se sacará por el nibbles alto (P0.4 a PO.7) (Figura 6.8).

Page 71: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 71-

DEFSEG BIT4,ABSOLUTE

SEG BIT4

ORG 0H

START: MOV A,P0

SWAP A

MOV P0,A

AJMP START

END

En la línea 1, se hace la lectura del Puerto P0 y su contenido pasa al acumulador,

En la línea 2, se intercambian los nibbles.

En la línea 3, el contenido del acumulador se carga en el puerto P0, con lo que la lectura del

nibbles bajo pasará al nivel alto del puerto P0, y viceversa.

La línea 4 es un salto incondicional al comienzo del programa.

Page 72: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 72-

Ejemplo 6.4 Con trol de un Proceso Industrial Elemental

El siguiente ejercicio muestra cómo realizar el control de un proceso industrial muy

simple, utilizando el CPU del Microcontrolador para la toma de decisiones, la memoria para

almacenar las instrucciones del programa y los datos, y los puertos, uno (de lectura) para

comprobar la situación de los sensores y el otro (de escritura) para enviar la señal a los

actuadores.

PROCESO

Se trata de controla el nivel de líquido de un depósito, utilizando tres sensores

detectores de niveles A,B y C, Y DOS BOMBAS B1 Y B2 (Figura 5.9)

He aquí una descripción del proceso, desde el punto de vista de su relación con el mundo

exterior, según los tres tipos de señales principales:

• Entrada de información: SENSORES.

• Actuación sobre los elementos finales: ACTUADORES.

• Señalización del proceso: INDICADORES.

Page 73: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 73-

1. Sensores (entradas)

El sensor A señala el nivel mínimo de agua. Por debajo de este nivel, se indicará

<<VACIO>> en el cuadro de INDICADORES.

El sensor B señala el nivel óptimo y cuando se alcance se indicará <<LLENO>>.

El sensor C señala el nivel peligroso e indica <<REBOSE>>.

Los sensores serán leídos por el microcontrolador a través del Puerto P0

P0.0 A

P0.1 B

P0.2 C

2. ACTUADORES (salidas)

Cuando ninguno de los sensores estén mojados, se entiende que el depósito está vacío y

los actuadores activarán las dos bombas B1 y B2 (P1.0 y P1.1).

Cuando el nivel del líquido toque la sonda B, se desactivará la bomba B2

(P1,0 0).quedando la bomba B1 activada en modo mantenimiento.

Si el nivel de líquido moja la sonda C (rebose), se desactivará la bomba B1, quedando

las dos bombas, de momento, fuera de servicio.

3. INDICADORES (salidas)

La señalización utiliza el puerto P1.

P1.2 VACIO

P1.3 LLENO

P1.4 REBOSE

Y cuando se produce un fallo (mal funcionamiento) en las sondas de entrada. Por ejemplo,

que el sensor B (P0.1) se active cuando el sensor A (P0.0) no lo está, se excita en el cuadro

de indicadores de señal de ALARMA.

P1.2 ALARMA

La figura 5.10 muestra la disposición de los actuadores, indicadores y sondas.

DEFSEG CONTROL,ABSOLUTE SEG CONTROL ORG 0H MOV DPTR,#0100H ;Inicialización puntero de TABLA SAL0: MOV A, P0 ;LEE puerto P0 ANL A, #07H ;Enmascara MOVC A, @A+DPTR ;Direcciona y captura dato MOV P1, A ;Actúa JMP LEE ORG 0100H DB 07H, 03H, 20H, 09H 20H, 20H, 20H, 18H END

Page 74: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 74-

Como se puede observar, el programa utiliza el direccionanmiento indexado para

acceder a la información escrita previamente el la tabla de datos, situada en las posiciones

de memoria comprendidas entre la 0100H y 0107H.

• El primer bloque del flujograma inicializa el puntero DPTR en la dirección de comienzo de

la tabla de datos.

• El segundo bloque lee la información de las sondas a través del Puerto P0.

• El tercer bloque enmascara la información del puerto P0, dejando solamente los tres

primeros bits útiles de P0.

• El cuarto bloque direcciona a la posición de memoria de la tabla relativa al contenido de

las sondas (ACC) más (suma aritmética) el puerto DPTR. El contenido de esa posición de

memoria direccionada pasa al acumulador.

Es decir, si el estado de las sondas señala A=1, B=1 y C=0 (03H), se realiza el siguiente

acceso a la tabla de datos:

A @A+DPTR, es decir, A (03H + 0100H)

El contenido de la posmem 0103H para el acumulador.

• El quinto bloque escribe la información leída de la tabla en el Puerto P1.

El contenido de la tabla, según las directrices dictadas por el algoritmo de control de la

planta, es el siguiente:

0100H 07H ; Activa B1-B2 y señala VACIO 0101H 03H ; Activa B1-B2 y no señala VACIO 0102H 20H ; Señala ALARMA 0103H 09H ; Desactiva B2 y señala LLENO 0104H 20H ; Señala ALARMA 0105H 20H ; Señala ALARMA 0106H 20H ; Señala ALARMA 0107 18H ; Señala LLENO y REBOSE

ENTRADAS SALIDAS P0.2 P0.1 P0.0 P1.7 P1.6 P1.5 P1.4 P1.3 P1.2 P1.1 P1.0

C B A N.C N.C AL RE LL V B2 B1 0 0 0 0 0 0 0 0 1 1 1 0 0 1 0 0 0 0 0 1 1 1 0 1 0 0 0 1 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 1 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 1 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0

Page 75: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 75-

INTERRUPCIONES

La comunicación asíncrona de los sistemas periféricos con el microcontrolador, en

ambas direcciones se puede establecer de dos maneras fundamentales:

1. Consultas(polling): Se comprueban cíclicamente, mediante instrucciones del programa,

los dispositivos de estado de los dispositivos de E/S. Unas líneas de diálogo (hands-

hake) establecen el protocolo de comunicación.

2. Interrupción: Servicio directo entre periféricos y Microcontrolador, siempre que éste

desee establecer el diálogo. Este servicio tiene la característica de la inmediatez, pueden

eliminarse total o parcialmente los ciclos de consulta y permite inhibir la interrupción

cuando se considere que es <<inoportuna>> y, por tanto, perjudicial para la marcha del

proceso.

Esta forma de trabajo es inherente al control de procesos en tiempo real.

Así, en la fig. 2, cuando el periférico 1 requiere la intervención del microcontrolador

activa la interrupción INT1, si está habilitada el sistema atenderá la petición y ejecutara el

programa correspondiente de atención el la Rutina 1. El mismo procedimiento se

establecería para el periférico 2.

La importancia de las interrupciones nace de la necesidad de ejecutar un subproceso

en el instante preciso, y por tanto se considera su intervención <<urgente>>. Cuando

termina la ejecución de este subproceso, el CPU vuelve al programa principal, continuando

su tarea cíclica justo donde la dejó.

Una interrupción puede ser iniciada:

• Por un periférico o circuito externo ajeno al microcontrolador. (Interrupción Externa)

• Dentro del propio microcontrolador. (Interrupción Interna)

Toda interrupción aceptada conduce a la ejecución de un subprograma específico cuya

dirección de comienzo se indica en la tabla de vectorización.

Cada una de las fuentes de interrupciones pueden ser individualmente habilitadas o

inhabilitadas poniendo a <<uno>> o a <<cero>. El bit correspondiente del registro IE

(Interrupt Enable Register) perteneciente a SFR (Special function Register).

Page 76: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 76-

REGISTROS DE INTERRUPCIONES.

Las interrupciones son controladas mediante la escritura en los registros IE

(Interruption Enable) e IP (Interruption Priority) los cuales físicamente son representados

en la Figura sig.

IE: Es un registro para habilitar las interrupciones, Permite que se atiendan todas las

interrupciones por el microcontrolador o sólo las que el usuario considere aceptables.

REGISTRO IE (Interrupt Enable Register.) b7 b6 b5 b4 b3 b2 b1 b0 EA X X ES ET1 EX1 ET0 EX0 BIT NOMBRE Y COMENTARIO b0 EX0: Control de Interrupción externa 0. (INT0).

- Si EX0 = 0 inhabilita la interrupción externa INT0

- Si EX0 = 1 Habilita la interrupción externa INT0

b1 ET0: - Si ET0 = 1 habilita interrupción del Timer0.

- Si ET0 = 0 inhabilita interrupción del Timer0.

b2 EX1: - Si EX1 = 1 habilita Interrupción externa 1 (INT1).

- Si EX1 = 0 inhabilita Interrupción externa 1 (INT1).

b3 ET1: - Si ET1 = 1 habilita interrupción del Timer1.

- Si ET1 = 0 inhabilita interrupción del Timer1.

b4 ES: - Si ES = 1 habilita interrupción del puerto serie.

- Si ES = 0 inhabilita interrupción del puerto serie.

Page 77: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 77-

b5 Reservada.

b6 Reservada.

b7 EA: - Si EA = 1 habilita individualmente a todas las interrupciones que en

este registro están a uno.

- Si EA = 0 no reconoce ninguna interrupción.

IP: Cada interrupción puede programarse individualmente en el nivel 1 o 2 de prioridad,

poniendo a 1 o a 0 los bits de este registro. Una interrupción de bajo nivel de prioridad se

puede interrumpir por otra de un nivel más alto. Una interrupción de alto nivel de prioridad

no puede ser interrumpida por otra interrupción de un nivel más bajo.

REGISTRO IP (Interrupt Priority Register.) b7 b6 b5 b4 b3 b2 b1 b0 X X PT2 PS PT1 PX1 PT0 PX0 BIT NOMBRE Y COMENTARIO b0 PX0: Si PX0=1 define alta prioridad la interrupción INT0.

b1 PT0: Si PT0=1 define alta prioridad la interrupción Timer 0.

b2 PX1: Si PX1=1 define alta prioridad la interrupción INT1.

b3 PT1: Si PT1=1 define alta prioridad la interrupción Timer 1.

b4 PS: Si PS=1 define alta prioridad la interrupción puerto serie.

b5 PT2 : - Si PS=1 define la prioridad a interrupción Timer2.

b6 Reservada.

b7 Reservada.

Fuente de Interrupción Bandera que Activa Externa 0…………… INT0 IE0 Timer 0……………… TIMER0 TFO Externa 1…………… INT1 IE1 Timer 1……………... TIMER1 TF1 Puerto Serie………... R1 RI Puerto Serie………… T1 TI

TABLA DE VECTORIZACION DE LAS INTERRUPCIONES

Fuente de Interrupción Dirección Externa 0…………… INT0 0003H Timer 0……………... TIMER0 000BH Externa 1…………… INT1 0013H Timer 1……………... TIMER1 001BH Puerto Serie………... R1 0023H Puerto Serie………… T1 0023H

Page 78: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 78-

En estas 8 direcciones se puede escribir el programa de atención a la interrupción o,

como es habitual, mediante un JMP se desvía a una zona de memoria de programa más

amplia.

EL PROCESO DE INTERRUPCION EN LOS MC 8751

Las banderas o indicadores de interrupción son muestreadas en el estado 5, fase 2

(S5P2) de cada ciclo máquina. El sistema de interrupciones del microcontrolador genera un

LCALL al apropiado vector de interrupciones. Esto se produce salvo que:

EJEMPLO: Este programa pretende simular el funcionamiento de luces deslizantes. Un bit se

desplaza de izquierda a derecha y de derecha a izquierda y excitara 8 leds situados a la

salida del puerto 0 (P0). Cuando por el pin 12(INT0), se presente una transición, el

microcontrolador ejecutara una rutina, asociada a la interrupción que consistirá en hacer

parpadear diez veces todos los leds del puerto 0 (P0), una vez concluida esta secuencia,

continuar con el programa principal de bits deslizantes.

DEFSEG INTER,ABSOLUTE SEG INTER ORG 0H JMP START ORG 3H JMP INTO ORG 30H START: MOV TCON,#01H ;Se programa la INT0 por transición

MOV IE,#081H ;Habilita interrupción INT0 MOV A,#00H ;Limpia Acumulador

SETB C SALTO1: RLC A MOV P0,A CALL RETARDO JNB ACC.7,SALTO1 SALTO2: RRC A MOV P0,A CALL RETARDO JNB ACC.0, SALTO2 JMP SALTO1 NOP RETARDO: MOV R1,#40H SALTO3: MOV R2,#0FFH DJNZ R2,$ DJNZ R1,SALTO3 RET

ORG 100H INTO PUSH ACC MOV A,PSW PUSH ACC MOV A,R0 PUSH ACC MOV R0,#0AH SALTO5: MOV P0,#0FFH CALL RETARDO

Page 79: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 79-

MOV P0,#00H CALL RETARDO DJNZ R0, SALTO5 POP ACC

MOV R0,A POP ACC MOV PSW,A POP ACC RETI END

Page 80: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 80-

TEMPORIZADORES Y CONTADORES

INTRODUCION:

El microcontrolador 8751 tiene dos registros temporizadores/contadores

denominados Timer 0 (T0) y Timer 1 (T1).

Los dos timer pueden ser configurados para que operen como temporizadores o

como contadores.

Cuando el dispositivo opera como timer, el registro contador se incrementa cada ciclo

máquina (la temporización se produce contando cada ciclo máquina hasta <<sobrepasar>>

el valor prefijado). Así, se puede considerara que funciona como un contador de ciclos

máquina, de tal forma que, como a cada ciclo máquina le corresponden 12 períodos de

reloj, la razón de contaje es 1/12 de la frecuencia del oscilador.

En la función como counter (contador), el registro es incrementado en respuesta a la

transición del nivel alto al nivel bajo (flanco decendente) de la señal externa aplicada al (pin

14) para el contador T0 y al (pin 15) para T1. La entrada externa es muestreada durante el

estado 5 de la fase 2(s5p2) de cada ciclo de máquina. El contador se incrementa cuando la

muestra señala un nivel alto de la señal de entrada en un ciclo y un nivel bajo en el

siguiente ciclo. El nuevo valor de contaje aparece en el registro correspondiente durante el

estado 3 de la fase 1(s3p1) del siguiente ciclo en que la transición ha sido detectada. Puesto

que necesita dos ciclos máquina (24 ciclos de reloj) para reconocer la transición del flanco

decendente, la máxima razón de contaje es 1/24 de la frecuenia del oscilador.

Los Timer 0 y 1 tienen cuatro modos de operación.

En la sig. Figura se observan cuatro bloques fundamentales que de izquierda a derecha se

van a exponer a continuación:

♦ En la parte superior izquierda aparece un dispositivo conmutador que selecciona la

forma de efectuar el <<contaje>>, mediante el oscilador del microcontrolador, o con un

reloj externo. La primera opción establece aplicaciones generales de tipo timer

(temporizador) y la segunda de tipo counter (contador).

♦ En la parte inferior izquierda se encuentra un circuito lógico que accona el interruptor

que permite el paso de los impulsos que incrementan los registros de contaje. Este

circuito permite dos opciones: activar el interruptor por software, para ello GATE=0 y

TR1=1, que son bit de imagen pertenecientes a los registros TMOD y TCON, o bien se

acciona por hardware con las señales de nivel alto, aplicadas al pin INT 1, estando

GATE=1 y TR1=1.

Page 81: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 81-

♦ En la parte central se encuentran los registros de contaje, que pueden ser de 8,13 ó 16

bits. Según el modo de trabajo (TL1,TH1).

♦ A la derecha de los contadores (TL y TH) se encuentra el bit de flag o bandera. TF1, que

señala el overflow o desbordamiento de los contadores.

♦ Finalmente, si la interrupción correspondiente está habilitada, se produciría una

interrupción.

TIMER 0 (T0) Y TIMER 1 (T1)

TH0-TL0 y TH1-TL1: Timer Register: son pares de registros de 16 bits, que pueden actuar

como temporizadores o contadores.

La función como Timer ó como Counter es seleccionada por el bit de control C/T

perteneciente al registro TMOD (Timer/Counter Mode Control Register). El registro TMOD no

es direccionable <<bit a bit>>. Estos dos timer tienen cuatro modos de operación y se

seleccionan mediante los bit (M0,M1) en el registro TMOD.

TMOD: Timer/Counter Mode Register: Selecciona el Timer 0 ó 1, el modo de operación

(Modo 0, 1, ó 2), si actúa como temporizador o como contador, etc.

Page 82: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 82-

REGISTRO TMOD B7 B6 B5 B4 B3 B2 B1 B0 GATE C/T M1 M0 GATE C/T M1 M0 Timer 1 Timer 0

BIT NOMBRE Y COMENTARIO

B0-B1 MODO M1 M0 MODO DE OPERACION

0 0 0 Temporizador de 13 bits.

1 0 1 Temporizador/Contador de 16 bits.

2 1 0 Temporizador/Contador de 8 bits con Auto-recarga.

3 1 1 Contadores múltiples específicos.

B2 C/t: Selecciona temporizador o contador.

Si C/T=0 entonces funciona como temporizador con los pulsos de reloj internos.

Si C/T=1 entonces cuenta los pulsos que llegan por T0 (pin 14)

B3 GATE: Habilita la entrada exterior INT0 (pin 12)

Si GATE=1 entonces habilita INT0 si TR0=1 control por Hardware.

Si GATE=0 entonces deshabilita INT) y depende exclusivamente de TR0.

(TR0 es un bit del Reg. TCON y se activa o desactiva por software).

B4-B5-B6-B7 Configuración del Timer 1. Igual que para el Timer 0, sustituyendo:

T0 por T1, INT0 por INT1 y TR0 por TR1

MODO 0: Temporizador/Contador de 13 bits.

Poniendo los bits M0=M1=0 en el registro TMOD se selecciona el modo de operación

cero (Modo 0). Cuando la cuenta, en los contadores, da una vuelta pasando desde todos

<<unos>> a todos <<ceros>>, se activa la flag de interrupción TFX (x=0 si se trata del

Timer 0 y x=1 si se trata del Timer 1), siendo éste un bit que pertenece al registro TCON

(Timer/Counter control register), registro direccionable bit a bit.

TCON: Timer/Counter Control Register: Este es un registro que controla fundamentalmente

el modo de operación de los Timer 0 y 1 en relación con las interrupciones y los flancos de

activación de los mismos.

REGISTRO TCON

B7 B6 B5 B4 B3 B2 B1 B0

TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0

BIT NOMBRE Y COMENTARIO

B0 IT0: Control de Interrupción externa 0. (INT0).

- Si IT0=0 entonces es activada por un nivel bajo.

- Si IT0=1 Entonces es activada por un flanco de bajada.

B1 IE0: Flag de interrupción para la interrupción externa 0 (INT0).

Page 83: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 83-

- Se pone a uno cuando se detecta interrupción externa.

- Se repone automáticamente al atender la interrupción por flanco.

B2 IT1: Control de Interrupción externa 1 (INT1).

B3 IE1: Flag de interrupción externa 1 (INT 1).

B4 TR0: Habilita temporizador/contador 0.

- Si TR0=1 entonces habilita temporizador/contador 0.

- Si TR0=0 entonces deshabilita temporizador/contador 0.

B5 TF0: Flag de overflow del Timer 0.

- Se repone automáticamente al atender la interrupción

B6 TR1: Habilita temporizador/contador 1.

B7 TF1: Bandera de Overflow del Timer 1.

La autorización para contar pulsos, procedentes del reloj interno o bien del pin 15

(T1) (actuando como contador), se produce en el Timer 1, cuando TR1=1 y las entradas

GATE=0 o INT1=1.

Una aplicación podría ser, para medir el ancho de pulso a través del pin INT1 ó INT0.

EJEMPLO No.1 Timer 0 en Modo 0 como temporizador de 13 bits. El bit 0 del puerto P1

(P1.0), prendera y se apagara en función de los valores de carga del Timer 0 (TH0+TL0).

DIAGRAMA DE FLUJO

EJEMPLO No.2 Timer 1 en Modo 1 como temporizador de 16 bits. El bit 0 del puerto P1

(P1.0), prendera y se apagara en función de los valores de carga del Timer 1 (TH1+TL1).

DIAGRAMA DE FLUJO

;***** PROGRAMA PARA CONFIGURAR TIMER/COUNTER 1 EN MODO 1 (16 bits) *****

DEFSEG MODO1, ABSOLUTE SEG MODO1

ORG 0 LJMP INICIO

ORG 30H

INICIO: MOV TMOD,#10H ;M0=1 de Timer1,GATE=0,C/T=0 SETB P1.0 ;Poner a Uno el P1.0 CALL TEMPO ;LLAMA A SUBRUTINA CLR P1.0 ;PONER A ZERO P1.0 CALL TEMPO ;LLAMADA A SUBRUTINA

JMP INICIO ;REPITE TODO NUEVAMENTE

Page 84: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 84-

TEMPO: MOV TL1,#00 ;Inicializa parte baja de contador a 0 MOV TH1,#00 ;Inicializa parte alta del contador a 1 MOV TCON,#40H ;Inicializa TR1=1 para el conteo LEER: MOV A,TCON ;lee el contenido del registro

ANL A,#80H ;And para preguntar si flag TF1=1 JZ LEER ;si aun no llega a overflow TF1=0 por lo tanto ACC=0. RET

END

EJEMPLO No.3 Timer 1 en Modo 1 como temporizador de 16 bits con arranque por hardware

desde el exterior. El bit 0 del puerto P1 (P1.0), prendera y se apagara en función de los

valores de carga del Timer 1 (TH1+TL1) cuando se aplica un nivel alto por el pin exterior 13

(INT 1).

MODO 2: Temporizador/Contador de 8 bits con Auto-recarga.

El modo 2 configura el registro Timer como un contador de 8 bits (TL1) con recarga

automática. El overflow de TL1 no sólo activa el bit de flag (TF1), sino que también

<<recarga>> TL1 con el contenido de TH1, por lo que TH1 mantiene los datos iniciales con

que fue cargado.

El funcionamiento es el mismo para Timer 0 y Timer 1.

EJEMPLO No.4 Timer 1 en Modo 2 como temporizador de 8 bits con auto-recarga arranque

por hardware desde el exterior. El contenido de TL1 es enviado por el puerto P0, cuando se

aplica un nivel alto por el pin exterior 13 (INT 1).

Page 85: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 85-

SCON: Este registro se encarga de establecer los parámetros para la transmisión o

recepción de datos en comunicación serie; así si se trata de una transmisión o recepción,

formato de la palabra (bit de start, bit de datos, bit de stop), Velocidad, etc.

REGISTRO SCON b7 b6 b5 b4 b3 b2 b1 b0 SM0 SM1 SM2 REN TB8 RB8 TI RI

BIT NOMBRE Y COMENTARIO

b0 RI: Bandera de interrupción de recepción.

Se activa por hardware al finalizar la recepción del 8° bit en el modo 0 ó hacia la mitad del intervalo de tiempo del bit de stop en los otros modos.

Debe ser desactivado por software.

b1 TI: Bandera de interrupción de transmisión.

Se activa por hardware al finalizar la tranmisión del 8° bit en el modo 0 ó al comienzo bit de stop en los otros modos.

Debe ser desactivado por software.

b2 RB8: En modos 2 y 3 es el 9° bit que se recibe.

- En modo 1, si SM2=0, RB8 es el bit de stop.

- En modo 0, no se utiliza.

b3 TB8: Corresponde al 9° bit de datos en los modos 2 y 3.

Es programable por el usuario. Habitualmente es el bit de paridad.

b4 REN: - Si REN=1 (por software) permite la recepción.

- Si REN=0 no la permite

b5 SM2: En modo 2 y 3, Si SM2=1 entonces RI no se activará si el 9° bit de datos (RB8) es igual a cero.

- En Modo 1, si SM2=1 entonces RI no se activará si el bit de stop no se ha recibido.

- En Modo 0, SM2 debe estar a cero. B6-b7 SM0 SM1 MODO DESCRIPCION VELOCIDAD

0 0 0 Desplaza 8 bit Reloj/12 0 1 1 8 bit-UART Variable 1 0 2 9 bit-UART Reloj/64 ó Reloj/32 1 1 3 9 bit-UART variable

SBUF: Serial Data Buffer: son dos registros buffer aparentemente separados, pero

físicamente el mismo, buffer de transmisión y buffer de recepción. Cuando un dato es

movido a SBUF, este va al buffer del transmisor, cuando un dato es movido de SBUF, este

viene del buffer del receptor.

Page 86: Curso de microcontrolador MCS51

M.C. Eduardo Sánchez Arellano.

- Página 86-

PCON: Power Control Register: Para aplicaciones en donde la característica de consumo sea

crítica, la versión CHMOS ofrece dos modos de trabajo de bajo consumo: el modo POWER

DOWN y el IDLE. También ofrece, este registro, posibilidades de variar la velocidad de

comunicación en el canal serie.

SMOD - - - GF1 GF0 PD IDL SMOD Dobla el “BAUD RATE” para el puerto serie cuando se utiliza el timer para generar el BAUD RATE.

GF1 Propósito general.

GF0 Propósito general.

PD Bajo consumo de energía. (80C51 solamente)

IDL Bajo consumo de energía. (80C51 solamente)