Este documento presenta un curso sobre microprocesadores y microcontroladores. El curso consta de 40 horas divididas en 25 horas de teoría y 15 horas de prácticas. Entre las 8 prácticas se incluyen operaciones de entrada y salida por puertos, control de displays LCD, lectura de puertos y visualización en LCD, lectura de convertidores analógicos a digitales y control de temporizadores. El objetivo del curso es familiarizar a los estudiantes con los microcontroladores Intel y realizar prácticas básicas y intermedias de control
1. Curso de Microprocesadores y
Microcontroladores.
Unidad 1
Contenido:
1 Portada.
2 Temario.
3 Manual del Curso.
4 Anexos
2. Curso de Microcontroladores I
Objetivos del Curso
q Comenzar a familiarizarse con el entorno de los Microcontroladores
Intel
q Realizar Primeras prácticas de control y prueba.
q Operaciones básicas e intermedias.
Tiempo aproximado
q 40 Horas
Número de prácticas
q Teoría: 25 hrs.
q Práctica: 15 hrs.
Practicas
q Práctica 1 “In – Out por los puertos.
q Práctica 2 “Mandar mensajes al LCD de modo manual.
q Practica 3 “Lectura por un puerto y contenido de la lectura por el LCD.
q Practica 4 “Lectura en LCD de un ADC 0804”
q Practica 5 “Probador de voltajes.”
q Practica 6 “Probador de Timer Counter”
q Practica 7 “Medidor de RPM.”
q Practica 8 “Control de Interrupciones”
M.C. Eduardo Sánchez Arellano.
- Página 2-
3. Indice General
Capitulo 1. Introducción a los Microprocesadores.
1.1. La Evolucion de los Microprocesadores.
1.2. Características de los Microcontroladores
1.3. Pinout de los Microcontroladores Intel
Capitulo 2. Configuración de la memoria en el Microcontrolador
2.1. Memoria de p rograma 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
Presentación del software y equipo para el desarrollo de aplicaciones
• Introducción
• El Macroensamblador:
• Operaciones del editor.
• Operaciones de ensamblado.
• Operaciones de Encadenado.
• Operaciones de Simulación
• Ejecución y estudio de programas en el Macroensamblador.
Contro l de puertos de Entrada/Salida.
• Introducción
• El Microcontrolador como Microprocesador.
• Operaciones de escritura en los puertos del Microcontrolador.
• El puerto P0 en modo salida.
• Operaciones de lectura en los puertos.
• Control de procesos Industriales básicos .
• Control del LCD.
• Control del Teclado.
• Adquisición de datos mediante ADC
Interrupciones.
• Introducción.
• Tipos de Interrupciones.
• Proceso de interrupción en los Microcontroladores.
• Niveles de prioridad.
• Interrupciones externas. (INT0 ) e (INT1 )
• Interrupciones internas producidas por Timer 0 y1.
Temporizadores y Contadores.
• Introducción
• Timer 0 (T0) y Timer 1 (T1).
• Temporizador/Contador de 13 y 16 bit, arranque por software.
• Programas.
M.C. Eduardo Sánchez Arellano.
- Página 3-
4. Unidad 1
1.1 INTRODUCCIÓN A LOS MICROPROCESADORES
LA EVOLUCION DEL MICROPROCESADORES
Antes de comenzar a analizar los microprocesadores modernos, se debe primero
entender qué fue lo que paso con 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).
La primera computadora digital electrónica fue construida por un equipo dirigido por los
ingenieros John Mauchly y John Eckert, de la universidad de Pennsylvania, en 1946. Esta
máquina electrónica fue llamada ENIAC (Electronic Numerical Integrator and Computer), tenía
más de 18000 bulbos y consumía 200 Kw.
Tiempo después, cuando se integró a este equipo el Ing. y matemático Húngaro,
naturalizado norteamericano, John Von Neumann fue diseñada una nueva computadora
llamada EDVAC (Electronic Discrete Variable Automatic Computer). Las ideas de Von Neumann
resultaron tan fundamentales para su desarrollo, que es considerado el padre de las
computadoras.
Estas ideas consistieron en permitir que en la memoria coexistieran datos con
instrucciones para que la computadora pudiera ser programada por medio de software y no
por medio de hardware. Alrededor de este concepto gira toda la evolución de la industria y la
ciencia de la computación.
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.
M.C. Eduardo Sánchez Arellano.
- Página 4-
5. 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 se lograron 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 propias versiones de los
procesadores de 4 y de 8 bits. En la tabla 1-1 se enumera muchos de estos primeros
microprocesadores.
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.
Intel 8085, Mostek 6502
1976 Aparece Apple iniciando el auge de las microcomputadoras.
1978 Motorola 6809 Mejor microprocesador de 8 bit.
Tabla 1-1
M.C. Eduardo Sánchez Arellano.
- Página 5-
6. 1.1.2 Diferencia entre el Microprocesador y Microcontrolador
En el año de 1971 cuando surge el primer microprocesador de 8 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.
En 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.
Figura 1.8
M.C. Eduardo Sánchez Arellano.
- Página 6-
7. 1.1.3 Tipo de microprocesador según su velocidad y ancho de palabra.
1.2 ARQUITECTURA DEL MICROPROCESADOR.
El diseño de las microcomputadoras consiste de cinco áreas funcionales:
(A) CPU unidad central de procesamiento es el Microprocesador.
(B) Puertos de entrada/salida.
(C) Memoria de solo lectura (ROM) Memoria de Programa.
(D) Memoria de lectura y escritura (RAM) Memoria de Datos.
(E) Bus del sistema.
CPU
Memory Rom
In/Out Port.
Memory Ram
Figura 1.1
(A) Microprocesador (Unidad Central de Procesamiento (CPU)).
Central Processing Unit. El CPU es el corazón de toda µ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 que hace los “verdaderos cómputos”.
(1) Decodificador
Acumulador. (ACC) de Instruccion (2)
(4) Unidad
Reg de Instrucción. Aritmetica.
Timing and y Logica.
Contador del Programa Control.
(3) (ALU)
M.C. Eduardo Sánchez Arellano.
- Página 7-
8. Sin embargo, a veces el término es usado (aunque incorrectamente), para incluír todo lo
que está dentro de la caja, incluyendo el disco duro, el CD ROM, la fuente y el motherboard.
(1) 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
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.
(2) 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.
(3) 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.
(4) 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
M.C. Eduardo Sánchez Arellano.
- Página 8-
9. 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.
(B) PUERTOS DE ENTRADA/SALIDA:
Una microcomputadora tiene un camino para comunicarse con el mundo real, y este
camino sirve para introducir el programa y obtener los resultados. Los puertos de entrada y
salida son circuitos LSI que auxilian a la computadora a comunicarse con los humanos o a
controlar un proceso. Son normalmente llamados Peripheral interface adaptdor (PIA) o
Programable peripheral interface (PPI). Estos chips pueden ser programados como entradas
o salidas de la microcomputadora.
Si el µC es usado en un proceso de control, los componentes de entrada son
llamados transductores (Termistores, Termocolples etc.). Un transductor convierte una
cantidad física analógica como temperatura o presión en una cantidad eléctrica. Esta
cantidad puede ser amplificada o procesada antes de convertirla en una señal digital. Por
ejemplo en un sistema de control con retroalimentación como el que se muestra a
continuación el transductor monitorea la presión dentro de un tubo y constantemente
manda los datos al µP. Un programa es usado para comparar el dato contra un valor de
referencia almacenado en la memoria. Si la presión excede la referencia el µP manda las
señales de salida para cerrar la válvula y hacer sonar la alarma.
Figura 1.2
C P U ( µP)
Memory Rom
In Port. Out Port. Memory Ram
Amplificador Drive
and Circuit.
A/D Converter.
M.C. Eduardo Sánchez Arellano.
- Página 9-
10. (C) MEMORIA:
La memoria es una porción de la computadora que almacena el programa y los datos
mientras estos son necesarios. En esencia la memoria es un grupo de celdas de
almacenamiento. Cada celda puede almacenar un bit de información el cual puede ser 1 ó 0.
Por ejemplo la sig. Figura muestra un grupo de 8 celdas o bit almacenados como un patrón
binario que representa la letra “P”.
0 1 0 1 0 0 0 0
1 celda.
Otras letras ó otros tipos de información requieren otros tipos de combinación. La
mayoría de los microprocesadores almacenan instrucciones y datos en grupos de 8 bits (1
Byte). Para almacenar más de una letra es necesario más de un byte. Add.
0 1 0 0 1 0 0 1 =I 105
0 1 0 1 0 1 0 0 =T 106
0 1 0 0 1 1 1 0 =N 107
Cada byte almacenado en memoria tiene una dirección. Por ejemplo ITN puede estar
almacenado en las direcciones 105 a 107. Los µP son capaces de direccionar 65,536 bytes.
1.2.1 “Arquitectura del Microprocesadores a traves de diagrama a bloques
con Arquitectura Von Neumann”
M.C. Eduardo Sánchez Arellano.
- Página 10-
11. El Acumulador: almacena datos para ser procesados por la ALU. Suelen tener el
mismo número de bits que el bus de datos. El acumulador se utiliza con el bus de datos y la
ALU en el proceso aritmertico y logico de los datos. Por ejemplo, dos palabras binarias se
pueden sumar, cargando la primera en el acumulador A y sumandola a 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.
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.
M.C. Eduardo Sánchez Arellano.
- Página 11-
12. Figura 1.4 Pin Out del Microprocesador 8080
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.
M.C. Eduardo Sánchez Arellano.
- Página 12-
13. Fig. 1.5
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.
M.C. Eduardo Sánchez Arellano.
- Página 13-
14. Fig. 1.6 Pin Out del Microprocesador Motorola MC6800
Fig. 1.7 Pin Out del Microprocesador Mostek 6502
M.C. Eduardo Sánchez Arellano.
- Página 14-
15. 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 TECNOLO
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 4K 128 2 HMOS
8051AH 8031AH 8751H 4K 128 2 HMOS
8052AH 8032AH 8752BH 8K 256 3 HMOS
80C51BH 80C31B 87C51 4K 128 2 CMOS
TABLA 1.2
ARQUITECTURA BÁSICA DE LOS MICROCONTROLADORES 8051
Figura 1.9
M.C. Eduardo Sánchez Arellano.
- Página 15-
16. DIAGRAMA GENERAL DE LOS MICROCONTROLADORES 8031-8051-89C51-8751
Figura 1.10
Figura 1.11
M.C. Eduardo Sánchez Arellano.
- Página 16-
17. 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.
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
M.C. Eduardo Sánchez Arellano.
- Página 17-
18. 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.
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 amp lificador 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Ω .
M.C. Eduardo Sánchez Arellano.
- Página 18-
19. EL MICROCONTROLADOR 89C51 COMO MICROPROCESADOR
Una característica importante es que los puertos pueden ser utilizados como buses
de direcciones, de datos y control, debido a estas caracteristicas se dice que el
Microcontrolador puede trabajar 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 CP U (Microprocesador) 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).
Figura 1.12
M.C. Eduardo Sánchez Arellano.
- Página 19-
20. Organización de la MEMORIA en el Microcontrolador-Microprocesador
8X51.
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.
Ciclo de lectura en la memoria externa de programas
Para acceder a la memoria externa del programa se utiliza la señal PSEN (Program
Store Enable) como señal de autorización de lectura.
La señal ALE <<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 1.13 se puede observar que la lectura en la memoria de programas se realiza cuando
M.C. Eduardo Sánchez Arellano.
- Página 20-
21. PSEN está a nivel bajo, siendo el resto de las líneas de dirección las que establecen la
posición de menoria exacta del byte de instrucción u operando que ha de ser leído.
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 modificado. 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 el pin EA es activo (0), caso de la Figura 1.13
2. Cuando el contador de programa (PC) contiene un número más grande que 0FFFH para
el 8051 o para el 8052.
MEMORIA DE PROGRAMA EPROM ó FLASH
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.
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 1.4
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.
M.C. Eduardo Sánchez Arellano.
- Página 21-
22. 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.4 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.
El hardware de configuración del Microcontrolador como Microprocesador utilizando
memoria de programa externa se muestra en la Fig 1. 12
Se puede observar en al Figura 1.14 que las 16 líneas de dirección corresponden al
Puerto 0 y al Puerto 2, que están dedicadas 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 1.14
• 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
M.C. Eduardo Sánchez Arellano.
- Página 22-
23. PSEN autoriza la lectura al Microcontrolador del código de instrucción a través del Puerto
P0.
Para un mejor entendimiento y seguimiento de los diagramas de tiempos, en la
figura 1.13 se dibuja un circuito esquematico en el que aparece el microcontrolador
comandando una memoria RAM (6116) y una memoria EEPROM (2816).
Figura 1.13
En las siguiente Fig. Se muestra el funcionamiento y diagramas de tiempos de esta
operación.
Figura 1..15
M.C. Eduardo Sánchez Arellano.
- Página 23-
24. 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.
La figura 1.15 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.
M.C. Eduardo Sánchez Arellano.
- Página 24-
25. Figura 3.4
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.
M.C. Eduardo Sánchez Arellano.
- Página 25-
26. MEMORIA DE DATOS (RAM).
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
SFR
Solo Directo. 64 KBytes
80 Memoria Externa
7F
Directo é
Indirecto
00
0000 RD WR
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 de RAM.
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
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.
M.C. Eduardo Sánchez Arellano.
- Página 26-
27. § 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 Priori ty 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 Temporiza dor/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
ACC: Acumulador: Es un registro de propósito general y por su frecuencia de intervención,
el más importante.
M.C. Eduardo Sánchez Arellano.
- Página 27-
28. B: Registro B es usado durante operaciones de multiplicación y división, para otras
instrucciones puede ser tratado como un registro común.
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.
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.
Ciclo de lectura (RD) 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 1.13).
M.C. Eduardo Sánchez Arellano.
- Página 28-
29. 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.
Ciclo de escritura (WR) 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 (MOVX @DPTR,A) o
bien 8 bits (MOVX @Ri,A).
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.
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.
M.C. Eduardo Sánchez Arellano.
- Página 29-
30. 1.4 Lenguaje Ensamblador del Microprocesador
Programación de los Micfroprocesadores y los Microcontroladores MCS-51,52
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.
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
la instrucción. Por ejemplo la instrucción del 8051 que suma el contenido del registro R7
con el Acumulador A es representada por:
M.C. Eduardo Sánchez Arellano.
- Página 30-
31. 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.
1.4.3 MODOS DE DIRECCIONAMIENTO.
q 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.
MOV A, 2EH ; El Acumulador es cargado con el dato que se encuentra en la dirección 2EH
de la memoria RAM interna.
M.C. Eduardo Sánchez Arellano.
- Página 31-
32. MOV 3DH, 4EH ; El contenido de la dirección 3DH es cargado con el dato que se
encuentra en la dirección 4EH.
q 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.
q 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
Código: 1111 1 r r r
Operación: (Rn) ß (A)
Dependiendo del registro implicado el código de instrucción tomará distintos valores.
Así
M.C. Eduardo Sánchez Arellano.
- Página 32-
33. 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: 0111 1 r r r
Operación: (Rn) ß #dato.
q 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; A ß (A) + 1 Incrementa el contenido del acumulador:
INC DPTR; DPTR ß (DPTR) + 1 Incrementa puntero de datos;
DEC R0; Decrementa el registro R0.
q 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:
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
M.C. Eduardo Sánchez Arellano.
- Página 33-
34. 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).
1.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.
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
M.C. Eduardo Sánchez Arellano.
- Página 34-
35. 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
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.
M.C. Eduardo Sánchez Arellano.
- Página 35-
36. 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.
OPERACIÓN DE ESCRITURA EN LOS PUERTOS DE LOS Microcontrolador
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 1.8
Figura 1.14
Antes de comenzar con el estudio y comprobación de los puertos de E/S, se muestra
la interface para la conexión de los puertos a los dispositivos de salida, que en un principio
pueden ser unos simples LED (Figura 1.15).
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.
M.C. Eduardo Sánchez Arellano.
- Página 36-
37. Figura 1.15
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.
M.C. Eduardo Sánchez Arellano.
- Página 37-
38. 1.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.
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 Según el modo de
simplificada 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
En algunas tablas no son afectados los flags, y esto se indica con un mensaje en la
parte inferior de las mismas.
M.C. Eduardo Sánchez Arellano.
- Página 38-
39. Los tiempos de ejecución Se han tomado utilizando como referencia una frecuencia
de reloj de 12 MHz.
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.
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.
Ejemplo:
A = 5FH
M.C. Eduardo Sánchez Arellano.
- Página 39-
40. 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> # 3F
,
Si <byte> = (3A) = 0011 1010
# 3F = 0000 1111
0000 1010 = 0AH
(<byte> se refiere, en este caso, a una posición de memoria.)
Tiempo de
Nemónico Operación Modos de direccionamiento Flag afectados
Ejecución
Dir Ind Reg Imm C OV AC
µs
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 A,<byte> A=A.OR. <byte> X X X X 1
ORL <byte>, A <byte>=<byte>.OR.A X 1
ORL <byte>. # data <byte>=<byte>.OR.# data X 2
XRL A,<byte> A =A.XOR.<byte> X X X X 1
M.C. Eduardo Sánchez Arellano.
- Página 40-
41. 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)
M.C. Eduardo Sánchez Arellano.
- Página 41-
42. EJEMPLO 1.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).
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.
INSTRUCCIONES DE TRANSFERENCIA DE DATOS
Se consideran tres modalidades, según la transferencia se realice sobre:
M.C. Eduardo Sánchez Arellano.
- Página 42-
43. • 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
• 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.
M.C. Eduardo Sánchez Arellano.
- Página 43-
44. • 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
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.
M.C. Eduardo Sánchez Arellano.
- Página 44-
45. 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
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
M.C. Eduardo Sánchez Arellano.
- Página 45-
46. 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
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)
M.C. Eduardo Sánchez Arellano.
- Página 46-
47. 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).
DEFSEG ROTAR,ABSOLUTE
SEG ROTA
ORG 0
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
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
M.C. Eduardo Sánchez Arellano.
- Página 47-
48. 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 :
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
M.C. Eduardo Sánchez Arellano.
- Página 48-
49. 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
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
M.C. Eduardo Sánchez Arellano.
- Página 49-
50. 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 l etiqueta; el programador ensamblador
a
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.
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.
M.C. Eduardo Sánchez Arellano.
- Página 50-
51. 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 c on 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 Tiempo de Flag afectados
direccionamiento
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 X X 2
zero
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
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
M.C. Eduardo Sánchez Arellano.
- Página 51-
52. 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)
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:
M.C. Eduardo Sánchez Arellano.
- Página 52-
53. • (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 comp aració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 <<c ero>>. 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:
CJNE @Ri,# data, rel CJNE Rn, # data, del
• (PC)ß (PC) + 3 • (PC)ß (PC) + 3
• Si ((Ri)) <>data • Si (Rn)<>data
Entonces Entonces
(PC)ß (PC) + rel (PC)ß (PC) + rel
• Si ((Ri)) < data • Si (Rn) < data
Entonces Entonces
(C)ß 1 (C)ß 1
Si no Si no
(C)ß 0 (C)ß 0
M.C. Eduardo Sánchez Arellano.
- Página 53-