Professional Documents
Culture Documents
SISTEMAS PROGRAMABLE
Laboratorio Time
DL3155M24HC11
DL3155M24HC11
SISTEMAS PROGRAMABLES
2
DL3155M24HC11
INDICE
GUIA TEORICA:
UNIDAD
1. Fundamentos de microcomputadoras.
3. Conjunto de instrucciones.
3
DL3155M24HC11
4
DL3155M24HC11
UNIDAD 1
FUNDAMENTOS DE
MICROCOMPUTADORAS
5
DL3155M24HC11
CONTENIDO
1.1 INTRODUCCIÓN
6
DL3155M24HC11
1.1 INTRODUCCION
Los miles de transistores que componen el microprocesador están configurados para formar
diferentes clases de circuitos dentro del chip. Desde el punto de vista, aprendizaje para la
operación del microprocesador, los circuitos más importantes son los registros, contadores y
decodificadores. En esta unidad, usted aprenderá como esos circuitos trabajan juntos para
llevar a cabo tareas simples, pero útiles.
7
DL3155M24HC11
Unidad
Reloj Microprocesadora
memoria
memoria
Interfaz
microcomputadora
I/O
Dispositivo de
entrada/salida
Todo lo situado fuera de la línea punteada en la figura 1-1 se considera como la parte que
permite la interfaz con señales de entrada y salida externas, todas las microcomputadoras
deben tener algún medio de comunicarse así. La información recibida por la
microcomputadora, que procede de señales externas, se le conoce como datos de
entrada(input data). La información transmitida al exterior se considera como datos de
salida(output data). La información puede llegar de dispositivos semejantes a lectoras de cinta
de papel, transductores de varios tipos, switches mecánicos, teclados o aún de otras
computadoras.
8
DL3155M24HC11
Una microcomputadora es capaz de llevar a cabo muchas instrucciones distintas. Puede sumar
y restar números, llevar a cabo operaciones lógicas, etc. Puede leer información desde un
dispositivo de entrada y transmitir información a un dispositivo de salida. De hecho, depende
del microprocesador usado, el numero de instrucciones que el micro puede ejecutar pueden ser
100 o más según sea el caso. Más aún para conformar operaciones mucho más complejas se
puede combinar dos o más operaciones individuales.
Una computadora es frecuentemente comparada con una calculadora, donde se le dice qué
hacer desde el teclado. Aún calculadoras baratas pueden efectuar algunas operaciones
comparables con instrucciones de computadora. Oprimiendo las teclas correctas, usted puede
instruir a la calculadora para sumar, restar, multiplicar, dividir y limpiar la pantalla. Con la
calculadora, usted puede sumar una lista de números tan rápidamente como pueda introducir
los números y las instrucciones. En donde, la operación está limitada por la velocidad y
precisión del operador.
Antes que inicie cualquier proceso, el programa de 100 instrucciones más los 20 números son
cargados en memoria. Seguidamente, se apartan 10 localidades de memoria reservadas para
las respuestas. Sólo entonces se permite que la computadora ejecute el programa. El tiempo
de ejecución puede ser menor a un milisegundo. Compare este tiempo con el que podría tomar
introducir manualmente las instrucciones y los números, uno a la vez mientras la computadora
está corriendo. Esta operación automática es una característica que distingue a la computadora
de la simple y no programable calculadora.
Palabras de Computadora
9
DL3155M24HC11
individuales, la computadora los maneja como una unidad. Así, la palabra es la unidad de
información fundamental usada por la computadora.
Una palabra puede ser un número binario que es manejado como dato o puede ser una
instrucción que dice a la computadora qué operación llevar a cabo. Puede ser un carácter
ASCII representando una letra del alfabeto. Finalmente, una palabra puede ser una dirección
que dice a la computadora dónde localizar un dato.
Longitud de Palabra
Una palabra de 8 bits puede especificar números positivos entre 0 y 25510. O, si la palabra de 8
bits es una instrucción, puede especificar 25610 posibles operaciones. Es también posible que
la palabra de 8 bits represente un carácter ASCII. En éste caso puede ser una letra del
alfabeto, signo de puntuación o numero. Como se puede ver, la palabra de 8 bits puede
representar cosas diferentes, dependiendo de cómo es interpretada. El programador debe
asegurarse de que un carácter ASCII o número binario no sea interpretado como una
instrucción.
Aunque la longitud de palabra de 8 bits es muy popular, se emplean cada vez con mayor
frecuencia las de 16 y 32 bits y, eventualmente, la de 4 bits por el bajo costo del dispositivo.
Debe ser puntualizado que la longitud de palabra de 8 bits no significa no poder manejar mas
que números debajo de 25610. Pero en caso de ser necesario, se deberán usar dos o más
palabras para representar números grandes.
La memoria deberá ser capaz de mantener números grandes con palabras de 8 bits; y el bus
empleado para transferir palabras de datos consistirá en conductores paralelos de 8.
10
DL3155M24HC11
como una sola unidad. Así, en los microprocesadores de 8 bits, una palabra consiste de un
byte, en tanto que en los de 16 bits, consiste en 2 bytes. La figura 1-2 ilustra estos puntos.
La figura 1-2 también muestra como están numerados los bits que componen la palabra de
computadora. El bit menos significativo (LSB) esta a la derecha, mientras que el bit más
significativo (MSB) a la izquierda. En la palabra de 8 bits, estos se numeran del 0 al 7, de
derecha a izquierda; en la palabra de 16 bits, la numeración va del 0 al 15, en el mismo
sentido. Los 8 bits de la derecha son llamados byte de orden bajo y los de la izquierda byte de
orden alto.
11
DL3155M24HC11
12
DL3155M24HC11
La unidad Microprocesadora
CLOCK
AND
CONTROL
LINES
13
DL3155M24HC11
Generalmente, la ALU recibe dos números binarios de 8 bits desde el acumulador y el registro
de datos como se ilustra en la figura 1-5A. Ya que se ejecuta alguna operación sobre estas
palabras de datos, las dos entradas se llaman operandos.
14
DL3155M24HC11
Los dos operandos pueden ser sumados, restados o comparados en alguna forma, y el
resultado de la operación vuelto a almacenar en el acumulador. Por ejemplo, suponga que se
van a sumar dos números (7 y 9). Antes que los números puedan ser sumados, un operando
(9) es colocado en el acumulador, el otro (7) es colocado en el registro de datos. Se activa la
línea de control correspondiente para implementar la operación de suma. La ALU suma los dos
números, enviando su suma (1610) a la salida. La figura 1-5B muestra el proceso; la suma es
almacenada en el acumulador, reemplazando el operando que originalmente se hallaba ahí.
Nótese que todos los números están en forma binaria.
El acumulador es el más útil de los registros. Durante las operaciones aritméticas y lógicas
lleva a cabo una función dual. Antes de la operación, guarda uno de los operandos. Después
de la operación, guarda la suma resultante, diferencia o respuesta lógica. El acumulador recibe
algunas instrucciones en cada microprocesador. Por ejemplo, la instrucción “cargar
acumulador” causa que el contenido de alguna localidad específica de memoria sea transferida
al acumulador. La instrucción “almacenar acumulador” causa que el contenido del acumulador
sea almacenado en alguna localidad específica de memoria.
El registro de datos es una localidad temporal de almacenamiento para los datos que van o
vienen sobre el bus de datos. Por ejemplo, guarda una instrucción mientras es decodificada.
También, guarda un byte de datos mientras la palabra es almacenada en memoria.
15
DL3155M24HC11
MEMORIA
Dos buses y un número de líneas de control conectan la memoria con la unidad del
microprocesador. El bus de direcciones puede contener un número binario de 8 bits, que puede
especificarse como 25610 localidades, desde la MPU al decodificador de direcciones de
memoria. Cada localidad tiene asignado un número único llamado dirección. La primera
localidad tiene la dirección 0. La última localidad tiene la dirección 25510, 1111 1111 en binario
o FF en hexadecimal. Una localidad específica es seleccionada colocando su dirección de 8
bits en el bus de direcciones. El decodificador de direcciones, después de decodificar el
número de 8 bits, selecciona la localidad de memoria apropiada.
La memoria también recibe una señal de control de la MPU. Esta señal dice a la memoria que
operación llevar a cabo. Una señal READ indica que la localidad seleccionada será leída. Esto
implica que el número de 8 bits contenido en la localidad seleccionada debe ser colocado en el
bus de datos, donde puede ser transferido a la MPU.
16
DL3155M24HC11
La MPU también puede llevar a cabo la operación de escritura, WRITE. Este procedimiento se
ilustra en la figura 1-8. Durante esta operación, una palabra de datos es tomada del bus de
datos y colocada en la localidad seleccionada. Por ejemplo, veamos como la MPU almacena el
número 5216 en la localidad 03. Primero, la MPU coloca la dirección 03 en el bus de
direcciones. El decodificador responde seleccionando la localidad de memoria 03. Segundo, la
MPU coloca el número 5216 en el bus de datos. Tercero, la MPU envía la señal WRITE.
17
DL3155M24HC11
El nombre aceptado para éste tipo de memoria es el de Memoria de Acceso Aleatorio (RAM).
“Acceso Aleatorio” significa que todas las localidades de la memoria son igualmente accesibles.
Sin embargo, en años recientes, la RAM ha llegado a ser memoria de acceso aleatorio de
lectura/escritura. Como usted verá más adelante, hay otro tipo de memoria llamado memoria de
sólo lectura (ROM). También es accesible aleatoriamente, pero no tiene la capacidad de
escritura. De esta manera es llamada ROM, pero nunca RAM.
Cuando la microcomputadora ejecuta un programa, este lleva una secuencia fundamental que
es repetida una y otra vez. Recuerde que un programa consiste de instrucciones que dicen a la
microcomputadora que operaciones efectuar exactamente. Estas instrucciones deben ser
almacenadas ordenadamente en la memoria. Deben ser extraídas de la memoria, una cada
vez, por la MPU. Entonces pueden ser ejecutadas.
18
DL3155M24HC11
La fase de búsqueda siempre consiste en la misma serie de operaciones. Por ello siempre
toma el mismo lapso de tiempo. Sin embargo, la fase de ejecución puede consistir de
diferentes secuencias de eventos, dependiendo de que tipo de instrucción se ejecuta. Así, la
fase de ejecución puede variar considerablemente de una instrucción a otra.
UN PROGRAMA DE MUESTRA.
Ahora que usted tiene una idea general de los registros y circuitos que se encuentran en una
microcomputadora, examinaremos cómo trabajan juntos, para ejecutar un programa sencillo.
Aquí estamos interesados sobre todo en la forma en que la microcomputadora opera; por lo
tanto, el programa será muy trivial.
Veamos como la computadora resuelve un problema como 7 + 10 =?. Aunque esto puede
parecer un problema increíblemente fácil, la computadora por si sola aún con todos sus
recursos, no tiene podrá resolverlo.
Antes que usted pueda escribir un programa debe saber que instrucciones están disponibles
entre usted y la computadora. Cada microprocesador tiene un conjunto de instrucciones.
Suponga que después de examinar dicho conjunto, usted decide que son necesarias tres
instrucciones para resolver el problema. Esas tres instrucciones y una descripción de qué
hacen se ilustran en la Figura 1-10.
19
DL3155M24HC11
Suponga que desea sumar 7 a 1010 y dejar la suma en el acumulador. El programa es muy
elemental. Primero debe cargar 7 en el acumulador con la instrucción LDA. Enseguida, sumará
1010 al acumulador usando la instrucción ADD. Finalmente, detendrá la computadora con la
instrucción STOP.
Entonces:
Note que el programa consiste de tres instrucciones. Las primeras dos instrucciones tienen dos
partes: un opcode de 8 bits seguido de un operando de 8 bits. Los operandos son los números
que serán sumados (7 y 1010).
Recuerde que el microprocesador y la memoria trabajan con palabras de 8 bits o bytes. Puesto
que las dos primeras instrucciones consisten de 16 bits de información, deben ser divididas en
dos bytes de 8 bits antes de ser almacenadas en memoria. De esta manera, cuando el
programa es almacenado en memoria, se ve así:
20
DL3155M24HC11
Se requieren cinco bytes de memoria. Puede almacenar estos cinco bytes de programa en
cualquier lugar de la memoria que desee. Suponiendo que los almacena en las primeras cinco
localidades, la memoria se vería como lo muestra la Figura 1-11.
Note que cada localidad de memoria tiene dos números binarios asociados consigo. Uno es su
dirección, el otro, su contenido. La dirección es fija. Se establece cuando se construye la
microcomputadora. Sin embargo, el contenido cambia cada vez que se almacenan nuevos
datos.
21
DL3155M24HC11
UNIDAD 2
ARQUITECTURA DEL
MICROCONTROLADOR
22
DL3155M24HC11
CONTENIDO
23
DL3155M24HC11
24
DL3155M24HC11
La única razón para mostrarle los detalles del modelo es darle una idea de lo que se halla en el
interior del circuito integrado. En un microprocesador moderno, la estructura interna es
frecuentemente tan compleja que al intentar analizarlo tan de cerca, nos llenaría en detalles,
creando confusión. Por esta razón, un modelo de programación se usa cuando se hace una
introducción a un microprocesador por vez primera. En el modelo de programación el énfasis va
más allá. Cualquier registro o circuito que no pueda ser controlado directamente por el
programador, simplemente se ignora. Por ejemplo, considere el registro de datos. No hay
instrucciones que den al programador control directo sobre ese registro. Esto es, no hay
instrucciones como Cargar el Registro de Datos, Almacenar el Registro de Datos, etc. Toda la
actividad del registro de datos, es controlada estrictamente por la MPU. Así, el programador
puede ignorar la existencia del registro. Ocurre lo mismo para el registro de direcciones, el
decodificador de instrucciones, el controlador-secuenciador, etc. Por lo tanto, el modelo de
programación de nuestra MPU hipotético puede representarse como en la Figura 2-2. Este
diagrama simple es suficiente para muchas aplicaciones de programación ya que muestra
todos los registros que pueden ser controlados directamente por el programa.
7 0
ACUMULADOR
7 0
CONTADOR DE PROGRAMA
Por definición, una microcontrolador consiste de una Unidad Central de Proceso (CPU),
Memoria de Solo Lectura (ROM), y circuitos de control y temporización. Puesto que el chip
MC68HC11 contiene estos y otros circuitos y características, será referido técnicamente como
la microcomputadora o MPU. Esto es así porque estamos interesados principalmente en la
programación de la CPU de la microcomputadora.
25
DL3155M24HC11
el aprendizaje de este material lo habilitará para entender y trabajar con una variedad de
microprocesadores de 8 bits, además del 68HC11.
Como usted está a punto de descubrir, los 68HC11 pueden configurarse de dos maneras
diferentes para los dos posibles mercados de aplicaciones. Alternativamente, los 68HC11
pueden configurarse en un modo del single-chip, donde actúa como un microprocesador simple
que usa su propia memoria interna limitada y capacidades de I/O. Ahora, hechemos un vistazo
más a detalle de este dispositivo flexible.
Un diagrama a bloques de la estructura del 68HC11 se muestra en la figura 2-3. Como usted
puede ver, hay varias funciones integradas en el dispositivo. Las funciones interiores del chip le
darán una preparación para el estudio extenso, a lo largo de éste viaje.
Fig. 2-3
Estructura de hardware interna en el 68HC11
CPU CONVERTIDOR
6800 A/D
CLOCK
RAM
PARALELO
256 x 8
68HC11
I/O
ROM
8k x 8
I/O
SERIAL
EEPROM
512 x 8
TIMER
PROGRAMAB
LE
26
DL3155M24HC11
EL CPU
Los 68HC11 contiene una versión mejorada de los 6800 Motorola. Los registros del CPU se
muestran en Figura 2-4.
7 A 0 7 B 0 Acumulador de 8 bit, A y B,
15 D 0 Acumulador D
15 IX 0 Registro Indice X
15 IY 0 Registro Indice Y
Fig. 2-4
Los registros del CPU 68HC11
EL RELOJ INTERNO
El 68HC11 emplea un circuito del reloj interno que opera por un cristal externo. El circuito de
reloj interno divide la frecuencia del cristal externa entre cuatro, para obtener la frecuencia de
reloj. Los 68HC11 pueden operarse arriba de 2.1 MHz usando un cristal de 8.4 MHz.
27
DL3155M24HC11
RAM INTERNA
La RAM interna del 68HC11 es 256 bytes. Esta RAM empieza en la dirección 000016 y se
extiende a la dirección 00FF16.
ROM INTERNA
La ROM interna de 12K byte es una programación mascarable, localizada en las direcciones
E00016 a FFFF16. Por supuesto, dado que la ROM es no mascarable, ud debe proporcionar un
programa hacia el chip del fabricante para ser mascarado dentro de la ROM.
EPROM INTERNA
I/O PARALELO
I/O SERIE
Las I/O serie es comunicación y transferencia de datos, un bit en un momento, contra I/O
paralelo qué involucra comunicación datos de multi-bit. Brevemente, hay dos tipos de
comunicaciones serie: asíncrono y síncrono. El 68HC11 tienen internamente la capacidad para
dar ambos tipos de comunicación I/O serie. La sección I/O serie asíncrona del chip 68HC11 se
llama la Interface de Comunicaciones Serie, o SCI. La sección I/O serie síncrona se llama la
Interface Periférica Serie, o SPI.
Los timers programables se utilizan para dar retardos de tiempo, generar señales y pulsos de
control, mide tiempos entre eventos externos, y mide la duración de pulsos externos, sólo para
mencionar algunas de sus aplicaciones.
El mundo real es analógico, de tal modo que si se desea sensar y controlar los eventos que en
él existen, debe convertirse la señal analógica a señal digital, y entregarla al MPU. Éste es el
trabajo de un convertidor analógico a digital, o A/D. El 68HC11 incluye un convertidor de A/D de
28
DL3155M24HC11
8 canales que pueden usarse para convertir ocho señales analógicas separadas en un valor
digital de 8-bit y procesar por el MPU.
La figura 2-5 muestras un diagrama funcional de los pines del 68HC11 cuando se configura en
su modo multiplexado. La figura 2-5, muestra la versión del 68HC11 en su paquete cuadrado, o
quad de 52-pines. Hay también otra versión de que es un paquete de doble línea o DIP de 48-
pines. Observe el punto u orificio, marcado al centro del dispositivo. Esta marca se usa para
localizar el pin 1. De este punto, el pin numerando desde el pin 1 al pin 52, se ubica en sentido
contrario a las manecillas del reloj.
Pines 2 y 3 se etiquetan como MODB y MODA, respectivamente. Estos dos pines se usan para
configurar el 68HC11 en su modo operación durante un operación reset. La lógica aplicada a
estos pins configura el chip de acuerdo a la tabla siguiente:
Tabla 1-1
Configuración del modo de operación
29
DL3155M24HC11
LINEAS
DEL
CONVERTIDOR
LINEAS DEL A/D
BUS DE DATOS
Y PARTE BAJA
DEL BUS DE
DIRECCIONES
PARTE SUPERIOR
DEL BUS DE
MC 68HC11 DIRECCIONES
52-FN
Fig. 2-5
Pines del 68HC11 asignados en configuración modo multiplexado.
Pin 4 se etiqueta AS, correspondiendo a Address Strobe. La línea AS es una línea de salida
que indica que el 68HC11 han generado una dirección en el bus de direcciones. Cuando la
línea de AS es alta, una dirección dentro del bus de direcciones está presente. Cuando AS es
bajo, los datos están en el bus de datos. Usted averiguará brevemente que el 68HC11
multiplexa medio bus de direcciones y el bus de datos en los mismos ocho pines. El uso
primario para la línea AS, es separar, o demultiplexar, las señales de dirección y datos.
Pin 5 se etiqueta como E que simboliza línea de Enable. Ésta es una línea de salida que genera
una señal de reloj necesario para temporizar el sistema. Esto es requerido en todos los circuitos
para sincronizar la transferencia de datos entre el MPU, la memoria y los dispositivos periféricos
I/0.
Pin 6 la línea Read/Write (R/W), indica a la memoria o los dispositivos periféricos sí el MPU
está en modo lectura o escritura. Una operación de lectura se indica un "1" en esta línea. En
este modo, el MPU lee datos desde la memoria o desde un dispositivo de entrada. Una
operación de escritura es indicada por un "0" en la línea R/W. En este modo, el MPU manda
datos a memoria o a un dispositivo de salida.
Los próximos dos Pines (7 y 8) se etiqueta EXTAL y XTAL, respectivamente. Aquí es donde ud
debe conectar el cristal para generar la frecuencia de reloj interna E. Un oscilador de cristal,
típico, se muestra en la figura 2-6A. Note que la frecuencia de cristal debe ser cuatro veces la
30
DL3155M24HC11
frecuencia de reloj E deseada (4 x E). El diagrama en la figura 2-6B muestra cómo usted puede
usar un circuito oscilador externo para generar una señal de reloj E. La salida del oscilador
debe ser compatible a CMOS y debe aplicarse a la línea de EXTAL al pin 7. La frecuencia de
reloj E, será la frecuencia de oscilador entre cuatro. Con este método de generación, la señal
de reloj se utiliza y la línea de XTAL a la izquierda, en el pin 8, no es conectada.
CRISTAL
4XE
OSCILADOR
EXTERNO
4XE
SIN CONEXIÓN
Fig. 2-6
(A) Cristal conectado al 68HC11
(B) Conexión de un oscilador externo
§ Cuando la línea AS es alta, los pines 9-16 generan las ocho líneas de dirección más
bajas (A0 - A7), del bus de direcciones externo.
§ Cuando la línea AS es baja, los pines 9-16 generan las ocho líneas de datos (D0 - D7)
del bus de datos externo.
Así, el bus de datos y la mitad más baja del bus de direcciones son multiplexados en estas
ocho líneas, se ahorra el número total de pines requerido para el chip. Por supuesto, la
información de datos y direcciones debe separarse, o demultiplexarse, externamente para
interconectarlos en orden al 68HC11.
La línea de 2%S%T (pin 17) se usa para restablecer e iniciar el MPU cuando el sistema es
inicialmente energizado o en el momento que se desee inicializar el sistema, Cuando esta línea
va a su nivel lógico "0", el MPU inicia la secuencia de reset. Recuerde que el vector reset es
recuperado desde las direcciones FFFE16 y FFFF16. Este vector se carga dentro del contador de
programa para que la primera instrucción de la rutina de reset sea buscada desde esa
dirección. Esta capacidad se usa para dirigir el MPU al inicio del programa monitor o de control.
31
DL3155M24HC11
La línea )21 pin 19 es línea de petición de interrupción mascarable. Recuerde que esta
interrupción se ignora, si la bandera I del registro código de condición (CCR) es 1. Cuando una
señal activa aparece en esta línea, el MPU primero verifica que la bandera I en el CCR sea 1.
Si es así, la interrupción es ignorada. Si la bandera I está limpia(0), el MPU recibe el vector de
interrupción I21 desde las direcciones FFF216-FFF316 y lo cargan dentro del contador de
programa. La ejecución empieza entonces con la primera instrucción de la rutina servicio de
interrupción. Después use una instrucción RTI al final de la rutina, para regresar a donde la
interrupción fue generada. Un punto final sobre I21: puede configurarse como una interrupción
para sensar flanco o nivel (level or edge). Después de restablecerse, el pin I21 se configura
automáticamente como interrupción para sensar el nivel activo bajo. Así, un nivel lógico "0"
aplicado al pin 19 comienza la secuencia de la interrupción. Además, el pin de )21 puede ser
configurado por software como interrupción de flanco negativo disparado. En este modo, un
flanco de alto-a-bajo aplicado al pin 19 comienza la secuencia de interrupción. Esta opción
puede ser seleccionada configurando el bit 5 del Registro interno Option en la dirección
hexadecimal 003916 . Usted encontrará durante sus experimentos que hay aplicaciones tanto
para interrupciones por niveles o por flancos.
Pin 26 es etiquetado como VDD . Esto es donde la fuente de energía a +5V DC se conecta.
Pins 27-34 provee como propósito general las I/O paralelo y la característica de un timer
interno.
Las 8 líneas superiores del bus de direcciones (A8 - A15) se generan vía los pins 35 - 42. La
línea de dirección A15, se da en el pin 35, A14 en el pin 36, y así sucesivamente, finalizando
con la línea de dirección A8 en el pin 42. Recuerde que las 8 líneas bajas del bus de datos (A0 -
A7) son multiplexadas con el bus de datos sobre los pines 9-16, respectivamente.
Finalmente, las líneas VRL y VRH en los pins 51 y 52, respectivamente, son usadas para aplicar
un voltaje de la referencia externo para el uso del convertidor analógico-a-digital interno.
Tiempo de instrucción
Antes de continuar, discutiremos la relación de temporización entre las diversas señales del bus
y de control. Esta discusión inicia con lo más básico en una relación de temporizando: la
temporización por una sola instrucción.
32
DL3155M24HC11
Los eventos correspondientes se ilustran en Figura 2-7. Note que los eventos ocurren en el
flanco del pulso de reloj E. Asuma entonces que en la prioridad al tiempo 1 el contador del
programa contiene la dirección de la instrucción LDAA #.
1.09 1.09
Microsegundo Microsegundo
s s
Fig. 2-7
Temporización de la instrucción LDAA#
Al tiempo 2, es el borde de subida del reloj E. En este momento, el contador de programa será
incrementado en uno, a la dirección del siguiente byte en memoria. Sin embargo, este no
cambiará la dirección sobre el bus de dirección. Recuerde que la dirección actual es
conservada dentro del registro dirección de memoria. Así, la dirección de salida aun esta en el
primer byte de la instrucción LDAA #.
Los eventos que ocurren durante el reloj E, comienzan desde dentro del propio MPU. Además,
la señal de reloj E es vista por los circuitos periféricos tal y como el MPU. Así, la RAM, ROM,
etc., son controlados por el reloj E.
El filo de elevación, del reloj E en el tiempo 2, también forza a la memoria a colocar el dato
desde la dirección indicada hacia el bus de datos. Recuerde que este es el código de operación
para la instrucción LDAA #, o 86 16. Observe que la dirección ha tenido estabilidad desde el
tiempo 1 al tiempo 2.
Al tiempo 3 en el borde de caída de la señal, el MPU acepta el byte desde el bus de datos. El
bus de datos tiene estabilidad de tiempo 2 a tiempo 3. El MPU transfiere este byte (8616) al
registro instrucción. Allí, se decodifica e interpreta como el código de operación LDAA #. Esto le
33
DL3155M24HC11
dice al MPU que el próximo byte en memoria, es el operando que será cargado al acumulador
A.
Esto completa el primer ciclo del MPU. Durante este ciclo, el código de operación fue
simplemente leído desde la memoria y decodificado. Esto corresponde a la fase de búsqueda
para nuestro MPU. Observe que un ciclo MPU corresponde a un ciclo del reloj. Ahora veamos
lo que ocurre durante el segundo ciclo, o fase de ejecución de la instrucción.
Continuando, el borde de elevación del reloj E al tiempo 4, causan que él operando sea
transferido desde la memoria al bus de datos. Al tiempo 5, él operando es conservado dentro
del MPU donde este es transferido al acumulador A. Esto completa el segundo ciclo MPU y la
fase de ejecución de la instrucción. El tiempo 5 también representa el inicio de fase de
búsqueda de la próxima instrucción. La ejecución de la instrucción LDAA # requirió dos ciclos
MPU, o dos ciclos del reloj. Asumiendo que el reloj es de 920 kHz, se requiere
aproximadamente 2.18 microsegundos para ejecutar esta instrucción (1.09 por cada byte).
Ahora que usted está familiarizado con la temporización de una sola instrucción, podrá
entender el proceso para la ejecución de un programa muestra, donde se agrupan diversas
instrucciones.
Podrá estudiar las relaciones de temporización entre las señales del bus, señales de reloj, la
línea R/W, etc.,
Fig. 2-8
Segmento de un programa muestra
La figura 2-9 ilustra la relación entre temporizaciones. El pulso de reloj E se muestra en la parte
superior del diagrama. La información que aparece sobre los buses y la línea R/W para cada
periodo del reloj se muestra en la parte de abajo. Este segmento de programa requiere ocho
34
DL3155M24HC11
ciclos de reloj, o ciclos MPU. Éstos están enumerados del uno al ocho. Veamos lo que ocurre
durante cada uno de estos ciclos.
1.09
Microsegundos
Bus de
Direcciones
Bus de
Datos
Línea
R/W
Fig. 2-9
Temporización del segmento del programa muestra.
Ciclo 2. Ésta es la fase de la ejecución de la instrucción LDAA #. La dirección del código del
operando (001116) es colocada sobre el bus de direcciones. El código de operación (0716) es
leído afuera, sobre el bus de datos y colocado en el acumulador A. En el proceso, el contador
de programa se incrementa a 001216. Esto completa la fase de ejecución de la primera
instrucción.
Ciclo 5. Fase de búsqueda para la tercer instrucción. La dirección 001416 se sitúa sobre el bus
de direcciones. El código de operación para STAA se lee y decodifica. El MPU reconoce que es
necesario el modo de direccionamiento directo. Así, interpretará el siguiente byte en memoria
como la dirección donde la suma es acumulada. El contador del programa se incrementa a
0015 16.
Ciclo 6. La dirección 00151 6 se coloca sobre el bus de dirección. Observe que esta localidad es
la dirección donde la suma es almacenada. Así, 01 se lee fuera, hacia el bus de datos donde es
recogido por el MPU. El MPU reconoció que el direccionamiento directo es el indicado y asume
que la dirección donde la suma se guarda es 000116. Esta dirección se guarda en el MPU. El
contador del programa se incrementa a 001616.
35
DL3155M24HC11
Ciclo 7. Durante este ciclo, el MPU se prepara para almacenar la suma. Para ello, debe
transferir la suma desde el acumulador al registro de datos.
Ciclo 8. El MPU está ahora listo para guardar la suma en memoria. La dirección donde guardará
la suma (000116) es colocada sobre el bus de dirección. El dato a almacenar (2816) es situado
sobre el bus de datos. La línea de R/W se cambia a estado bajo, indicando que ésta, es una
operación de almacenaje, y la suma (2816) se guarda en la localidad de memoria 000116.
36
DL3155M24HC11
7 A 0 7 B 0 Acumulador de 8 bit, A y B, o el
15 D 0 acumulador doble D
15 IX 0 Registro Indexado X
15 IY 0 Registro Indexado Y
Sobreflujo
Zero
Negativo
Mascara de interrupción- I
Medio acarreo o semiacarreo (del bit
3)
Mascara de interrupción X
Paro deshabilitado
Usted notará inmediatamente que el 68HC11 tiene algunos registros adicionales. Sin embargo,
sólo dos de ellos, el registro índice y el apuntador de pila son nuevos para usted.
Veamos las diferencias más significativas entre MPU y nuestro modelo hipotético.
37
DL3155M24HC11
Dos Acumuladores. 68HC11 tiene dos acumuladores en lugar de sólo uno. Son llamados
acumulador A (ACCA) y acumulador B (ACCB). Cada uno de ellos cuenta con su propio grupo
de instrucciones asociadas. Los nombres y mnemónicos de las instrucciones especifican cual
acumulador será usado. Así, hay instrucciones como:
Note que se agrega al nombre y al mnemónico para indicar que acumulador va a usarse.
Por experiencia, usted puede visualizar el valor del segundo acumulador. Por ejemplo,
considere un programa en el cual, MPU cuenta el número de veces que ocurre una operación.
Anteriormente, almacenamos el contenido actual del acumulador, cargamos la cuenta en el
acumulador; incrementamos la cuenta, almacenamos la cuenta y volvemos a cargar el numero
original. Con un segundo acumulador, nada de eso es necesario. Sencillamente mantenemos la
cuenta en el acumulador B mientras trabajamos con el acumulador A. De hecho, podemos
efectuar cualquier operación aritmética o lógica de dos números distintos sin tener que
moverlos hacia delante o atrás en la memoria. Como en otros miembros de la familia 6800, los
acumuladores A y B pueden ser concatenados en un solo acumulador, “D” de 16 bits, para
bytes dobles.
Usted puede sorprenderse de cómo especificamos una dirección de 16 bits con un byte. La
respuesta obvia es que son necesarios dos bytes de 8 bits. Recuerde que en el modo de
direccionamiento directo, la dirección fue especificada por un byte. El microcontrolador 68HC11
mantiene ese modo de direccionamiento. Sin embargo, ya que una dirección de 8 bits sólo
puede especificar 256 direcciones, el 68HC11 puede usar este modo sólo si el operando se
halla en los primeros 256 bytes de memoria. Para alcanzar direcciones altas, se debe usar un
nuevo modo de direccionamiento llamado direccionamiento extendido. En el modo de
direccionamiento extendido, se usan dos bytes para representar cada dirección. Este modo de
direccionamiento será discutido con más detalle después. Por ahora, tenga en mente que hay
65,536 posibles direcciones. La dirección más baja es la 000016 y la mayor es FFFF16. Usando
direccionamiento extendido, tendremos acceso a cualquier localidad de memoria, pero se
requiere una dirección de 2 bytes.
38
DL3155M24HC11
Registros Indice. Los registros índice IX e IY son registros de 16 bits de propósito especial
que incrementan grandemente la potencia del microprocesador. Estos registros permiten un
modo de direccionamiento muy poderoso llamado direccionamiento indexado.
Analizaremos dicho modo de direccionamiento en esta unidad. Por ahora, considere a los
registros índice como otros registros de trabajo. El hecho que puedan retener dos bytes en
lugar de uno posibilita su buen uso. La MPU tiene instrucciones que permiten que los registros
índice sean cargados desde dos bytes de memoria contiguos. Otra instrucción nos permite
almacenar el contenido de los registros índice en dos localidades de memoria adyacentes. Esto
posibilita mover datos en grupos de 2 bytes. También, los registros índice pueden
incrementarse o decrementarse. Con esto mantenemos cuentas de 16 bits.
La arquitectura de registro índice dual del 68HC11 significa una mejora en diseño sobre
anteriores miembros de la familia 6800. Aunque ambos registros IX e IY pueden ser usados
similarmente para direccionamiento indexado, conteo, o almacenamiento temporal de datos,
ciertas instrucciones, particularmente aquellas para el registro IY, requieren un byte extra, o un
prebyte, de código máquina. La necesidad del prebyte surge como resultado del conjunto
expandido de instrucciones del 68HC11 al agregar nuevas instrucciones no usadas
previamente en la familia 6800.
La agregar el prebyte a una instrucción también provoca que una instrucción de dos bytes
requiera un ciclo extra de tiempo de ejecución (comparado con un opcode de un byte). Más que
como un byte extra del opcode (con tiempo de ejecución extra de un ciclo de máquina), una
instrucción con prebyte se programa y ejecuta como cualquier instrucción ordinaria (sin
prebyte). Los valores típicos del prebyte en el conjunto de instrucciones del 68HC11 son 1816 y
1A16. Los notará cuando estudie el conjunto de instrucciones del MC68HC11 con detalle, un
poco más adelante. Tenga en mente que, cuando se programan instrucciones que requieren
prebytes, el opcode con prebyte apropiado se programa en una localidad de memoria (M), y el
opcode de la instrucción es programado en la siguiente localidad (M+1), como si se tratara de
dos bytes de datos.
39
DL3155M24HC11
40
DL3155M24HC11
41
DL3155M24HC11
UNIDAD 3
CONJUNTO DE INSTRUCCIONES
42
DL3155M24HC11
CONTENIDO
43
DL3155M24HC11
Instrucciones Aritméticas
* Después de usar ABA, ADC, y ADD en operaciones aritméticas BCD; cada 8 bytes son
considerados como dos números BCD de 4 bit´s. DAA suma 0110 a la mitad del byte bajo, si el
número menos significativo es >1001, o si la instrucción previa causo un semiacarreo. Suma
0110 a la mitad del byte alto si el número más significativo >1001 o si la instrucción anterior
causo un acarreo. También suma 0110 al medio byte superior, si el número menos significativo
>1001 y el número más significativo es = 9.
* NOTA: Los bits 6 y 7, generalmente no se ven afectados por estas instrucciones.
44
DL3155M24HC11
Para asegurar que la idea es clara, veamos la primera instrucción en detalle. Esta es la
instrucción de suma. Ya que el 68HC11 tiene dos acumuladores, hay dos instrucciones de
suma. Sus mnemónicos son ADDA y ADDB. La última letra indica el acumulador que se usa. La
representación abreviada de la operación es A+MàA. La nota en la parte de arriba de la
columna, register labels indica que las letras se refieren al contenido de los registros. Así, A
significa el contenido del acumulador y M significa el contenido de la localidad de memoria
afectada. El símbolo à significa “transfiere a”. Por lo tanto, A+MàA significa “suma el
contenido del acumulador A al contenido de la localidad de memoria afectada y transfiere la
suma al acumulador A”.
Para ver como son afectadas las banderas de los códigos de condición, simplemente vea a la
derecha el código de condición deseado. Generalmente, los códigos pueden ser activados
según la operación ó no ser probados o afectados. Si no es afectado el código, se marca con el
símbolo (•). Por ejemplo, ninguna de las instrucciones aritméticas afectan la bandera I. Muchas
de las instrucciones aritméticas prueban los códigos de condición y los ponen a uno si existe la
condición. Por ejemplo, si el resultado de una operación aritmética es cero, la bandera Z es
puesta a uno. Si esta condición no existe, la bandera es limpiada. El símbolo (×) significa
“prueba y pon a uno si es verdad; de otra manera, limpia”. Ocasionalmente se necesita una
nota para describir alguna situación inusual del código de condición. Esto se representa con un
número dentro de un círculo. Las notas se dan abajo del dibujo.
Las instrucciones de suma con acarreo son idénticas a las discutidas anteriormente para la
máquina hipotética. Note que el bit de acarreo se integra a la suma.
Ya que en el MPU 68HC11 se usa aritmética de complemento a dos, existen instrucciones que
nos permiten obtener el complemento a dos de un número. La instrucción de negación, resta el
contenido del registro afectado de 00 16. Esto es lo mismo que hacer el complemento a dos del
número. El registro afectado puede ser cualquier localidad de memoria (M) o cualquier
acumulador (A o B). Así, hay tres instrucciones de negación distintas. Tenga en mente que
NEG significa “toma el complemento a dos de la localidad de memoria afectada”; NEGA “toma
el complemento a dos del acumulador A”; etc.
Note que la instrucción NEG nos permite operar sobre un byte en memoria sin buscar primero
el operando. Anteriormente, hemos cargado el operando, llevado a cabo la operación y
almacenado entonces el nuevo operando. Sin embargo, el 68HC11 nos permite llevar a cabo
45
DL3155M24HC11
ciertas operaciones sobre el operando, sin primero buscarlo en memoria. Algunos ejemplos de
esto serán mostrados según progresemos con el conjunto de instrucciones.
La instrucción de ajuste decimal efectúa exactamente lo mismo que nuestra máquina hipotética.
La nota inmediatamente debajo de la tabla describe su operación. Debe apuntarse que dicha
instrucción sólo trabaja con el acumulador A.
Las instrucciones de resta y resta con acarreo se explican por sí mismas. El MPU 68HC11 tiene
una instrucción adicional de resta. La instrucción SBA resta el contenido del acumulador B del
contenido del acumulador A. La diferencia resultante se coloca en el acumulador A.
La Figura 3-2 contiene un listado de las instrucciones más importantes de manejo de datos,
usadas por la MPU 68HC11. Este es el grupo más grande de instrucciones del 68HC11.
Las instrucciones para limpiar, nos permiten borrar el contenido de una localidad de memoria o
de cualquier acumulador. Anteriormente hemos limpiado bytes de memoria limpiando primero el
acumulador y almacenando luego el dato 0016 resultante en la localidad de memoria apropiada.
Sin embargo, la instrucción CLR nos permite despejar una localidad de memoria con una sola
instrucción. Nótese que aparecen algunas entradas nuevas en la columna de registros de
códigos de condición. R significa que el código de condición está siempre a cero. S significa
que el código está siempre a uno.
Las instrucciones de incremento son similares excepto porque nos permiten sumar uno a una
localidad de memoria o a alguno de los acumuladores. Note que la instrucción INC nos permite
mantener una cuenta en memoria sin tener que cargarla, incrementarla y volverla a almacenar.
Las instrucciones de carga al acumulador son sencillas de entender y fáciles de usar. Note que
el acumulador puede ser cargado desde la memoria.
46
DL3155M24HC11
Las instrucciones de rotación a la izquierda nos permiten desplazar el contenido del acumulador
o de una localidad de memoria sin perder bits del dato. Considere a la instrucción ROLA como
un ejemplo. Cuando se ejecuta esta instrucción, el acumulador A y el bit de acarreo forman un
registro circular de 9 bits. Esto es, forman un lazo cerrado como se muestra en la Figura 3-3A.
Cuando se ejecuta ROLA, el dato es rotado en sentido de las manecillas del reloj. El MSB de A
se desplaza al registro de acarreo. Simultáneamente, el contenido de A es desplazado a la
izquierda. Note que el bit de acarreo no se pierde, sino que es desplazado al LSB del
acumulador.
47
DL3155M24HC11
Aunque la utilidad de esta instrucción no es tan clara, es una herramienta valiosa. Por ejemplo,
podría ser usada para determinar la paridad. Rotando repetidamente a la izquierda y probando
la bandera C, puede determinar el número de 1´s en el byte. Una vez que lo conoce, puede
generar fácilmente el bit de paridad apropiado.
Las instrucciones de rotación a la derecha son iguales a las de la izquierda, lo que cambia es la
dirección de rotación. La Figura 3-4 ilustra la ejecución de la instrucción RORA. Esta instrucción
también es valiosa. Suponga, por ejemplo, que se desea saber si el número en el acumulador
es par o impar. Esto se determina con el LSB del número. Si LSB = 1, el número es impar; si
LSB = 0, el número es par. Una manera de determinar esto es, rotar el número a la derecha de
manera que el LSB quede en el registro C. Podemos probar el registro C para ver si está a uno
o a cero. Notese que el número debe ser restaurado a su forma original mediante la instrucción
ROLA.
48
DL3155M24HC11
Mientras sólo haya un tipo de instrucción de rotación a la izquierda, hay dos tipos de
instrucciones de rotación a la derecha. Discutamos primero las instrucciones de rotación a la
derecha.
Las instrucciones lógicas de rotación a la derecha son diferentes en que no retienen el bit de
signo. Cuando se ejecuta una rotación lógica a la derecha, El contenido del registro afectado es
desplazado a la derecha. El LSB pasa al registro de acarreo. MSB es llenado con un cero. Por
ejemplo, la instrucción LSR se ilustra en la Figura 3-7. Mientras esta instrucción desplaza
localidades de memoria seleccionadas, LSRA y LSRB pueden ser usadas para efectuar
operaciones similares sobre los acumuladores A y B, respectivamente.
49
DL3155M24HC11
Instrucciones Lógicas
Las instrucciones lógicas en la MPU 68HC11 son similares a las del MPU hipotético. La Figura
3-8 muestra las instrucciones lógicas del 68HC11.
Hay una instrucción AND para cada acumulador. Se efectúa la operación lógica AND bit a bit
entre los contenidos del acumulador especificado y la localidad de memoria seleccionada. El
resultado es colocado en el acumulador. Esto es idéntico a la instrucción AND de la máquina
hipotética.
50
DL3155M24HC11
Estas son un poderoso grupo de instrucciones que nos permiten comparar operandos en
diferentes formas. En previas unidades, usted adquirió experiencia comparando operandos. El
método más frecuentemente usado, es el de restar un operando de otro y comparar el resultado
con cero o negativo. En muchos casos, el resultado de la resta no fué muy importante. Sólo
requeríamos saber si el resultado fue cero o menos. Las instrucciones de prueba de datos nos
permiten hacer diferentes pruebas sin producir resultados numéricos no deseados. Esas
instrucciones son mostradas en la Figura 3-9.
Las instrucciones de prueba de bit son muy similares a las instrucciones AND. En ambos casos,
la operación AND se efectúa entre el contenido del acumulador especificado y el contenido de
la localidad de memoria seleccionada. La diferencia es que con la instrucción de prueba de bit
no se produce algún producto lógico. Ninguno de los contenidos del acumulador ni de la
memoria es alterado. Sin embargo, los registros de código de condición son afectados como lo
haría una operación AND. Considere la instrucción BITA. Cuando es ejecutada, se hace la
operación AND con M. Si el resultado es 0016, el registro Z se pone a uno. De otra manera, el
registro Z es limpiado. Si el MSB del resultado es 1, la bandera N se pone a uno. Sin embargo,
los contenidos del acumulador y de la memoria no son afectados.
51
DL3155M24HC11
producido una diferencia. Sin embargo, los contenidos originales de los acumuladores no son
afectados.
Los registros índice y apuntador de datos son registros de 16 bits. La Figura 3-10 muestra once
instrucciones que nos permiten controlar la operación de esos registros. A causa de su formato
de 16 bits, las instrucciones de carga, almacenamiento y comparación son ligeramente
diferentes a las discutidas previamente. También, puesto que el registro índice Y (IY) es muy
similar al registro índice X (IX), sólo discutiremos las instrucciones para IX. Al aprenderlas,
recuerde que hay instrucciones equivalentes para el registro índice Y.
La instrucción de comparación del registro índice (CPX) nos permite comparar el número de 16
bits del registro índice con otros dos bytes consecutivos de memoria. Recuerde que el registro
índice X mantendrá dos bytes. El byte alto se identifica como XH , mientras el byte bajo es
llamado XL . Cuando ejecutamos la instrucción CPX, XH es comparado con el byte de la
localidad de memoria especificada, M. Además, XL también es comparado con el byte
consecutivo a M, es decir M+1. La comparación se hace como si restáramos M y M+1 de XH y
XL, excepto que no se produce diferencia numérica. Ni X ni M cambia de manera alguna. Sin
embargo, los códigos de condición N, Z, y V son afectados como se muestra en la Figura 3-10.
52
DL3155M24HC11
Generalmente, el código Z es más interesante para nosotros pues nos dice cuando hay o no,
igualdad entre el registro índice y los dos bytes de memoria.
Las siguientes cuatro instrucciones se explican por sí mismas. Nos permiten incrementar y
decrementar ya sea el registro índice o el apuntador de pila. Esas instrucciones posibilitan
mantener dos cuentas de 16 bit simultáneamente.
Sin embargo, el valor real de esas instrucciones y sus registros asociados se discutirá después.
Las instrucciones de carga y almacenamiento para los registros de 16 bits se muestran en la
Figura 3-10. Ya que se trata de registros de dos bytes, las instrucciones LDX y LDS deben
cargar dos bytes de la memoria. En el caso del registro índice, el byte de memoria especificado
(M), es cargado en la mitad superior del registro índice (XH ). Un instante después, el siguiente
byte en memoria (M+1) es cargado automáticamente en la mitad baja del registro índice (XL).
Así, la operación puede ser descrita como sigue:
Las dos instrucciones finales de este grupo nos permiten transferir números entre esos dos
registros de 16 bits. La instrucción TXS carga el apuntador de pila con el contenido del registro
índice menos uno. La instrucción TSX carga el registro índice con el contenido del apuntador
de pila más uno. Una discusión más detallada de esos dos importantes registros y sus
instrucciones asociadas se hará en la siguiente unidad.
53
DL3155M24HC11
Instrucciones de Bifurcación
Las instrucciones de bifurcación son mostradas en la Figura 3-11. Se incluyen dos instrucciones
adicionales que afectan al contador de programa.
Nueve de esas instrucciones fueron discutidas en la unidad anterior. Esas son: Branch always,
bifurcar siempre (BRA); Branch if carry clear, Bifurca si está limpio el Acarreo (BCC); Branch is
carry set, Bifurca si está a uno el acarreo (BCS); Branch if equal Zero, Bifurca si es igual a cero
(BEQ); Branch if not equal Zero Bifurca si no es igual a cero (BNE); Branch if minus, Bifurca si
Menos (BMI); Branch if Plus, Bifurca si es Más (BPL); Branch if overflow clear, Bifurca si el
Sobreflujo está Limpio (BVC) y Branch if overflow set ,Bifurca si el Sobreflujo es Uno (BVS).
Antes de discutir las nuevas instrucciones de bifurcación, he aquí algunos símbolos que serán
usados. El símbolo (>) significa “es mayor o igual que”; (>) significa “ es mayor que”; (<)
significa “es menor o igual que”; (<) significa “es menor que” y (≠) significa “diferente de”.
Ahora considere la instrucción Bifurcar Si es Mayor o Igual (BGE). Esta instrucción se usa
normalmente después de una instrucción de resta o comparación. Esto causará una operación
de bifurcación si el valor en complemento a dos del acumulador es mayor o igual que el
complemento a dos del operando en memoria. Esta condición se indica por el mismo valor en
las banderas N y V. La MPU determina si esta condición se cumple haciendo el OR exclusivo
de N y V y examinando el resultado.
54
DL3155M24HC11
Tres ejemplos sencillos pueden ayudar a ilustrar la operación de esta instrucción. Comencemos
con un número en el acumulador, que es mayor que, el operando en memoria:
Cuando se resta el operando, el resultado es 000000002. Otra vez N y V son limpiados. Así, N y
V aún son iguales y N ⊕ V = 0. Otra vez, la instrucción BGE causa que ocurra una bifurcación.
Cuando el operando se resta, el resultado es 1111 1111 2. Esta vez N es puesto a uno pero V
es limpiado. Así, N y V no son iguales. Por lo tanto, N ⊕ V = 1. En este caso, la condición de
BGE no se cumple y no ocurrirá la bifurcación. La bifurcación ocurre si el valor en complemento
a dos del acumulador es mayor o igual que el complemento a dos del operando en memoria.
Enseguida, considere la instrucción Bifurca si es Mayor que (BGT). Esta instrucción se usa
normalmente después de una operación de resta o comparación. La bifurcación ocurrirá sólo si
el complemento a dos del minuendo es mayor que el complemento a dos del sustraendo.
Probando con varios ejemplos, como se hizo arriba, encontraremos que las condiciones de la
bifurcación se cumplen cuando Z = 0 y N = V.
La instrucción Branch if Less, Bifurca si es Menor o Igual (BLE) le permite comparar números
en complemento a dos de otra manera. Si se ejecuta inmediatamente después de una
operación de resta o comparación, la bifurcación ocurrirá sólo si el complemento a dos del
minuendo es menor o igual que el complemento a dos del sustraendo.
La instrucción Bifurca si es Bajo o el Mismo (BLS) es similar a la instrucción BLE excepto que
compara números no signados. Cuando se ejecuta inmediatamente después de una operación
55
DL3155M24HC11
La instrucción Bifurca si es Menor que Cero (BLT) es también similar a la instrucción BLE
excepto que no efectúa comparación de igualdad. Si BLT se ejecuta enseguida de una
operación de resta o comparación, Habrá bifurcación sólo si el complemento a dos del
minuendo es menor que el complemento a dos del sustraendo.
56
DL3155M24HC11
La instrucción Clear carry, Limpiar Acarreo (CLC) pone a cero la bandera C, set carry, Fijar
Acarreo a Uno (SEC) C=1. De la misma forma, las instrucciones CLV y SEV pueden ser usadas
para limpiar o fijar a uno la bandera de sobreflujo. También, las instrucciones CLI y SEI pueden
usarse para limpiar o fijar a uno la bandera de interrupción.
Usted notará que no hay instrucciones para limpiar individualmente las banderas N, Z o H. Sin
embargo, aún podemos fijar a uno o limpiar esas banderas con la instrucción de Transfer
Accumulator A, Transferencia del Acumulador A al Processor Status Reguister, Registro de
Estado del Procesador (TAP). La Figura 3-13 ilustra la ejecución de dicha instrucción. El
contenido de los bit 0 al 7 del acumulador A es transferido a los registros de código de
condición. Así, esta instrucción nos permite fijar a uno o limpiar todos los códigos de condición
con sólo una instrucción.
La instrucción final es la instrucción de Transfer Processor Status, Transferencia del Estado del
Procesador al Acumulador A (TPA). Durante su ejecución, el contenido de los registros de
código de condición es transferido a los bits 0 al 7 del acumulador A. Esta operación se ilustra
en la Figura 3-14.
57
DL3155M24HC11
En el modo de direccionamiento inherente puede ser que no haya operando o que el operando
esté implícito en la instrucción. Estas son instrucciones de un byte.
Direccionamiento Extendido
El formato de una instrucción que usa direccionamiento extendido se muestra en la Figura 3-15.
La instrucción siempre tendrá tres bytes. El primer byte es el opcode. El segundo y tercer bytes
forman una dirección de 16 bits. Note que la parte mas significativa de la dirección es el byte
consecutivo del opcode. Puesto que esta instrucción tiene una dirección de 16 bits, el operando
puede ser cualquiera de las 655361 0 direcciones posibles.
58
DL3155M24HC11
Fig. 3-15 Formato de una instrucción que usa el modo de direccionamiento extendido.
Por ejemplo, suponga que desea cargar el operando residente en la localidad de memoria
213416 en el acumulador B. La instrucción se verá como sigue:
Note que, con direccionamiento directo, la dirección de orden alto puede ser ignorada, ya que
siempre es 00. Puesto que el direccionamiento directo ahorra un byte de memoria y un ciclo de
MPU, normalmente es usado cuando el operando se halla en los 2561 0 bytes de memoria. El
direccionamiento extendido se usa cuando el operando se halla arriba de la dirección 00FF16.
Sin embargo, como vera después, algunas instrucciones no cuentan con direccionamiento
directo. En esos casos debe emplearse direccionamiento extendido aun si el operando esta en
las primeras 25610 localidades de memoria.
Direccionamiento Indexado
59
DL3155M24HC11
Fig. 3-15. Formato de una instrucción que usa modo de direccionamiento indexado
60
DL3155M24HC11
En cada caso, la X nos dice que usamos direccionamiento indexado. Por ejemplo, la primera
instrucción significa “usando direccionamiento indexado, carga el contenido de la localidad de
memoria especificada en el acumulador A”. Ahora veamos como se determina la dirección del
operando.
013316
+
1116
014416
61
DL3155M24HC11
que esto no cambia el contenido del registro índice de ninguna manera. Así, el registro índice
contiene aún 013316 después de la ejecución de la instrucción.
Sumando una lista de números. Para ver como este modo de direccionamiento ahorra
instrucciones, considere el problema antes planteado. Recuerde que queremos sumar 2016
números almacenados en localidades de memoria, consecutivas, comenzando en la dirección
0050. Empleando direccionamiento indexado para la instrucción de suma, nuestro programa
queda como en la Figura 3-17.
La primera instrucción es cargar el registro índice en modo inmediato. Note que se emplea un
nuevo símbolo en este programa. El símbolo # indica el modo de direccionamiento inmediato.
Así, la instrucción LDX# causa que el operando que sigue al opcode sea cargado en el registro
índice. Recuerde que el registro índice puede guardar 2 bytes. El operando es el número de
dos bytes 005016. No olvide que esta es la dirección del primer número en la lista de números
para sumar.
La cuarta instrucción incrementa el registro índice a 005116. Ahora apunta a la dirección del
segundo número de la lista.
La quinta instrucción compara el número en el registro índice con un número que es mayor en
una unidad a la dirección del último número de la lista.
62
DL3155M24HC11
La instrucción BNE prueba la bandera Z para ver si los dos números son iguales. Si no se
indica igualdad, la dirección relativa (F8) dirige el retorno del programa a la instrucción ADDA,X.
El primer paso en el lazo termina con el primer número en el acumulador A.
El segundo paso en el bucle comienza con la ejecución, otra vez, de la instrucción ADDA,X.
Esta vez, el registro índice apunta a la dirección 0051. Por lo tanto, el segundo número de la
lista se suma al acumulador A. El acumulador A ahora contiene la suma de los dos primeros
números. El registro índice es incrementado a 0052. Su contenido se compara otra vez con
0070. No hay igualdad, lo que provoca que la instrucción BNE repita el bucle una vez más.
El lazo es repetido una y otra vez. Cada vez se suma al acumulador A, el siguiente número de
la lista. Este proceso continúa hasta que el último número de la lista es sumado. Para entonces,
el registro índice será incrementado a 0070. Así, cuando se ejecute la instrucción CPX #, la
bandera Z será activada, al haber igualdad entre los dos números. La instrucción BNE reconoce
que hay igualdad. Consecuentemente, no permite que ocurra la bifurcación y la siguiente
instrucción en secuencia, se ejecuta. Ya que se trata de la instrucción STOP, el programa se
detiene. Para entonces, la suma de los 2016 números de la lista se hallará en el acumulador A.
Sumar una lista de números es un ejemplo clásico de cómo el modo indexado, puede ser usado
para acortar un programa. Sin embargo, este ejemplo no muestra la potencia total del
direccionamiento indexado. Por ejemplo, no ilustra la ventaja de la dirección offset. Ya que el
direccionamiento indexado es tan importante, veamos otro ejemplo.
Copiando una lista. Supongamos que tenemos una lista de 1016 números que deseamos
copiar de una localidad a otra. Por simplicidad, suponga que la lista está presente en las
direcciones 0030 a la 003F y que deseamos copiarla en la localidad 0040 a la 004F. Sin usar
direccionamiento indexado, nuestro programa quedaría así:
LDAA
30
STAA
40
LDAA
31
STAA
41
.
.
.
LDAA
3F
STAA
4F
63
DL3155M24HC11
STOP
Como puede ver; programas largos y repetitivos como éste, son excelentes candidatos para el
direccionamiento indexado.
La instrucción STAA, X ilustra el uso de la dirección offset. Dicha compensación es 10. Este
numero se suma a la dirección en el registro índice para formar la dirección efectiva en la cual
el contenido del acumulador A es almacenado. Así, el contenido del acumulador A se almacena
en la dirección 0040. Recuerde, esto no cambia el numero del registro índice de manera
alguna. Empleando la compensación, podemos cargar el acumulador indexado de una
dirección y almacenar el acumulador indexado en otra.
Enseguida, se incrementa el registro índice a 0031. Se compara con 0040. Ya que no son
iguales, la instrucción BNE dirige el programa de regreso a la instrucción LDAA, X. El ciclo se
repite hasta que la lista entera se reescriba en las localidades 0040 a la 004F. Después de
copiado el ultimo dato, el registro índice se incrementa a 0040. Así, la instrucción CPX # pone a
uno la bandera Z permitiendo que la instrucción BNE saque del ciclo, al programa. El
programa se detiene después que los datos de la lista son escritos en su nueva posición de
memoria.
64
DL3155M24HC11
Como se menciono, el 68HC11 puede ejecutar todas las instrucciones del MC6800 y del
MC6801. También, la CPU 68HC11 tiene un mapa de códigos de operación paginado con un
total de 91 nuevos opcodes. Las mayores adiciones funcionales del 68HC11 que lo distinguen
de los miembros anteriores de la familia incluyen: el registro índice Y, IY; dos tipos de
instrucciones de división de 16 por 16; la instrucción STOP; una instrucción de manipulación de
bits y las instrucciones aritméticas de multiplicación, división, etc.
La Figura 3-19 muestra todas las instrucciones del 68HC11 en todos los modos de
direccionamiento posibles. La información dada ahí, incluye, de izquierda a derecha, los
Formatos Fuente (Mnemónicos), la Operación, la Expresión Boleaba (symbolic logic), el Modo
de Direccionamiento del Operando, el Código Maquina en Hexadecimal del Opcode/Operando,
e información del número de bytes y ciclos de máquina requeridos por la instrucción. Sigue una
breve descripción de cada una.
La columna de Operación de la Figura 3-19 contiene una breve descripción del mnemónico a la
izquierda. Note cómo el mnemónico se deriva directamente de la corta frase descriptiva de la
operación. Por ejemplo, ASL significa “Arithmetic Shift Left” (Corrimiento Aritmético a la
Izquierda).
Finalmente, la última columna contiene información acerca del efecto de la ejecución de una
instrucción sobre el registro de códigos de condición (banderas). Existen diversas posibilidades.
Dependiendo de la instrucción y del modo de direccionamiento, los bits del código de condición
pueden permanecer sin cambio, ser limpiados (0), o activados (1).
65
DL3155M24HC11
Observe detenidamente el conjunto de instrucciones del 68HC11 dado en la Figura 3-19 para
familiarizarse con las operaciones y sus mnemónicos. Algunas de esas fueron discutidas
anteriormente.
66
DL3155M24HC11
67
DL3155M24HC11
68
DL3155M24HC11
69
DL3155M24HC11
70
DL3155M24HC11
71
DL3155M24HC11
NOTAS:
Ciclo:
- = Infinito o hasta que ocurra un reset
-- = Se usan 12 ciclos comenzando con el opcode de búsqueda, entra a un estado de espera por un tiempo
equivalente a un número entero de ciclos MPU del E-clock, hasta que una interrupción es reconocida.
Finalmente, dos ciclos adicionales se usan para buscar el vector de interrupción adecuado (total = 14 +n)
Operando(s)
dd = 8 bits direccionamiento directo $0000 - $FFFF. (Se asume que el byte alto es $00)
ff = Compensación positiva(positive offset) de 8 bits $00 (0) a $FF(255), sumado al índice.
hh = Byte de orden bajo de 16 bits direccionamiento extendido
ii = Un byte de dato inmediato
jj = Byte de orden alto de 16 bits dato inmediato
kk = Byte de orden bajo de 16-bits dato inmediato
ll = Byte de orden bajo de 16-bits, direccionamiento extendido
mm = Mascara de 8 bits (los bits se activan al ser afectados)
rr = Compensación relativa(relative offset) signada $80 (-128) a $7F (+ 127)
Compensación relativa a la dirección siguiente al código de máquina, byte offset.
Código de condición:
-- Bit no cambiado
0 Siempre borrado ("0" lógico)
1 Siempre activado("1" lógico)
ô Bit activado o borrado según la operación
72
DL3155M24HC11
73
DL3155M24HC11
NOMENCLATURA
(a) Operadores
ACCA = Acumulador A
ACCB = Acumulador B
ACCX = Acumulador ACCA o ACCB
ACCD = Acumulador doble. Acumulador A concatenado con el acumulador
B, donde A es el byte más significativo.
CCR = Registro código de condición
IX = Registro índice X, 16 bits
IXH = Registro índice X, 8 bits de orden alto.
IXL = Registro índice X, 8 bits de orden bajo.
IY = Registro índice Y, 16 bits
IYH = Registro índice Y, 8 bits de orden alto.
IYL = Registro índice Y, 8 bits de orden bajo.
PC = Contador de programa, 16 bits.
PCH = Contador de programa, 8 bits de orden alto (más significativo)
PCL = Contador de programa, 8 bits de orden bajo (menos significativo)
SP = Stack Pointer, 16 bits.
SPH = Stack Pointer, 8 bits de orden alto.
SPL = Stack Pointer, 8 bits de orden bajo.
74
DL3155M24HC11
75
DL3155M24HC11
- = Bit no afectado.
0 = Se coloca un bit 0
1 = Se coloca un bit 1
= Bit colocado estará de acuerdo al resultado de la operación
= El bit cambiara permanecerá constante o podrá cambia de 1 a 0
76
DL3155M24HC11
INSTRUCCIONES
ABA
Suma el acumulador B, al Acumulador A
S X H I N Z V C
— — —
ABX
Suma el acumulador B, al registro índice X
Descripción: Suma el contenido de 8 bits sin signo del ACCB, al contenido del registro
índice X (IX), tomando en cuenta el posible acarreo fuera del byte de orden
bajo del registro índice; colocando el resultado en el registro índice X (IX).
ACCB no cambia.
S X H I N Z V C
— — — — — — — —
Mnemónico: ABX
77
DL3155M24HC11
ABY
Suma el acumulador B, al registro índice Y
Descripción: Suma el contenido sin signo de 8 bits, del ACCB, al contenido del registro
índice Y (IY), tomando en cuenta el posible acarreo fuera del byte de orden
bajo del registro índice Y; colocando el resultado en el registro índice Y
(IY). ACCB no cambia.
Mnemónico: ABY
ADC
Suma con acarreo.
Descripción: Suma de los contenidos del bit "C", a la suma del contenido ACCX y M,
colocando el resultado en ACCX.
S X H I N Z V C
— — —
78
DL3155M24HC11
ADD
Suma sin acarreo
S X H I N Z V C
— — —
ADDD
Suma con el acumulador doble
S X H I N Z V C
— — — —
79
DL3155M24HC11
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=1 Si hubo sobreflujo en complemento a dos en el resultado de la
operación; 0 en otro caso.
C=1 Si hubo un acarreo desde el bit más significativo del resultado, 0
en otro caso.
AND
Operación lógica AND
S X H I N Z V C
— — — — 0 —
ASL
Corrimiento aritmético a la izquierda
(Igual que LSL)
Operación:
80
DL3155M24HC11
S X H I N Z V C
— — — —
ASLD
Corrimiento aritmético a la izquierda del acumulador D
(Igual que LSLD)
Operación:
Descripción: Corrimiento de todos los bits de ACCD, una posición a la izquierda. El bit 0
es cargado con "0". El bit C en el CCR es cargado desde el bit más
significativo de ACCD.
S X H I N Z V C
— — — —
Mnemónico: ASLD
81
DL3155M24HC11
ASR
Corrimiento aritmético a la derecha
Operación:
Descripción: Corrimiento de todos los bits de ACCX o M una posición a la derecha. El bit
7 es constante. El bit 0 se carga dentro del bit "C" de CCR.
S X H I N Z V C
— — — —
BCC
Salta si el acarreo es borrado
(igual a BHS)
Descripción: Prueba el estado del bit "C", en el registro código de condición y causa un
salto si éste se encuentra borrado.
Ver instrucción BRA para mayores de talles de instrucciones de salto.
Mnemónicos : BCC(rel)
82
DL3155M24HC11
BCLR
Borrado de bit(s), en memoria
Operación:
M ← M • ( PC + 2 )
M ← M • ( PC + 3 ) Modo de direccionamiento solo
para IND, Y
Descripción: Borra los bits múltiples en la localidad M. Los bits a ser borrados se
especifican con unos, en el byte de mascara. Todos los otros bits en M no
se ven afectados.
S X H I N Z V C
— — — — 0 —
BCS
Salta si el acarreo esta activado
(Igual a BLO)
Descripción: Prueba el estado del bit "C", del registro código de condición y causa un
salto si dicho bit esta activado.
Para mayores de talles, vea la instrucción BRA, respecto a la ejecución de
salto.
83
DL3155M24HC11
BEQ
Salta si es igual
Descripción: Prueba el estado del bit "Z", del registro código de condición y causa un
salto si dicho bit esta activado.
BGE
Salta si es mayor o igual a cero.
84
DL3155M24HC11
BGT
Salta si es mayor a cero.
BHI
Salta si es mayor.
85
DL3155M24HC11
BHS
Salta si es mayor o igual.
(igual a BCC)
Mnemónico: BHS(rel)
BIT
Bit de prueba.
S X H I N Z V C
— — — — 0 —
86
DL3155M24HC11
V=0 0
BLE
Salta si es menor o igual a cero.
(igual a BCC)
Mnemónico: BLE(rel)
BLO
Salta si es menor
(Igual a BCS)
87
DL3155M24HC11
(A, B o D), el salto ocurre, sí y solo sí, el número binario sin signo
representado por el minuendo (ACCX), fue menor que el número binario sin
signo representado por el substraendo(M).
Mnemónico: BLO(rel)
BLS
Salta si es menor o igual
Mnemónico: BLS(rel)
88
DL3155M24HC11
BNE
Salta si no es igual.
Mnemónico: BNE(rel)
BPL
Salta si es más.
Mnemónico: BPL(rel)
89
DL3155M24HC11
BRA
Salta siempre
BRCLR
Salta si el bit(s) es borrado.
Descripción: Revisa la localidad de memoria M y salta sí, todos los bits especificados
con 1 en el byte de la mascara son cero en el byte de prueba. El salto puede
ser solo si todos los bits revisados son cero en el byte de prueba
90
DL3155M24HC11
BRN
Nunca salta
Descripción: Nunca salta. Esta instrucción puede ser considerada como dos bytes de no
operación, requiere tres ciclos de máquina para su ejecución. Esta
inclusión en la instrucción
Nota: El programa fuente especifica el destino de una instrucción de salto
por medio de la dirección absoluta, tanto el valor numérico como un
símbolo o expresión pueden ser numéricamente evaluados por el
ensamblador. El ensamblador obtiene la dirección relativa Rel, de la
dirección absoluta y del valor actual del contador de programa.
Mnemónico: BRN(rel)
BRSET
Salta si el bit(s) esta activado
Operación:
PC ← (PC) + 0004 + Rel Sí M • (PC + 2) = 0
PC ← (PC) + 0005 + Rel Sí M • (PC + 3) = 0 (modo de direccionamiento indexado
Y)
Mnemónico: BRSET(opr)(msk)(rel)
91
DL3155M24HC11
BSET
Activa el bit(s), en memoria
Operación:
M ← M + ( PC + 2 )
M ← M + ( PC + 3 ) Modo de direccionamiento
indexado Y
Descripción: Activa los bits múltiples en la localidad M. Los bits a ser activados son
especifican con unos, en el byte de mascara. Todos los otros bits en M no
se ven afectados.
S X H I N Z V C
— — — — 0 —
BSR
Salto a subrutina
Operación: PC ← (PC) + 0002
↓ (PCL)
SP←← (SP) - 0001
↓ (PCH)
SP ← (SP) - 0001
PC ← (PC) + Rel
92
DL3155M24HC11
BVC
Salta si la bandera de sobreflujo esta borrada
Mnemónico: BVC(rel)
BVS
Salta si la bandera de sobreflujo esta activada
Mnemónico: BVS(rel)
93
DL3155M24HC11
CBA
Comparación entre acumuladores
S X H I N Z V C
— — — —
Mnemónicos: CBA
CLC
Borra el acarreo
Operación: C bit ← 0
S X H I N Z V C
— — — — — — — 0
Mnemónicos: CLC
94
DL3155M24HC11
CLI
Borra la mascara de interrupción
Operación: I bit ← 0
S X H I N Z V C
— — — 0 — — — —
I=0
Mnemónicos: CLI
CLR
Borrado
Operación: (ACCX) ← 00
M ← 00
S X H I N Z V C
— — — — 0 1 0 0
N=0 Borrado
Z=1 Activado
V=0 Borrado
C=0 Borrado
95
DL3155M24HC11
CLV
Borra el bit de sobreflujo en complemento a dos
Operación: V bit ← 0
S X H I N Z V C
— — — — — — 0 —
V=0
Mnemónicos: CLV
CMP
Compara
S X H I N Z V C
— — — —
96
DL3155M24HC11
COM
Complementa
S X H I N Z V C
— — — — 0 1
CPD
Compara acumulador - D
S X H I N Z V C
— — — —
97
DL3155M24HC11
CPX
Compara el registro índice X
S X H I N Z V C
— — — —
98
DL3155M24HC11
CPY
Compara el registro índice Y
S X H I N Z V C
— — — —
DAA
Ajuste decimal del ACCA
99
DL3155M24HC11
BCD
(binary coded decimal). La tabla muestra los valores hexadecimales.
S X H I N Z V C
— — — —
DEC
Decremento
S X H I N Z V C
— — — —
100
DL3155M24HC11
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=1 Si hubo sobreflujo en complemento a dos en el resultado de la
operación; 0 en otro caso.
C=1 Si hubo un acarreo desde el bit más significativo del resultado, 0
en otro caso.
DES
Decremento del Stack Pointer
S X H I N Z V C
— — — — — — — —
Mnemónico: DES
101
DL3155M24HC11
DEX
Decremento del registro índice X
S X H I N Z V C
— — — — — — —
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
Mnemónico: DEX
DEY
Decremento del registro índice Y
S X H I N Z V C
— — — — — — —
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
Mnemónico: DEY
102
DL3155M24HC11
EOR
Operación de OR exclusiva.
S X H I N Z V C
— — — — 0 —
FDIV
División fraccional
Descripción: Ejecuta una división fraccional sin signo, del numerador de 16 bits en el
acumulador D, y el denominador de 16 bits en el registro índice X,
activando los códigos de condición correspondientes. El cociente es
colocado en el registro índice X y el residuo en el acumulador D. Se asume
que el punto flotante, es el mismo para ambos operandos. Dicho punto es a
la izquierda del bit 15, para el cociente, considerando que el numerador es
menor al denominador. En caso de sobreflujo (denominador menor o igual
al numerador) o división por cero, el cociente es $FFFF. En el caso de
división por cero, el residuo es indeterminado.
Registro de Códigos de condición (CCR)
S X H I N Z V C
— — — — —
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=1 Si hubo sobreflujo en complemento a dos en el resultado de la
103
DL3155M24HC11
Mnemónico: FDIV
IDIV
División de enteros
Descripción: Ejecuta una división de enteros sin signo, del numerador de 16 bits en el
acumulador D, y el denominador de 16 bits en el registro índice X,
activando los códigos de condición correspondientes. El cociente es
colocado en el registro índice X y el residuo en el acumulador D. Se asume
que el punto flotante, es el mismo para ambos operandos. Dicho punto es a
la derecha del bit "0", para el cociente. Considerando que el numerador es
menor al denominador. En caso de división por cero, el cociente es $FFFF.
En el caso de división por cero, el residuo es indeterminado.
S X H I N Z V C
— — — —
Mnemónico: IDIV
104
DL3155M24HC11
INC
Incremento
S X H I N Z V C
— — — — —
INS
Incremento del Stack Pointer
No afectados
Mnemónico: INS
105
DL3155M24HC11
INX
Incremento del registro índice X
S X H I N Z V C
— — — — — — —
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
Mnemónico: INX
INY
Incremento del registro índice Y
S X H I N Z V C
— — — — — — —
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
Mnemónico: INY
106
DL3155M24HC11
JMP
Salto
No afectados
Mnemónico: JMP(opr)
JSR
Salto a subrutina
No afectados
Mnemónico: JSR(opr)
107
DL3155M24HC11
LDA
Carga el acumulador
S X H I N Z V C
— — — — 0 —
LDD
Carga el acumulador doble
S X H I N Z V C
— — — — 0 —
Mnemónico: LDD(opr)
108
DL3155M24HC11
LDS
Carga el Stack Pointer
Descripción: Carga el byte más significativo del stack pointer con el byte de memoria de
la dirección especificada por el programa, y carga el byte menos
significativo del stack pointer con el siguiente byte de memoria, es decir,
una dirección más de la especificada por el programa.
S X H I N Z V C
— — — — 0 —
Mnemónico: LDS(opr)
LDX
Carga el registro índice X
Descripción: Carga el byte más significativo del registro índice X, con el byte de memoria
de la dirección especificada por el programa, y carga el byte menos
significativo del registro índice X, con el siguiente byte de memoria, es
decir, una dirección más de la especificada por el programa.
S X H I N Z V C
— — — — 0 —
109
DL3155M24HC11
V=0
Mnemónico: LDX(opr)
LDY
Carga el registro índice Y
Descripción: Carga el byte más significativo del registro índice Y, con el byte de memoria
de la dirección especificada por el programa, y carga el byte menos
significativo del registro índice Y, con el siguiente byte de memoria, es
decir, una dirección más de la especificada por el programa.
S X H I N Z V C
— — — — 0 —
Mnemónico: LDY(opr)
110
DL3155M24HC11
LSL
Corrimiento lógico a la izquierda
(Igual que ASL)
Operación:
S X H I N Z V C
— — — —
LSLD
Corrimiento lógico a la izquierda del acumulador D
(Igual que ASLD)
Operación:
Descripción: Corrimiento de todos los bits de ACCD, una posición a la izquierda. El bit 0
es cargado con "0". El bit C, es cargado desde el bit más significativo de
ACCD.
Registro de Códigos de condición (CCR)
S X H I N Z V C
— — — —
111
DL3155M24HC11
caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=1 Si hubo sobreflujo en complemento a dos en el resultado de la
operación; 0 en otro caso.
C=1 Si hubo un acarreo desde el bit más significativo del resultado, 0
en otro caso.
Mnemónico: LSLD
LSR
Corrimiento lógico a la derecha.
Operación:
S X H I N Z V C
— — — — 0
N=0
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=1 Si hubo sobreflujo en complemento a dos en el resultado de la
operación; 0 en otro caso.
C=1 Si hubo un acarreo desde el bit más significativo del resultado, 0
en otro caso.
112
DL3155M24HC11
LSRD
Corrimiento lógico a la derecha del acumulador D
Operación:
Descripción: Corrimiento de todos los bits de ACCD, una posición a la izquierda. El bit 0
es cargado con "0". El bit C, es cargado desde el bit más significativo de
ACCD.
Registro de Códigos de condición (CCR)
S X H I N Z V C
— — — — 0
Mnemónico: LSRD
MUL
Multiplicación sin signo
Descripción: Multiplica los 8 bits en el acumulador A, por los 8 bits del acumulador B, y
se obtiene un resultado sin signo de 16 bits, en el acumulador doble.
S X H I N Z V C
— — — — — — —
Mnemónico: MUL
113
DL3155M24HC11
NEG
Negación
S X H I N Z V C
— — — —
NOP
No-operación
S X H I N Z V C
— — — — — — — —
A. Mnemónico: NOP
114
DL3155M24HC11
ORA
Operación OR inclusiva
S X H I N Z V C
— — — — 0 —
PSH
Coloca datos en la pila
Operación: ↓ (ACCX)
SP ← (SP) - 0001
No afectados.
115
DL3155M24HC11
PSHX
Coloca el registro índice X en la pila
Operación: ↓ (IXL), SP ← (SP) – 0001
↓ (IXH), SP ← (SP) - 0001
C. Mnemónico: PSHX
PSHY
Coloca el registro índice Y en la pila
Operación: ↓ (IYL), SP ← (SP) – 0001
↓ (IYH), SP ← (SP) - 0001
D. Mnemónico: PSHY
116
DL3155M24HC11
PUL
Extrae datos de la pila
Operación: SP ← (SP) + 0001;
↑ ACCX
PULX
Extrae el registro índice X de la pila
Operación: SP ← (SP) + 0001; ↑ (IXL),
SP ← (SP) + 0001; ↑ (IXH),
F. Mnemónico: PULX
117
DL3155M24HC11
PULY
Extrae el registro índice Y de la pila
Operación: SP ← (SP) + 0001; ↑ IYL,
SP ← (SP) + 0001; ↑ IYH,
G. Mnemónico: PULY
ROL
Rota a la izquierda.
Operación:
S X H I N Z V C
— — — —
118
DL3155M24HC11
ROR
Rota a la derecha
Operación:
S X H I N Z V C
— — — —
119
DL3155M24HC11
RTI
Regreso de interrupciones.
RTS
Regreso de subrutina
Descripción: El stack pointer es, incrementado en "1". El contenido del byte de memoria,
en las direcciones ahora contenidas en el stack pointer, se cargan en 8 bits
de orden alto del contador d programa, después el stack pointer es
nuevamente incrementado. Los contenidos del byte de memoria, en la
dirección ahora ubicada en el stack pointer, son cargados en el byte de
orden bajo del contador de programa.
No afectados
Mnemónico: RTS
120
DL3155M24HC11
SBA
Resta entre acumuladores
Operación: (ACCA) ← (ACCA) - (ACCB)
S X H I N Z V C
— — — —
Mnemónico: SBA
SBC
Resta con acarreo
S X H I N Z V C
— — — —
121
DL3155M24HC11
SEC
Activa el acarreo
Operación: Bit C ← 1
S X H I N Z V C
— — — — — — — 1
C=1
Mnemónico: SEC
SEI
Activa la mascara de interrupción
Operación: Bit I ← 1
S X H I N Z V C
— — — 1 — — — —
I=1
Mnemónico: SEI
122
DL3155M24HC11
SEV
Activa el bit de sobreflujo en complemento a dos.
Operación: Bit V ← 1
Descripción: Activa el bit "V", sobreflujo por complemento a dos, en el registro código
de condición.
S X H I N Z V C
— — — — — — 1 —
V=1
Mnemónico: SEV
STA
Almacena el acumulador
Operación: M ← (ACCX)
S X H I N Z V C
— — — — 0 —
123
DL3155M24HC11
STD
Almacena el acumulador doble
Operación: M : M + 1 ← (ACCD)
S X H I N Z V C
— — — — 0 —
Mnemónico: STD(opr)
STOP
Detiene el proceso
No afectados
Mnemónico: STOP
124
DL3155M24HC11
STS
Almacena el stack pointer
Operación: M ← (SPH)
← (SPL)
M + 1←
S X H I N Z V C
— — — — 0 —
Mnemónico: STS(opr)
STX
Almacena el registro índice X
Operación: M ← (IXH)
← (IXL)
M + 1←
S X H I N Z V C
— — — — 0 —
Mnemónico: STX(opr)
125
DL3155M24HC11
STY
Almacena el registro índice Y
Operación: M ← (IYH)
← (IYL)
M + 1←
S X H I N Z V C
— — — — 0 —
Mnemónico: STY(opr)
SUB
Substracción.
Operación: (ACCX) ← (ACCX) -- (M)
S X H I N Z V C
— — — —
126
DL3155M24HC11
SUBD
Substracción del acumulador "D", doble
S X H I N Z V C
— — — —
SWI
Interrupción por software
127
DL3155M24HC11
S X H I N Z V C
— — — 1 — — — —
I=1
Mnemónico: SWI
TAB
Transferencia del acumulador A, al acumulador B
S X H I N Z V C
— — — — 0 —
Mnemónico : TAB
128
DL3155M24HC11
TAP
Transferencia del acumulador A, al registro código de condición
7 6 5 4 3 2 1 0
ACCA
S X H I N Z V C CCR
Sobreflujo
Zero
Negativo
Mascara de interrupción- I
Medio acarreo o semiacarreo (del
bit 3)
Mascara de interrupción X
Paro deshabilitado
Códigos
de condición:.
Activa o borra los códigos de acuerdo al valor de cada bit del acumulador
A.
Mnemónico : TAP
129
DL3155M24HC11
TBA
Transferencia del acumulador B, al acumulador A
S X H I N Z V C
— — — — 0 —
Mnemónico : TBA
TEST
Operación de prueba
(Test Mode Only)
Descripción: Esta instrucción de un solo byte, causa que el contador de programa sea
continuamente incrementado. Puede ser ejecutada solo en el modo de
prueba (test mode). El MPU puede ser restablecido al salir de esta
instrucción.
R/ = 1(lectura, Read), durante esta instrucción. El código de ejecución
esta suspendido durante esta instrucción. Este es un opcode ilegal, cuando
esta en modo prueba.
No afectados.
Mnemónico: TEST
130
DL3155M24HC11
TPA
Transferencia del registro código de condición, hacia el acumulador A
7 6 5 4 3 2 1 0
ACCA
S X H I N Z V C CCR
Sobreflujo
Zero
Negativo
Mascara de interrupción- I
Medio acarreo o semiacarreo (del
bit 3)
Mascara de interrupción X
Paro deshabilitado
Códigos
de condición:.
No afectado
Mnemónico : TPA
131
DL3155M24HC11
TST
Prueba
Operación: (ACCX) -- 00
(M) -- 00
Descripción: Substrae $00 del contenido de ACCX o M y activa los códigos de condición
correspondientes. La substracción es realizada internamente sin modificar
a ACCX o M.
Registro de Códigos de condición (CCR)
S X H I N Z V C
— — — — 0 0
TSX
Transferencia del stack pointer al registro índice X
Descripción: Carga el registro índice X, con el stack pointer más uno. El contenido del
stack permanece sin cambio.
No afectados.
Mnemónico: TSX
132
DL3155M24HC11
TSY
Transferencia del stack pointer al registro índice Y
Descripción: Carga el registro índice Y, con el stack pointer más uno. El contenido del
stack permanece sin cambio.
No afectados.
Mnemónico: TSY
TXS
Transferencia del registro índice X, al stack pointer
Descripción: Carga el stack pointer con el registro índice X, menos uno. El contenido del
registro índice X, permanece sin cambio.
No afectados.
Mnemónico: TXS
TYS
Transferencia del registro índice Y, al stack pointer
Descripción: Carga el stack pointer con el registro índice Y, menos uno. El contenido del
registro índice Y, permanece sin cambio.
No afectados.
Mnemónico: TYS
133
DL3155M24HC11
WAI
Espera para interrupción
S X H I N Z V C
— — — 1 — — — —
N=1
Mnemónico: WAI
134
DL3155M24HC11
XGDX
Intercambio entre el acumulador "D" y el registro índice X
Descripción: Intercambia el contenido del acumulador "D" con el contenido del registro
índice X.
No afectados.
Mnemónico: XGDX
XGDY
Intercambio entre el acumulador "D" y el registro índice Y
Descripción: Intercambia el contenido del acumulador "D" con el contenido del registro
índice Y.
No afectados.
Mnemónico: XGDY
135
DL3155M24HC11
136
DL3155M24HC11
Como usarse.
137
DL3155M24HC11
15 Byte 8 7 Byte 0
15 caract. 12 11 caract. 8 7 caract. 3 caract. 0
4
HEX DEC HEX DEC HEX DEC HEX DEC
0 0 0 0 0 0 0 0
1 4,096 1 256 1 16 1 1
2 8,192 2 512 2 32 2 2
3 12,288 3 768 3 48 3 3
4 16,384 4 1,024 4 64 4 4
5 20,480 5 1,280 5 80 5 5
6 24,576 6 1,536 6 96 6 6
7 28,672 7 1,792 7 112 7 7
8 32,768 8 2,048 8 128 8 8
9 36,864 9 3,304 9 144 9 9
A 40,960 A 2,560 A 160 A 10
B 45,056 B 2,816 B 176 B 11
C 49,152 C 3,072 C 192 C 12
D 53,248 D 3,328 D 208 D 13
E 57,344 E 3,584 E 224 E 14
F 61,440 F 3,840 F 240 F 15
138
DL3155M24HC11
139
DL3155M24HC11
UNIDAD 4
OPERACIONES CON LA PILA
140
DL3155M24HC11
CONTENIDO
4.1 INTRODUCCION
141
DL3155M24HC11
4.1 INTRODUCCION
Hasta este punto usted estará familiarizado, y en algunos casos dominará el manejo de
memoria, los mnemónicos y la operación de ciertas instrucciones del conjunto total de
instrucciones para el 68HC11. En esta unidad, presentaremos y discutiremos las dieciséis
instrucciones usadas para llevar a cabo operaciones con la pila del 68HC11. Conforme avance
en el estudio de esta unidad, encontrará relativamente fácil recordar la operación de las
instrucciones presentadas, por medio de sus mnemónicos. Este proceso de “memorización” de
operación de instrucciones (mediante sus mnemónicos) se hace fácil si se agrupan los
diferentes tipos de instrucciones para su estudio. Así, es claro que será más fácil recordar los
mnemónicos y operaciones de, por ejemplo, cuatro instrucciones relacionadas cercanamente
(con algo en común), que los de cuatro operaciones totalmente diversas.
En cuanto a las operaciones con la pila discutidas en esta unidad, aunque aprenderá un total de
dieciséis nuevas instrucciones, verá que las primeras ocho de estas caen en una de dos
categorías: ya sea guardar (push) un dato en; o tomar un dato de la pila. Las restantes ocho
instrucciones caen dentro de tres categorías: incrementar/decrementar (la pila),
cargar/almacenar (la pila), o transferir un registro a la pila (o de). Cumpliendo la tarea de
aprender a programar con las técnicas correctas, nos llevará a obtener mayor eficiencia en la
programación de microprocesadores.
142
DL3155M24HC11
H. Pila en cascada
143
DL3155M24HC11
La Instrucción PUSH.
La Figura 4-2 ilustra como la instrucción PUSH coloca datos en la pila. El número 0116 se halla
en el acumulador y deseamos almacenarlo temporalmente. Aunque podríamos almacenar el
número en memoria, esto requeriría una instrucción de 2 o 3 bytes. En lugar de ello, usamos la
instrucción PUSH para colocar ese número en la pila. Note que el número es colocado en la
posición tope de la pila como se ilustra en la Figura 4-2A. Dicho número permanece allí hasta
que lo recuperemos o encimemos otro byte en la pila.
La Figura 4-2B muestra que pasa sí, tiempo después, colocamos otro byte en la pila. Note que
el acumulador contiene ahora 0316. Si ejecutamos la instrucción PUSH, el contenido del
acumulador es encimado arriba de la pila. Para hacer espacio para este nuevo número, el
número original, 0116, es “empujado” hacia dentro de la pila.
Las Figuras 4-2C y 4-2D muestran dos números más siendo colocados en la pila en puntos
posteriores del programa. Note que los datos nuevos siempre son colocados en la cima de la
pila. Haciendo espacio para los nuevos datos, los datos anteriores se recorren hacia debajo de
la pila. Por esta razón, este arreglo es llamado pila descendente o pila en cascada. El nombre
de pila en cascada viene del flujo característico de los datos en la pila cada que un nuevo dato
es colocado en el tope.
144
DL3155M24HC11
La Instrucción PULL.
La Figura 4-3 ilustra como los datos son “jalados” (extraídos) de la pila. La Figura 4-3A muestra
como aparece la pila después de la última operación PUSH. Note que contiene cuatro bytes de
datos. El último byte introducido se halla en la cima de la pila.
La instrucción PULL recupera el byte que está en la cima de la pila. Cuando este byte es
removido de la pila, todos los otros bytes se mueven hacia arriba, llenando el hueco dejado por
este byte. La Figura 4-3B ilustra cómo 0F16 es extraído de la pila. Note que ahora 0716 se halla
en la cima de la pila.
Las Figuras 4-3C y 4-3D muestran cómo pueden ser extraídos los siguientes dos bytes de la
pila. En cada caso, los bytes restantes se mueven hacia arriba de la pila, llenando el registro
desocupado por el byte removido.
Si usted compara las Figuras 4-2 y 4-3, notará que los datos deben ser extraídos de la pila en el
orden inverso. Esto es, el último byte colocado en la pila es el primero que es extraído de la
pila. Otro nombre para este arreglo es Last in first out, último en entrar/ primero en salir (LIFO).
145
DL3155M24HC11
Pila en Memoria.
Aunque la pila en cascada es valiosa, tiene algunas limitaciones. Por un lado, el número de
registros es muy limitado, típicamente de ocho. Si se colocan más de ocho datos en la pila, los
datos “anteriores” son empujados al fondo y se pierden. También, la lectura de los datos de la
pila es destructiva. Cuando un byte es extraído de la pila, ya no existe en ésta. Esto es
fundamentalmente diferente de cuando se lee un byte de la memoria.
Por estas limitaciones la MPU 68HC11 no emplea la pila en cascada. En vez de ello, una
sección de la RAM puede ser destinada por el programador para actuar como pila.
Esto tiene algunas ventajas. Primero, la pila puede tener la longitud que el programador
requiera. Segundo, el programador puede definir más de una pila si lo desea. Tercero, él puede
direccionar los datos en la pila usando cualquiera de las instrucciones que direccionan
memoria.
Apuntador de Pila. Recuerde que la MPU 68HC11 tiene un registro de 16 bits llamado el
apuntador de pila. En una pila del tipo de memoria, el apuntador de pila define la localidad de
memoria que actúa como cima de la pila.
En la pila de memoria, los datos no pueden ser fácilmente transferidos de una localidad a la
siguiente. Por lo tanto, en vez de mover los datos arriba o abajo con relación a la pila, es mucho
más fácil mover la cima de la pila respecto a los datos.
Una vez hecho esto, la pila puede ser fijada por un programa. La cima de la pila se establece
cargando una dirección en el apuntador de pila. Por ejemplo, suponga que deseamos
establecer la dirección 01F916 como la cima de la pila. Podría usarse la siguiente instrucción:
LDS# 01F9
Esta carga la dirección 01F916 en el apuntador de pila y establece esta dirección como la cima
de la pila. Sin embargo, como verá, la cima de la pila se mueve cada vez que algún dato es
colocado – o extraído de – la pila.
146
DL3155M24HC11
Las Instrucciones PUSH . El 68HC11 tiene cuatro instrucciones PUSH: PSHA, PSHB,
PSHX Y PSHY. Estas instrucciones son usadas para cargar la pila desde cualquiera de los dos
acumuladores (A,B), o desde cualquiera de los dos registros índice (X,Y).
Junto con sus correspondientes cuatro instrucciones PULL,( discutidas en la siguiente sección),
estas ocho instrucciones PUSH/PULL proporcionan mucha flexibilidad en el uso de la pila del
68HC11.
La Figura 4-4 muestra el efecto de la instrucción PSHA. Antes que la instrucción sea ejecutada,
el apuntador de pila contiene la dirección 01F916 como resultado de una previa instrucción LDS.
El acumulador A contiene un byte de dato (AA16). Si ahora se ejecuta la instrucción PSHA, el
contenido del acumulador A es colocado en la localidad de memoria 01F916. Entonces, el
apuntador de pila es decrementado automáticamente a 01F816. Esto mueve automáticamente la
cima de la pila como se muestra.
A à Stk, SP = SP – 1
Para reforzar la idea, suponga que en un punto posterior del programa, la MPU ejecuta una
instrucción PSHB. Esto es ilustrado en la Figura 4-5. Antes de ejecutar PSHB, el acumulador B
147
DL3155M24HC11
contiene BB16 y el apuntador de pila aún apunta a 01F81 6. Cuando se ejecuta PSHB, el
contenido del acumulador B es colocado en la pila y el apuntador de pila es decrementado a
01F716.
Note que, (como con otras instrucciones del registro índice Y) el opcode hexadecimal para
PSHY es el mismo que para PSHX, pero es precedido por el byte de 18.
Las Instrucciones PULL. Los bytes de datos pueden ser removidos o “jalados” desde la
pila y colocados ya sea en el acumulador (A,B) o en el registro índice (X,Y). El 68HC11 tiene
cuatro instrucciones de extracción para realizar esas operaciones.
PULA permite a la MPU extraer datos de la pila y ponerlos en el acumulador A. PULB lleva a
cabo una operación similar excepto que el dato va al acumulador B. En cada caso, el dato es
tomado de la cima de la pila. Así, el dato disponible por la MPU es el último byte que fue
colocado en la pila.
Por ejemplo, la Figura 4-6A muestra la pila como fue dejada después de la última instrucción de
PUSH. La Figura 4-6B muestra que pasa si se ejecuta la instrucción PULA. Primero, el
apuntador de pila se incrementa automáticamente en uno a 01F816. Luego, el contenido de la
148
DL3155M24HC11
Para comprobar que tiene la idea, considere qué pasa si ahora se ejecuta la instrucción PULB.
La Figura 4-6C muestra que la pila es incrementada automáticamente a 01F916. El contenido de
esa localidad es entonces extraído al acumulador B. Esta operación se describe:
SP = SP + 1, B ß Stk
Usando la Pila. Como ya vimos, 8 de las 16 instrucciones básicas de la pila son para
colocar datos o para retirarlos de ella. Como se demuestra en algunos de los experimentos de
149
DL3155M24HC11
la Unidad 8, las instrucciones PUSH/PULL pueden usarse para guardar temporalmente los
contenidos de acumuladores o registros índice. Esto puede hacerse con operaciones que
destruyen los contenidos de esos registros.
MODOS DE DIRECIONAMIENTO
Los siguientes son unos ejemplos del uso de la pila. Primero considere un ejemplo trivial.
Usando solamente operaciones de pila, intercambie los contenidos de los acumuladores A y B.
Suponiendo que el apuntador de pila ya ha sido ajustado, el segmento de programa puede
verse como sigue:
PSHA
PSHB
PULA
PULB
Suponga que el acumulador A contiene inicialmente AA1 6 y que el acumulador B contiene BB16.
La primera instrucción coloca AA16 en la pila. Luego, BB16 es colocado en la pila. La tercera
instrucción extrae BB16 de la cima de la pila y la coloca en el acumulador A. Finalmente, la
última instrucción extrae AA16 de la pila y la coloca en el acumulador B. Como usted puede ver,
los contenidos de los dos acumuladores son intercambiados. La siguiente rutina logra la misma
tarea con una instrucción menos:
150
DL3155M24HC11
PSHA
TBA
PULB
Ahora veamos un ejemplo más complejo. Supongamos que se desean transferir 1610 bytes de
datos de un lugar en memoria a otro. Como se vio en la unidad anterior, este tipo de problema
es un buen candidato para indexar. Sin embargo, el indexado resulta problemático si las dos
listas se hallan sobre la localidad de memoria FF16. La razón de esto es que la compensación
de dirección (offset), sólo pueden manejar un máximo de FF16 localidades sobre la dirección
que se halle en el registro índice.
En este ejemplo, asuma que se desea mover los datos de las localidades de memoria 001016
hasta la 001F16, a las localidades 01F016 a la 01FF16. Aunque esto puede hacerse empleando
indexado directo, el programa se vuelve innecesariamente complicado. Se deben mantener dos
índices separados; uno para cargar los datos desde 001016 hasta 001F 16, y el otro para
almacenar los datos en 01F016 a la 01FF16. Una aproximación sencilla es usar el indexado para
una operación y la capacidad de la pila para la otra. Esto es, podríamos cargar datos de la lista
inferior usando indexado y almacenarlos en la lista superior empleando la capacidad de la pila.
Un programa que hace esto es el mostrado en la Figura 4-8. La primera instrucción carga el
apuntador de pila con la dirección 01FF16. Esta es la dirección de la última entrada, en la nueva
lista que se formará. Recuerde que la nueva lista se escribirá en las localidades 01F01 6 a la
01FF16. Una vez que la localidad 01FF16 es establecida como la cima de la pila, podemos
introducir datos en la nueva lista simplemente colocándolos en la pila. Puesto que el apuntador
de pila es decrementado con cada operación de apilado, debemos apilar la última entrada de la
lista en la cima de la pila.
Fig. 4-8 Mueva una lista de datos usando, operaciones de pila e indexados
151
DL3155M24HC11
La segunda instrucción carga el registro índice con la dirección de la última entrada de la lista
original. Esto es necesario por la razón escrita arriba.
Entonces, la instrucción PSHA coloca el contenido del acumulador A en la pila. Así, la última
entrada de la lista original es transferida a la localidad 01FF1 6. En el proceso, el apuntador de
pila es decrementado automáticamente a 01FE16.
Algunos usos adicionales de la pila serán revelados después. Sin embargo, aún si la pila no
hace más que lo anterior, con ello muestra las útiles capacidades que tiene. Pero como usted
verá, la MPU usa la pila de otras maneras, haciendo esta capacidad aún más importante.
152
DL3155M24HC11
UNIDAD 5
OPERACIONES DE ENTRADA Y SALIDA E
INTERRUPCIONES
153
DL3155M24HC11
CONTENIDO
154
DL3155M24HC11
En una breve historia de los microprocesadores, se han desarrollado dos distintos métodos
para el manejo de operaciones. En algunos microprocesadores, las operaciones I/O se
manejan por instrucciones I/O. Estos microprocesadores generalmente tienen una instrucción
de entrada y una instrucción de salida. Cuando la instrucción de entrada "input", se ejecuta, un
byte es transferido desde el dispositivo seleccionado I/O a un registro del MPU. El registro
involucrado es usualmente el acumulador, este método de operación I/O, se le conoce como
accumulator I/O. El dispositivo I/O selecciona y envía un byte de selección de dispositivo, sobre
el bus de direcciones. Para usar un byte de 8 bits en el dispositivo selector, el MPU puede
especificar 25610 diferentes dispositivos I/O. Claro esta que pocos sistemas
microprocesadores, usan muchos dispositivos por la compatibilidad que implicaría. La
instrucción para salida output, causa la transferencia de datos desde el acumulador hacia el
dispositivo I/O. Aunque este método para manejo de operaciones I/O, se usa con frecuencia en
muchos microprocesadores, el MPU 68HC11 usa una técnica diferente.
El otro método para manejo de operaciones I/O, involucra todas las transferencias de I/O como
transferencias de memoria. Este método, es llamado memory-maped I/O, es decir manejo de
memoria mapeada para I/O. Dicho método lo utiliza el MPU 68HC11 y muchos otros
microprocesadores. Debe notarse que el MPU puede ejecutar operaciones accumulator I/O, así
como operaciones memory-mapped I/O.
El MPU 68HC11 no tiene instrucciones I/O. A un dispositivo I/O se le asigna una dirección y es
tratado como una localidad de memoria. Por ejemplo, supónga que una entrada de teclado a
sido asignada a la dirección 800016. Podemos ingresar datos al acumulador A con el uso de la
instrucción:
LDAA 800016
Tocante a lo mismo, una salida a display puede estar asignada a la dirección 900016. En este
caso, podemos en este caso podemos llevarla al acumulador B con la instrucción:
STAB 900016
Como se aprecia, el dispositivo I/O es tratado como una localidad de memoria. El diagrama a
bloques del sistema, se muestra en la Fig. 5-1. Indica como un dispositivo I/O es conectado al
microcomputador. Note que ambos, tanto el bus de datos como el bus de direcciones, están
conectados la interfaz I/O. Una interfaz típica consiste de un addres decoder, (decodificador de
direcciones), una salida (output), una entrada (input latch) y buffers o drivers.
155
DL3155M24HC11
UNIDAD
MICROP.
(MPU)
BUS
DE BUS
DIRECCIONES DE
DATOS
SALIDAS
DISPOSITIVOS
La interfaz I/O, generalmente tendrá una salida latch si es que llega a ser usada por una
operación de salida. La razón para esto es que el dato desde el MPU aparecerá sobre la línea
de datos, por un instante muy corto (generalmente menor a un microsegundo). Por almacenar
los datos de salida en un latch, el dispositivo da un mayor periodo de tiempo, permitiendo así
revisar la respuesta de datos.
Los buffers o drivers se incluyen también en la interfaz I/O. Son frecuentemente necesarios
cuando circuitos generales y diferentes comparten el mismo bus. Los buffers proveen el
aislamiento entre el dispositivo I/O y el bus MPU.
156
DL3155M24HC11
OPERACIONES DE SALIDA.
La figura 5-2 muestra un circuito de salida simplificado. Aquí el dispositivo de salida es un grupo
de 8 diodos emisores de luz (LED’s). Cada detalle se muestra para ilustrar como una operación
de salida puede ser ejecutada. El address decoder monitorea el bus de direcciones buscando
la dirección 900016. También revisa alguna de las líneas de control que conecta al MPU: Una de
estas líneas se le llama read-write (R/ ) (pin). El pin R/ del MPU 68HC11 se va a un estado
bajo, cuando una operación de escritura(output), es iniciada por el MPU, (estado alto para
lectura).
Note que la salida de address decoder es usada para habilitar los datos de salida latch y los
drivers. Cuando estas han sido habilitadas, el byte sobre la línea de datos es almacenada en el
latch. Los bits de datos almacenados en el latch, provoca que los LED’s, correspondientes
enciendan. Por la salida y los patrones de bit apropiados, el MPU puede mostrar diferentes
números binarios.
Note que la address decoder (y por lo tanto el display) esta en la dirección 900016. Podemos
colocar el dato en el display en muy diferentes formas. Por ejemplo, podemos cargar un patrón
apropiado y desplegarlo en el acumulador A. Entonces por la ejecución de “almacena al
acumulador A”(store accumulator A), instrucción de direccionamiento extendido, puede
transferir el contenido del acumulador al display. La instrucción puede ser: STAA 900016. O
podemos enviar el dato al acumulador B usando la instrucción: STBA 900016.
En otro caso, la dirección 900016 sale sobre el bus de direcciones por un breve intervalo de
tiempo. El address decoder reconoce esta dirección, a la vez, las líneas de control(control
lines), indican que una operación de salida es llamada. En particular, las líneas de lectura-
157
DL3155M24HC11
escritura se van a un estado bajo. Esto provoca que el decodificador de direcciones habilite los
datos de salida latch. Simultáneamente, el byte, dato de 8 bits aparece sobre el bus de datos.
La salida latch almacena el dato en un byte. El dato aparece en la entrada del latch en menos
de un microsegundo (típicamente). Sin embargo, una vez que el dato es almacenado, este
aparece en la salida del latch hasta que un nuevo dato es escrito. Así la salida del dato será
desplegada hasta que el siguiente byte de dato es extraído por el MPU.
OPERACIONES DE ENTRADA.
La figura 5-3 muestra un circuito simple de entrada. Aquí el dispositivo de entrada es un grupo
de ocho interruptores. Cuando un interruptor es abierto, su respectiva línea de entrada al buffer
es substituido por resistencias de pull-up. Sin embargo cuando el interruptor se cierra, su
respectiva línea de entrada, es puesta a nivel bajo por el interruptor conectado a tierra.
En este circuito sencillo, no es requerido el latch entre los interruptores y el bus de datos. Sin
embargo, se usa un buffer, de modo que el grupo de interruptores pueda ser efectivamente
desconectado del bus de datos cuando los interruptores no estén siendo direccionados.
Con el circuito de salida, el address decoder busca las líneas de dirección y control. Note que
la dirección asignada es 800016. Para una entrada de dato desde el grupo de interruptores
hacia el acumulador A, usamos la instrucción: LDAA 800016 . O podemos ingresar el dato al
acumulador B por medio de la instrucción: LDAB 800016.
158
DL3155M24HC11
menor que un microsegundo), las líneas del bus de datos toman el mismo estado que las líneas
al lado derecho (input) del buffer. Si el interruptor no es activado, todas las líneas de datos
serán altas, es decir entregarán un "1" lógico (FF16) al cargarse en el acumulador. Sin embargo
si uno de los interruptores (S0 por ejemplo) es activado, la línea respectiva de datos (D0) será
baja. En este caso, el numero leído en el acumulador será FE 16. Examinando el byte que es
leído, el MPU puede determinar que interruptor es activado.
PROGRAMANDO ENTRADA-SALIDA.
Usted, ahora conoce lo necesario acerca de los circuito de entrada-salida para ejecutar
operaciones I/O. Refiriéndonos a la figura 5-2 y 5-3. Para el primer ejemplo supongamos que
usted quiere que un LED encienda cuando el correspondiente interruptor sea presionado. Esto
es, el LED0 encenderá cuando cuándo S0 se active; así mismo el LED1 deberá encender
cuando S1 sea presionado, etc.
Si se refiere a la figura 5-2, observara que un LED puede encender al colocar a "0", el bit
apropiado en el latch. Por ejemplo, un 0 en bit 0 provocara que el LED0 se polarice
directamente. Así, el diodo conducirá y emitirá luz. Note que un "1" en el bit 0 no permitirá que
el diodo conduzca y por tanto no emitirá luz. Consecuentemente, un "0" activa el LED y un "1"
lo apagará.
Refiriéndonos a la figura 5-3, encontrará que, cuando uno de los interruptores es cerrado, su
correspondiente línea irá a 0. Si los interruptores no son cerrados su correspondiente línea será
"1".
LDAA
80
00
STAA
90
00
BRA
F8
Si S0 y solo S0, es cerrado cuando la instrucción LDAA 8000 es ejecutada, 1111 11102 será
cargado en el acumulador A. La siguiente instrucción almacenará este byte de dato en la salida
latch. Esto provocara que el LED0, y sólo él. La instrucción BRA mantiene a la MPU en un ciclo
continuo. Tratemos algunos ejemplos y verifiquemos cada vez que cada tiempo, un interruptor
sea cerrado, el correspondiente LED encenderá. Si los interruptores son establecidos a cierto
número binario de 8 bits, los LED’s desplegaran ese número de 8 bits.
Ahora, supóngase que cambiamos nuestro deseo y decidimos que los LED’s deberán
encenderse en caso de complemento a uno del número binario puesto en los interruptores. No
159
DL3155M24HC11
LDAA
80
00
COMA
STAA
90
00
BRA
F7
Note que simplemente tenemos que insertar la instrucción complemento a unos entre las
operaciones de entrada y salida.
Como otro ejemplo, suponga que deseamos desplegar un número que es cuatro veces mayor,
que el número colocado en los interruptores. Nuestro programa puede cambiar así:
LDAA
80
00
ASLA
ASLA
STAA
90
00
BRA
F6
Es muy útil por el hecho que no se necesita cambiar el hardware, solo se agregan las
instrucciones ASLA entre la operación de entrada y salida.
Aunque estos ejemplos son muy simples, ilustran la flexibilidad de los arreglos I/O. El dato es
dado desde un dispositivo de entrada como si fuera dado por la memoria. Una vez en el MPU,
el byte de dato puede ser modificado en la forma que queramos. El dato puede ser transferido a
un dispositivo de salida como si fuera a ser almacenado en memoria. Mientras el dato esta en
la MPU, puede ser modificado de diferentes formas. El byte de entrada puede ser recorrido a la
izquierda o la derecha. Puede sumarse – o restarse – a otro número. Puede efectuarse la
operación OR o AND con otro byte. Las posibilidades son interminables y casi no involucran el
cambio al hardware. Todos los datos manipulados pueden ser procesados por el programa.
En los ejemplos precedentes, todas las transferencias de I/O eran controladas por el programa
y solo por él. El programa esta en un ciclo continuo que ingresa datos desde los interruptores,
modifica los datos (si es requerido) y entrega los datos a los displays.
160
DL3155M24HC11
Cuando este arreglo es usado, el MPU nunca sabe si el dato de esa entrada tiene cambio.
Simplemente lee en el dato un número veces de cada segundo. De igual forma, el MPU saca el
dato una y otra vez. Este programa trabaja bien por operaciones simples I/O. Sin embargo
como la I/O requiere cambiar más sofisticadamente, esta técnica es molesta.
161
DL3155M24HC11
Una forma más efectiva de manejar operaciones I/O involucra el concepto llamado
interrupciones. Las interrupciones son el medio por el cual un dispositivo I/O puede notificar a el
MPU que esta listo para enviar el dato de entrada o aceptar el dato de salida. Generalmente
cuando ocurre una interrupción, el MPU suspende su operación actual y mantiene la
interrupción. Esto es, puede leer internamente o escribir fuera un byte de dato. Después de
mantener la interrupción, la MPU regresa a su tarea original y continua desde donde se quedo.
Una analogía puede ayudarle para visualizar una operación de interrupción. Compare el MPU
con el presidente de una corporación, quien esta escribiendo un reporte. La interrupción puede
ser comparada con una llamada telefónica. La principal tarea del presidente es el reporte, sin
embargo si el teléfono suena (una interrupción), él terminara de escribir la palabra o enunciado
y responderá a la llamada telefónica. Después de haber atendido la llamada telefónica,
regresará al reporte y continuara en el punto donde se quedo. En esta analogía el timbre del
teléfono notifica al presidente, la interrupción requerida.
Esta analogía muestra la dificultad del programa controlado con la técnica discutida
anteriormente. Si quitamos la interrupción requerida ( el timbre del teléfono), nos encontraremos
ante una situación algo cómica. El presidente escribe unas cuantas palabras del reporte.
Después levanta la bocina del teléfono para ver sí alguien esta en el otro extremo. Si el no
acierta al levantar la bocina, escribe otras palabras, y revisa el teléfono de nuevo. Claro esta
que la técnica requiere importantes recursos, como el "tiempo" del presidente. Esta simple
analogía muestra la importancia de la capacidad de una interrupción. Sin ella se perdería una
gran cantidad de tiempo del MPU, y pudiera afectar las rutinas de operación.
Una característica de extensión del 68HC11 son las características de hardware on-chip I/O
(e.g. temporizador(timer), comunicación serial,, e interfaces periféricas, etc.), un total de
veintidós posibles interrupciones, distintas son posibles. Esto incluye diecisiete de hardware,
una de software, y cuatro interrupciones de reset. Más de estas (15) son asociados con la
interfaz interna de dicho hardware. Esto es, cuando una operación de I/O ocurre esta es
generalmente acompañada con su propia interrupción especial de hardware. Estas
interrupciones trabajan, como describimos anteriormente, alertan al microprocesador de otra
actividad, normalmente I/O.
En la siguiente sección examinaremos cinco diferentes tipos de interrupciones del 68HC11 con
un propósito especial.
162
DL3155M24HC11
RESET
Interrupción Pseudo Non-Maskable XIRQ
Petición de interupción(Interrupt Request) IRQ
Interrupción de software (SWI)
IIlegal Opcode Trap
REINICIALIZAR
Note que el control o programa monitor es colocado en la ROM en el tope de memoria. En este
ejemplo, se usa un byte de 16K de ROM. La dirección de la ROM esta desde C00016.hasta
FFFF16. La RAM es colocada en la parte baja, fin de memoria. Las direcciones que son usadas
van desde 0000 16 hasta 6FFF16. . Respecto a la RAM y a la ROM note que las localidades
163
DL3155M24HC11
700016 hasta AFFF16, pueden ser usadas como direcciones en un programa encapsulado
(program cartridge). Dicho programa encapsulado, puede contener un programa almacenados
y generado en una EEPROM (Electrictrically Erasable Programable, Read-Only-Memory,
también llamada "E" cuadrada PROM). Además de esto, como una alternativa, estas
localidades de memoria pueden ser usadas como direcciones en EPROM, la ROM contiene un
sistema firmware(tratamiento de microprogramación cableada). En ambos casos los
dispositivos ocupando estas localidades de memoria serán direccionadas hasta interfaces de
I/O que contienen latches, decoder-drivers, etc. como se menciono anteriormente.
El programa monitor almacena en la ROM, todos los controles de la actividad del MPU. En todo
momento, el sistema entero esta corriendo por este programa. En este ejemplo, cuando el
microprocesador es encendido deberá iniciar la ejecución de instrucciones en la dirección
C00016. También, debemos ser capaces de reinicializar el programa en esta dirección en
cualquier momento. De acuerdo a esto, el MPU 68HC11 tiene internamente, la capacidad de
reiniciar(reset).
La MPU 68HC11 tiene una línea de señal o pin de control que es llamado 2%S%T. Este pín o
línea es conectado a un interruptor reset de alguna clase. Si esta línea baja por un corto
periodo de tiempo(explicado más tarde) y entonces cambia a alto, el MPU puede iniciar una
secuencia de interrupciones reset (también llamada servicio de rutinas de interrupción). El
propósito principal de una secuencia de interrupciones es cargar la dirección de la primera
instrucción a ser ejecutada en el contador del programa. Esto se lograra fácilmente si, en
cualquier aplicación, el arranque de direcciones sea el mismo. Sin embargo, el arranque de
direcciones podrá hacerse de diferentes maneras. Por lo tanto, significa una conveniencia que
la dirección especificada provenga del direcciones iniciales, para cualquier arranque de
direcciones.
El MPU 68HC11 fue diseñado con un tope de 64 direcciones ROM reservadas específicamente
para vectores de interrupción. Para nuestro propósito nos concentraremos principalmente en el
contenido de los vectores de interrupción sobre los 16 bytes de ROM. Por cada dirección de
vector se requieren dos bytes (alto y bajo) para especificar todas las posibles localidades de
memoria, estos 16 bytes contienen la dirección en 16 bit´s de 8 vectores de interrupción, como
se muestra en la figura 5-5.
Note que la dirección FFFE16 y FFFF16 contienen el vector 2%S%T. Esto es, esas dos
localidades de memoria contienen la dirección de la primera instrucción a ser ejecutada cuando
el computador es inicializado o reinicializado. En el ejemplo previo de asignación de memoria
(figura 5-4) la primera instrucción en el programa monitor esta localizado en la dirección C00016.
Consecuentemente, este es nuestro vector de reinicialización (dirección). La localidad FFFE16
contiene el byte alto de la dirección (C016), y FFFF16 contiene el byte bajo de dirección (0016).
Recuerde que las localidades FFFE16 y FFFF16 están en la memoria de solo lectura. Por lo
tanto, el diseñador debe prever el vector reset conveniente en el tiempo que él esta escribiendo
el programa monitor.
DIRECCION VECTOR DE INTERRUPCION CODIGO DE
CONDICION
164
DL3155M24HC11
Registro
Mascara
La figura 5-6 muestra la secuencia de eventos que ocurren cuando el MPU es reinicializado.
Primero, la mascara de interrupción (I) es activada. Recordará que la bandera "I" corresponde a
uno de los registros código de condición. Como vera más tarde, si esta bandera es activada,
avisara si otra de las interrupciones esta ocurriendo. Así, la MPU activa el bit mascara de
interrupción, de tal modo que la secuencia de reset no sea interrumpida por la petición de uno
de los dispositivo de I/O.
165
DL3155M24HC11
RESET
Bit de interrupción
activada (I)
Ciclo
Inicio normal, ciclo de MPU Normal
búsqueda/ejecución
Segundo, los contenidos de la localidad FFFE16 son cargados en el lugar del byte alto del
contador del programa (PC). Este es enviado a la dirección FFFE16 sobre el bus de direcciones.
La localidad de memoria es leída desde afuera y su contenido es colocado sobre el bus de
datos. El MPU selecciona este byte y lo coloca sobre los ocho bits del contador de programa.
En nuestro ejemplo, el byte en la localidad FFFE16 es C016.
Después, el contenido de la localidad FFFF16 es cargado en los ocho bits bajos del contador de
programa. Termina ajustando el bus de direcciones a FFFF16. Así, el contenido de las
localidades mas altas de memoria son colocados en el bus de datos. En nuestro ejemplo, este
byte esta en 00 16. En este punto, el contador de programa contiene la dirección de la primera
instrucción la cual es C00016.
Un interruptor reset, conectado al pin externo 2%S%T del MPU, generalmente estará incluido en
algún lugar del sistema microcomputador. Esto permitirá al operador restablecer el sistema si
se bloquea o deja de correr por alguna razón. Incluyendo este tipo de reset, el MPU 68HC11
tiene un total de cuatro diferentes tipos de reset:
El reset de encendido (power-on reset), ocurre cuando una transición positiva es detectada en
el pín de alimentación del MPU, VDD . Esta reset es usado cuando se activa la señal energía
166
DL3155M24HC11
Donde : fXTAL es la frecuencia del oscilador de cristal ( alimentado por los pines 7 y 8
del MPU 68HC11) en MHz.
Por ejemplo, para calcular el reset delay para el MPU 68HC11 con un f XTAL de 4 MHz.
Está ecuación es usada para calcular el reset delay time (tiempo reset de retardo) para un
68HC11 basado en el sistema dado por la frecuencia f XTAL o fECK en MHz.
El reset COP o Computer Operating Properly, protege al programa o para casos de fallas de
software. Al usar un temporizador(timer) interno especial llamado watchdog timer, el sistema
reset COP, monitorea la operación adecuada del MPU e inicia una secuencia reset vectorizada,
cuando una falla de programa se ha encontrado. Este reset puede ser deshabilitado
completamente usando la función COP, control de bits.
El cuarto tipo de reset, disponibles en el 68HC11, se llama Clock Monitor Reset o CMR, reset
por reloj monitor. Como su nombre lo implica, un CMR ocurre si el sistema reloj falla en la
operación. La función CMR es habilitada por un bit de control en el registro OPTION. Cuando
este bit es borrado, la función CMR es desactivada. Cuando el bit se activa la función monitor
de reloj iniciara un reset de sistema vectorizado si la frecuancia de E-clock (mencionada) falla
bajo un mínimo rango(cerca de 10 KHz). Esta señal de reset es también presentada en el pin
de la MPU RESET, disponible externamente.
Estos cuatro reset´s pueden considerase interrupciones. Esto es porque, cuando un reset
ocurre, el MPU deja cualquier actividad y salta a la localidad vectorizada comenzando su
ejecucíón. En muchos casos el programa monitor podrá iniciar con una subrutina corta para
activar el sistema. Dicha subrutina sirve para inicial el stack pointer, los displays, etc. El
68HC11 tiene otros tipos importantes de interrupciones. Serán discutidas en la siguiente
sección.
167
DL3155M24HC11
Interrupciones No-mascarables.
En este punto se hará una discusión entre la interrupción mascarable y la no-mascarable. Una
mascarable es una que el MPU puede ignorar bajo ciertas condiciones. Pero una no-
mascarable no puede ser ignorada. Para ilustrar la diferencia recordaremos la analogía del
presidente de la corporación.
Cuando del presidente esta escribiendo su reporte, puede ser interrumpido por el teléfono. Sin
embargo, puede llamar a la secretaria para que conteste, el presidente ha enmascarado una
fuente de interrupción. Esta analogía no es practica para todas las interrupciones. Por ejemplo
puede resultar in-práctico el enmascarar una alarma contra incendio.
La línea de entrada 8)21 es sensible a los cambios de nivel, de corriente y/o voltaje. Por ello
requiere de un resistor externo de pull-up hacia VDD . Después, de habilitar una transición de alto
a bajo sobre esta línea de forza el MPU a iniciar una secuencia de interrupciones no
mascarable. El propósito de la secuencia es proporcionar un medio ordenado por el cual el
MPU pueda saltar a una subrutina de servicio que tome interés de la interrupción.
Esto llega a ser un poco comprometido porque el MPU debe estar disponible para regresar al
menú principal, después la rutina de servicio de interrupción es finalizada. Debe estar
disponible para picos exactamente donde sea necesario. Además todos los registro retienen
exactamente el mismo dato y direccióm que ellos tienen cuando ocurre una interupción. En
otras palabras , cuando ocurre una interrupción, el contador de programa (PC) es salvado para
que el MPU pueda regresar después a este punto del programa. También los contenidos de los
acumuladores, el registro índice y el registro código de condición pueden salvarse para que el
MPU puede ser restaurado a una condición exacta que existe en el instante que ocurre la
interrupción.
168
DL3155M24HC11
El MPU 68HC11 termina al introducir todos los datos pendientes dentro de la pila. Entonces
después, la interrupción ha sido servida, el MPU regresa al estado previo, extrayendo los datos
de la pila.
no La actual
instrucción
finalizo?
si
Activa el bit,
mascara de
interrupción (I)
Ciclo
Inicio normal, ciclo de
búsqueda/ejecución MPU Normal
8 )21 )
Fig. 5-7. Secuencia de Interrupción no-mascarable (8
El MPU coloca los 8-bit bajos del contador de programa PC, en la localidad de memoria 006A1 6.
Entonces este decrementa al stack pointer para que los 8-bits de la parte alta del PC, se
coloquen en la localidad 00691 6. También, los contenidos del registro índice X son ubicados en
las direcciones 006616 y en 006516. El contenido de los acumuladores A, B y los códigos de
condición, en 00641 6 y 006316, como se muestra. Cuando todo fue realizado, el stack pointer
será decrementado 9 veces a 006016. Regresando al diagrama de flujo, note que el siguiente
paso es activar el bit de la mascara de interrupción. Esto permite que el MPU ignore peticiones
que ocurran mientras la interrupción no-mascarable esta siendo atendida.
En este punto, el MPU esta listo para el salto a la rutina servicio de interrupción. Pero, ¿cual es
la dirección de esta subrutina?. Recuerde, é carácter vector de interrupción que fue mostrado
en la figura 5-5. EL vector de interrupción no-mascarable (8)21), esta en las direcciones
169
DL3155M24HC11
FFF416 y FFF516. Entonces el byte superior del PC es cargado desde FFF416, mientras el byte
bajo es cargado desde FFF516. Éste, dirige el MPU a la primera instrucción en la rutina de
servicio 8)21. Desde este punto, el MPU regresa al ciclo normal busqueda-ejecución (fetch-
execute), hasta que la rutina de servicio ejecución finalice.
170
DL3155M24HC11
La interrupción no mascarable se usa en caso de que alguna situación no pueda ser ignorada.
Usted probablemente puede visualizar aplicaciones donde cada una requiera cierta capacidad.
Por ejemplo, asuma que el microprocesador esta siendo usado por un taladro numéricamente
controlado. La interrupción no-mascarable puede usarse en conjunción con algunos
interruptores, para prevenir perforaciones sobre la superficie de trabajo, ó para apagar la
máquina en caso de que alguna persona por error meta su mano.
INTERRUPCION NO-
MASCARABLE
(8)21)
171
DL3155M24HC11
El MPU 68HC11 tiene una línea de control )21, de tal modo que cuando esta línea se
encuentra en estado bajo, se solicita una secuencia de interrupciones. Sin embargo el MPU,
puede o no, iniciar la secuencia dependiendo del estado del bit mascara de interrupción "I". Si
el bit esta activado el MPU inicia la secuencia. Este procedimiento es muy similar al de 8)21
discutido anteriormente. La figura 5-9 muestra la secuencia )21.
IRQ
La
NO
instrucción
actual
finalizo?
SI
Bit mascara de NO
interrupción
activado?
SI
Coloca los registros
dentro de la
Pila.
Activa el bit,
mascara de
interrupción (I)
Ciclo MPU
Inicio normal, ciclo de Normal
búsqueda/ejecución
Cuando la línea )21 esta baja, el MPU finaliza la instrucción actual. Revisa la condición del bit
"I", si esta activado a "1", ignora la petición de la interrupción y ejecuta la siguiente instrucción
en secuencia. Sin embargo, si I = 0, el MPU coloca el contenido en los diferentes registros, en
la pila según el orden mostrado.
El que el bit "I", este activado, previene que el MPU, este aceptando otra instrucción hasta que
la presente interrupción sea atendida.
172
DL3155M24HC11
Una vez en las rutinas de servicio, el MPU va dentro del ciclo de búsqueda-ejecución. Cuando
la interrupción ha sido atendida, el control regresa al programa principal por medio de la
instrucción RTI.
El MPU tiene dos instrucciones que permiten el control de software del bit mascara de
interrupciones. Usted verá que si el bit "I", en el CCR, es activado algún tiempo, entonces inicia
una secuencia de interrupción. Esto impide que se acepte una )21 mientras )21 o 8)21 están
siendo atendidas. Es un ejemplo de cómo establecer las banderas de interrupción con
hardware.
En muchos casos esto es necesario para activar la bandera de interrupción con software. De
modo que el MPU 68HC11 cuenta con la instrucción "Set Interrupt-Mask" (SEI), activa mascara
de interrupción. La bandera puede activada para prevenir una interrupción sobre una parte del
programa que no se desee interrumpir. Esta tiene el efecto de deshabilitar la petición de
interrupción.
173
DL3155M24HC11
La MPU 68HC11 tiene un programa equivalente a una interrupción. Esta es una instrucción
llamada “Software interrupt” (SWI. Interrupción de Software). Esta instrucción al ser ejecutada
ocasiona la ejecución de una secuencia de interrupciones que es muy similar a la secuencia de
interrupción por hardware discutida anteriormente. Esta es una instrucción de un byte y su
opcode es 3F16.
La figura 5-10 muestra la secuencia de eventos que ocurren cuando esta instrucción es
ejecutada. Primero el contenido de todos los registros pertinentes son colocados en la pila
indicado. A continuación, se activa la mascara de interrupción, pero esa petición de interrupción
no puede interferir. Finalmente, el software vector de interrupción se obtiene desde la dirección
FFFA16 y FFFB16. Este vector es cargado en el contador de programa así que la siguiente
instrucción será buscada desde esta dirección. Como con la otra interrupción, el MPU regresara
al programa original cuando se encuentra la instrucción return-from-interrupt RTI,.
SWI
Activa el bit,
mascara de
interrupción (I)
Secuencia
Carga el byte bajo de Interrupción
del PC con el por Software
contenido de
FFFB16
174
DL3155M24HC11
En caso de ejecutar un opcode indefinido o ilegal, puede ocasionar diversos problemas como el
que un sistema quede bloqueado. A pesar de que nosotros originamos estos efectos, no
esperamos que el MPU procure la ejecución de ellos.
Además de las interrupciones de hardware y software antes discutidas, el MPU tiene una
instrucción especial para detectar y vigilar el uso de códigos u operaciones ilegales. Esta
interrupción se le llama illegal opcode trap, o trampa de opcode´s ilegales. La necesidad de
utilizar este tipo de interrupciones es que no todas las posibles combinaciones numéricas están
definidas por el conjunto de instrucciones del 68HC11. A continuación se dará una breve
descripción de cómo trabaja ilegal opcodes trap.
Durante la ejecución de un programa , las instrucciones son ejecutadas en forma secuencial y
predecible. Asumimos entonces que todas las instrucciones en el programa son validas para el
conjunto de instrucciones ya establecidas. Si un opcode ilegal es detectado, se genera una
interrupción, ésta es dirigida a una localidad en memoria o vector de opcode ilegal la cual es
previamente iniciada. Desde este punto, la interrupción se maneja como una interrupción
ordinaria, es decir, como un salto en programa en secuencia de servicio de interrupciones
predefinidas.
Después de una interrupción por opcode ilegal, el stack pointer debe ser reinicializado. Esto es
con el fin de evitar que la pila se exceda, por la constante ejecución de opcodes ilegales.
El MPU puede forzarse hacia atrás dentro de una acción, utilizando petición de interrupciones,
o interrupción no mascarable. La secuencia 8)21 es igual a la descrita anteriormente, salvo por
un pequeña diferencia; recuerda que el contenido de los registros están colocados en la pila,
esto permite que la secuencia 8)21, sea omitida, permitiendo así al MPU responder
rápidamente a la interrupción.
La secuencia )21, es similar, excepto que los registros no son colocados en la pila
nuevamente. Como siempre la señal )21, es ignorada si el bit mascara de interupción, esta
activado.
Seguramente, la señal reset puede sobrepasar el estado de espera. De tal modo que ahora hay
tres formas de salir del estado de espera.
175
DL3155M24HC11
Los programas escritos para el MC68HC11 en su mayoría terminan con la instrucción STOP,
marcando el fin de la ejecución. En este sentido la instrucción STOP es sencilla de entender.
Sin embargo, hay otros aspectos de la instrucción STOP que nos son tan aparentes de primera
instancia.
Desde que la primer computadora electrónica (ENIAC), llego a ser funcional alrededor de 1950,
la tendencia a sido elaborar sistemas de computo, después pequeños microprocesadores que
usen menos potencia eléctrica, pero mas potencia computacional.
La instrucción STOP, coloca el MPU en modo consumo de baja potencia. En el modo STOP,
todos los relojes, incluyendo el oscilador interno, son detenidos. Esto causa que todo el
procesamiento interno de datos sea detenido. Los microprocesadores literalmente es instruido
para detenerse y esperar sin carga, una instrucción que inicie la secuencia nuevamente. La
ejecución de la instrucción STOP no cambia los registros internos del MPU ni afecta los pines
de salida o entrada.
Para usar la instrucción STOP (opcode CF), el bit "S" o "Stop disable" (paro deshabilitado),
puede borrarse a través de el registro código de condición CCR. Así como cualquier bit del
registro código de condición, el bit "S", puede ser activado o borrado usando software (TAP 06),
Si el bit CCR no es borrado (activado), la instrucción STOP es tratada igual a una no-operación
o NOP del MPU.
Una vez ejecutada la instrucción STOP, hay varias formas de restablecer el MPU, entre ellas
esta el 2%S%T, 8)21 o la no mascarable )21. Los métodos de 2%S%T y )21,.son formas de
recobrar de un STOP con 8)21, el cual se determina por el estado del bit mascara de
interrupción "X". Si se encuentra borrado, la ejecución del programa se reduce a una operación
de interrupción 8)21, como se ilustró en la fig. 5-7. Sin embargo si el bit esta activado, la
interrupción puede ser mascarada y la ejecución del programa puede resumirse a un opcode de
búsqueda para la siguiente instrucción seguida a la instrucción STOP. En esta opción el MPU
puede detenerse, esperar el modo de baja potencia y continuar un tiempo después con la
instrucción siguiente programada, después de STOP.
176
DL3155M24HC11
Hasta ahora, nos hemos concentrado en detalles de cómo especificar las interrupciones y
reset´s. Pero, ¿que sucede si se requieren dos o mas interrupciones diferentes en forma
simultanea?. Obviamente sin algún recurso para manejarse, podría causarse confusión.
Cada interrupción tiene una entrada al IRPC. En el caso en que ocurren dos o más
interrupciones al mismo tiempo, el IRPC trabaja para asegurarse que la interrupción de alta
prioridad (relativa al resto), sea atendida primeramente. Por ejemplo si surge una falla en el
monitor de reloj COP y simultáneamente surge una interrupción por opcode ilegal, se le da más
atención a la falla del COP como de mayor prioridad.Note que el orden de prioridad mostrado
en la fig 5-11 es similar al orden del vector de interrupción mostrado previamente en la figura 5-
5. Como es el caso de la más alta prioridad asignada a RESET, como lo es también el vector
superior de dirección mostrado en la figura 5-5. El COP monitor de reloj, es la siguiente
interrupción de mayor prioridad (hardware), al igual que en el vector de dirección ne la fig. 5-5.
El proceso IRPC es interrupción solo de hardware, la interrupción SWI o de software muestra
no esta incluida en la figura 5-11. Debe notarse sin embargo que SWI actualmente es de alta
prioridad, más que otra interrupción, excepto el RESET. Esto es cierto en el sentido que uno de
los opcodes SWI, es buscado, otra interrupción no puede ser atendida (solo RESET), hasta que
el vector SWI, sea traído.
Las interrupciones 8)21 y )21, respectivamente se muestran como dos entradas de baja
prioridad para el IRPC. Note que estas son también interrupciones que están usando el bit
mascarable del CCR. (figura 5-5). Semejante a las cuatro interrupciones de arriba, XIRQ es una
entrada fija a la IRPC. Estas cinco entradas de interrupciones a IRPC son fijas y no pueden ser
cambiadas. Sin embargo la ultima entrad, mostrada en la fig 5-11 como IRQ se selecciona por
software y puede ser cambiada, es la interrupción de baja prioridad al IRC y puede ser
cambiado por software, esto indica que otras interrupciones, por ejemplo la interrupción en
Tiempo real (Real Time Interrupt, RTI) o otros, puede ser elevado en prioridad sobre SWI al
asignarle la ultima posición en IRPC.
Debido a que las interrupciones asignadas a la posición IRPC están todas en el registro código
de condición, bit "I" mascarable, una interrupción asignada a esta ultima posición puede tener
una prioridad superior a otra interrupción mascarable del bit "I". La interrupción IRQ es
automáticamente seleccionada (por omisión) sobre reset. Otras se pueden seleccionar
cargando el código apropiado dentro de un registro especial en el 68HC11 llamado Highest
Priority Interrupt (HPRIO, interrupción de alta prioridad). Este registro localizado en la dirección
103C 16, es parte de un bloque de registro especial de control de 64 byte contenidos en la
177
DL3155M24HC11
memoria del 68HC11. Estos 64 registros internos son usados para varios controles por hardware y
características de interfaz en el 68HC11, que son detalles fuera del alcance de este curso. El cual
puede ser activado para reasignar otras interrupciones mascarables bit "I", a la ultima posición en el
IRPC. La fig. 5-12 muestra en síntesis, el diagrama de flujo de los procesos interupciones/reset según su
prioridad. Parte del este diagrama muestra la información presentada en esta unidad. Además se
muestran los tópicos asociados al reset y el procesamiento de interrupciones. Puede dar atención
particular a las condiciones de salto para los casos de interrupciones. A lo largo de este capitulo se
explico la utilidad de las interrupciones y los reset´s, como juegan un papel importante tanto en las
instrucciones como en la ejecución de programas en software.
2.
ALTA
Power-on reset
(POR) PRIORIDAD
R e s e t externo
Diagrama de flujo.
SI Bit X,
activado?
procesamiento por prioridad de
Interrupciones /reset
NO
Pin XIRQ, SI
edo. bajo?
NO
Interrupción SI
pendiente?
NO
Busqueda de Opcode
SI
WA 1? Registros CPU Stack
NO
Registros CPU Stack
SI NO Interrupción
Activa el bit “I” SW 1?
Todavía
Vector busqueda ?
$FFF6, FFF7
SI
RT 1? Activa el bit “I”
Realmacena NO
los registros Resuelve lnterrupción
CPU desde el Ejecuta esta de proridad y el vector
Stack instrucción busqueda para pendientes
178
DL3155M24HC11
179
DL3155M24HC11
UNIDAD 6
Programación de la tarjeta
DL3155M24HC11
180
DL3155M24HC11
CONTENIDO
DESCRIPCION DE TARJETA
PROGRAMACION DE TARJETA
PROGRAMA DE PRUEBA
181
DL3155M24HC11
A continuacion sé hara mension de todos los elementos con que cuenta la tarjeta:
CARACTERISTICAS
1 MICROCONTROLADOR MC68HC11
MODULO: DE MEMORIA: RAM, EEPROM
MODULO DE COMUNICACIÓN SERIE
MODULO DE TEMPORIZACION Y CONTEO
MODULO DE CONVERSION A/D
MODULO DE INTERRUPCIONES
2 TARJETA ENTRENADORA:
ETAPA PARA MODOS DE TRABAJO SIMPLE Y EXPANDIDO
ETAPA DE RESET PARA MICROCONTROLADOR
ETAPA DE EXPANSION DE MEMORIA (RAM)
TECLADO DE 4X4
DISPLAY LCD DE 16X2
DISPLAY DE 7 SEGMENTOS
BUZZER
ETAPA DE COMUNICACIÓN SERIE A COMPUTADORA CON MAX 232
ETAPA DE VIZUALIZACION POR MEDIO DE LED'S (6 LED'S)
ENTRADA DE DATO POR MEDIO DE BOTONES
CIRCUITO VARIADOR DE VOLTAJE PARA PUERTO A/D
182
DL3155M24HC11
ASM [Direccion]Enssamblador/Desensamblador
BF <Direccion inicial><Direccion final><Dato>Llenar un bloque de memoria con el da
datoproporcionado
BR [-][Direccion] Colocar puntos de ruptura en un programa
BREAK Realizar la misma funcion de BR
BULK Este comando permite borrar toda la EEPROM ($B600-$B7FF)
BULKA Realizar la misma funcion que BULK
BULKALL Este comando permite borrar EEPROM+el registro CONFIG.
CALL [Direccion]Ejecucion de subrutina
COPY Realiza la misma funcion que MOVE
DUMP Realiza la misma funcion que MD
ERASE Realiza la misma funcion que BULK
FILL Realiza la misma funcion BF
G [Direccion]Este comando nos permite ejecutar un programa
GO Realiza la misma funcion de G.
HELP Muestra en pantalla los comandos de BUFFALO
HOST Realiza la misma funcion que TM
LOAD T Este comando permite la sincronizacion del sistema de desarrollo con la PC
MEMORY Realiza la misma funcion que MM
MD [Direccion inicial] [Direccion final] Muestra en pantalla el contenido del bloque de
memoria
MM [Direccion] Modifica contenido de memoria
MOVE <Direccion inicial> <Direccion final> <Direccion destino> Mueve bloque de memoria
a otro
P Continuacion de punto de ruptura
PROCEED Realiza la misma funcion que RM
RD Realiza la misma funcion que RM
READ Realiza la misma funcion que MOVE
REGISTERRealiza la misma funcion que RM
RM [p,x,y,a,b,c,s]Modifica registros/muestra en pantalla registros internos del
microcontrolador
STOPAT <Direccion>Paro en la direccion
T[n] Ejecutar un programa paso a paso
VERF <T> Comparar memoria con el dato bajado via el puerto de comunicación serie
XBOOT [Direccion inicial][Direccion final] Enviar programa otro 68hc11
? Realiza la misma funcion que HELP
183
DL3155M24HC11
A) Crear una carpeta llamada DL_HC11 en el directorio raiz, y cargar el archivo iasm11.exe
en el con su help correspondiente.
B) En el programa IASM11.EXE, abrir un programa con extension ASM
(NOMBRE_ARCH.ASM).
C) Con tecla de funcion F10, ir al submenu ASSEMBLE donde apareceran los archivos que
se crearan (los de extension s19 son los que nos interesan), abajo apareceran más
opciones, como el progama lst, map, etc., el alumno o profesor indicaran que opciones
habilitaran, en este momento la opcion que tiene la extension s19 es la que nos importa.
Teclear ESC hasta que aparezca el menu principal.
D) Con la tecla de funcion F4, daremos la ejecucion de ensamblado del programa con
extension ASM, en el momento de ensamblado el progama detectara errores de sintaxis
los cuales debera corregir de lo contrario el sistema no podra crear el programa con
extension s19. Los errores quedaran resaltados por programa, para que el usuario pueda
verlos y corregirlos. Si no hay ningun error pasaremos al siguiente punto
E) Con la tecla de funcion F10, ir al submenu COMMUNICATE entrar al submenu, al
momento de entrar nos daremos cuenta que el menu cuenta con una serie de
parametros, que son las condiciones de debera cumplir el sistema para poder
comunicarse con la PC, estas opciones no son estadanres por lo cual deberan
modificarse algunas para poder sincronicar la comunicación. Las condiciones que
nosotros requerimos son las siguientes:
Comm: 1 o 2 (puerto serie de la computadora comm1 o 2 según el caso)
Baud: 9600
Parity: N
Length: 8
Stop: 1
184
DL3155M24HC11
;===================================
;DL3155M24HC11 DE DELORENZO ITALY
;
;DESCARGA DE PROGRAMA
;===================================
;TITULO "PRUEBA.ASM"
DIR1 y DIR2 son dos etiquetas, que representan las direcciones de memoria RAM 121Hex y
122Hex.
ORG indica desde donde empezara a correr el programa en este caso desde la 100Hex.
Los datos debajo de org son nemonicos que corresponden al conjunto de instrucciones del
68hc11, especificamente la columna que tiene el simbolo @.
Para mas informacion, ver la ayuda del programa IASM11.
185
DL3155M24HC11
PRUEBA.ASM
1 ;===================================
2 ;DL3155M24HC11 DE DELORENZO ITALY
3 ;
4 ;DESCARGA DE PROGRAMA
5 ;===================================
6 ;TITULO "PRUEBA.ASM"
7
8
0000 9 DIR1 EQU $121 ;DIRECCIONES REN1
0000 10 DIR2 EQU $122 ;AUXILIARES
11
0100 12 ORG $0100;ORIGEN DE PROGRAMA REN2
13
0100 8601 14 INICIO LDAA #$01 ;ACUMULADOR CARGAR CON 01 HEX
0102 B70121 15 STAA DIR1 ;MANDAR DATO DE ACUMULADOR "A" A DIR1
0105 F60121 16 LDAB DIR1 ;CARGAR EL ACUMULADOR "B" CON DATO DE DIR1
0108 5C 17 INCB ;INCREMENTA ACUMULADOR "B"
0109 F70122 18 STAB DIR2 ;MANDAR DATO DE ACUMULADOR "B" A DIR2
010C CF 19 STOP ;INTERREPCION DEL PROGRAMA
20
DIR1 0121
DIR2 0122
INICIO 0100
186
DL3155M24HC11
En la COL1 aparecen los direcciones , a las cuales corresponde cada uno de los
nemonicos con sus respectivas etiquetas.
Por ejemplo el nemonico:
LDAA se encuentra en la direccion 100Hex
Y
INCB se encuentra en la direccion 108Hex
En la COL2 aparecen los codigos de los nemonicos, asi como los valores correspondientes
de sus variantes que se estan usando
Por ejemplo:
En la instrucción STAA DIR1:
STAA CODIGO ES B7 Hex
DIR1 CODIGO ES 0121 Hex
En la COL3 apareceran las etiquetas que correspondan al inicio o para denotar alguna
subrutina, en este caso solo aparece INICIO.
4) Con la tecla de funcion F7, aparecera una ventana que nos ayudara interactuar con el
microcontrolador y todos sus recursos, en este momento dar un reset, momento en el cual
aparecera un mensaje como este:
BUFFALO (bit user fast friedly aid to logical operations)
>
Si el mensaje no aparece, indica que la tarjeta no tiene comunicación con la tarjeta
DL3155M24HC11
187
DL3155M24HC11
File to download:_
Escribir adelante del cursor nombre_archivo.s19 ↵
Aparecera lo siguiente:
S11001008601B70121F601215CF70122CF31
S9030000FC
Done
>_
100 86 01 B7 01 21 F6 01 21 5C F7 01 22 CF FF FF FF
110 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
120 FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
Esto indica como esta gragado el programa en la meoria interna del 68hc11, nuestro origen
si nos damos cuenta esta en 100 Hex.
5) Para correr el programa hay dos formas corrida completa o paso a paso
a) Corrida completa, escribir lo siguiente, delante del cursor::
>_G 100 ↵
empezara a correr el programa (detener el programa con reset), si nos damos
cuenta no podemos ver nada
b) Paso a paso:
Unir los puntos XIRQ y PA3 con un cable.
En el cursor colocar lo siguiente:
>_RM ↵ (nos muestra los registros, acumuladores, contador de
programa, aparecera lo siguiente).
P-FFFF Y-FFFF X-FFFF A-FF B-FF C-xx S-xxxx
P-FFFF_
Delante del cursor de P-FFF_ escribir 100 y dar ↵
100 es la direccion de comienzo del programa inmediatamente despues
aparecera el cursor >
En el cursor escribira la letra T dando, ↵ dando asi a correr la primera
instrucción, para la segunda T ↵ y hasta la ultima hacer el mismo metodo,
y observara los cambios que pasan en los registros y memoria.
188
DL3155M24HC11
189