Está en la página 1de 190

Always leading the pack

SISTEMAS PROGRAMABLE

Laboratorio Time
DL3155M24HC11

DL3155M24HC11
SISTEMAS PROGRAMABLES

2
DL3155M24HC11

INDICE

GUIA TEORICA:

UNIDAD

1. Fundamentos de microcomputadoras.

2. Arquitectura del microprocesador.

3. Conjunto de instrucciones.

4. Operaciones con la pila.

5. Operaciones de entrada y salida.

6. Programación de la tarjeta DL3155M24HC11.

3
DL3155M24HC11

4
DL3155M24HC11

UNIDAD 1

FUNDAMENTOS DE
MICROCOMPUTADORAS

5
DL3155M24HC11

CONTENIDO

1.1 INTRODUCCIÓN

1.2 TÉRMINO MICROCONTROLADOR

1.3 FUNCIONAMIENTO DEL MICROCONTROLADOR

6
DL3155M24HC11

1.1 INTRODUCCION

Un microprocesador es un circuito electrónico muy complejo responsable de las operaciones


aritméticas y lógicas programadas en una microcomputadora. Esta constituido de cientos de
miles de transistores microscópicos encapsulados dentro de un delgado trozo(chip) de silicio
que no es mayor de algunos milímetros cuadrados. Dicho trozo, está alambrado en un circuito
integrado (chip) normalmente de 40 o más interconexiones entre el CI y el chip.

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.

Además de los circuitos estándar, característicos de los microprocesadores, el MC68HC11 que


usted aprenderá a programar, contiene otros circuitos. Se incluye internamente Memoria de
Sólo Lectura (ROM), Memoria de Acceso Aleatorio (RAM), Memoria de Sólo Lectura
Programable y Borrable Eléctricamente (EEPROM), una Interface Periférica Serial (SPI), una
Interface de Comunicaciones Serie (SCI), un Convertidor Analógico-Digital (A/D), Sistema de
Temporización(timer´s) y algunos otros usados principalmente en aplicaciones de interface.

7
DL3155M24HC11

1.2 EL TERMINO MICROCONTROLADOR


Un microprocesador es un dispositivo lógico que es usado en sistemas electrónicos digitales.
Pero, previamente estableceremos una diferencia entre microprocesador y microcontrolador(de
acuerdo a sus características podemos decir que también es llamado una
microcomputadora).

La unidad microprocesadora o CPU, es un elemento lógico complejo que lleva a cabo


operaciones aritmético/lógicas y de control. Comúnmente esta encapsulado en un solo circuito
integrado CI.
Un microcontrolador contiene un microprocesador, además de otros circuitos, tales como
dispositivos de memoria para almacenamiento de información, adaptadores de interface para
conectarse a señales externas y un reloj que actúa como temporizador maestro del sistema.
La figura 1-1 muestra un microcontrolador(recuerde que se menciono que tambien es llamada,
una microcomputadora) con los dispositivos basicos he interconectados entre internamente,
aplicandosele solo una señal de reloj.

Unidad
Reloj Microprocesadora

memoria

memoria

Interfaz

microcomputadora
I/O

Dispositivo de
entrada/salida

Fig. 1-1. Arquitectura básica de un Microcontrolador(microcomputadora).

La microcomputadora está integrada por los componentes ubicados dentro de la línea


punteada. El chip MC68HC11 usado en este curso, contiene esas características en un solo
chip de modo que se hace referencia a una unidad microcomputadora o CPU.

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

Concepto De Programa Almacenado

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.

La compuadora solo recibe instrucciones y las ejecuta. Se esclarece la aplicación y se le dan


las operaciones y el orden en que va a llevarlas a cabo. Dichas operaciones se les llama:
instrucciones. Las más comunes son la de suma, sustracción, cargar registro índice, almacenar
acumulador, de paro, etc., etc.

Un grupo de instrucciones que permiten a la computadora efectuar una tarea específica, se


llama programa. Y es el programador quién escribe dichas instrucciones.. Generalmente, la
longitud de un programa es proporcional a la complejidad de la tarea que la computadora debe
efectuar. Un programa para sumar una lista de números requiere sólo una docena de
instrucciones. Por otro lado, un programa para controlar todos los semáforos de una ciudad
chica puede requerir miles de instrucciones.

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.

Desde el principio, los diseñadores de computadoras reconocieron que es el operador que en


ocasiones hace lento el proceso de cómputo. Para solucionar esto fue desarrollado el concepto
de programa almacenado. Usando esta aproximación, el programa es almacenado en la
memoria de la computadora. Supongamos por ejemplo, que se tienen 20 números que serán
manipulados por un programa que consta de 100 instrucciones. Supongamos ahora que se
generarán 10 respuestas en el proceso.

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

En terminología de computadoras, una palabra es un grupo de dígitos binarios que pueden


ocupar una localidad de almacenamiento. Aunque la palabra está formada por dígitos

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 de las más importantes características de cualquier microprocesador es qué la longitud de


palabra pueda manejarse, esto se refiere a la longitud en bits de la unidad fundamental de
información.

Aunque actualmente existen muchos microprocesadores de 16 y 32 bits, una longitud de


palabra muy común continúa siendo de 8 bits. En esas unidades, los números, direcciones,
instrucciones y datos son representados por números binarios de 8 bits. El número binario más
pequeño es 0000 00002 o 0016; el mayor es 1111 11112 o FF1 6. En decimal, este rango es
desde 0 hasta 25510. Así, un número binario de 8 bits puede tener uno de 256 10 valores.

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.

También en los nuevos microcontroladores de tipo RISC, se emplean longitudes de 12 y 14


bits. Las longitudes mayores permiten trabajar con números grandes usando una sola palabra.
Por ejemplo, una palabra de 16 bits puede representar números hasta 6553610. Sin embargo,
esta capacidad agrega mayor complejidad al microprocesador. De cualquier modo,
restringiremos nuestra discusión a las unidades de 8 bits.

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 palabra de 8 bits define el tamaño de muchos componentes diferentes en el sistema


microprocesador. Por ejemplo, muchos registros importantes tendrán 8 bits de capacidad.

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.

Aun los microprocesadores de 16 bits usan segmentos de datos de 8 bits, en muchas


aplicaciones; como ejemplo, las entradas de teleimpresores frecuentemente consisten de
caracteres ASCII de 8 bits. Para distinguir esos segmentos de 8 bits de información, de los de
16 bits o mayores, hay un termino de uso general: el byte, que es un grupo de 8 bits, manejado

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.

Fig. 1-2 Palabras y bytes

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

1.3 FUNCINAMIENTO DEL MICROCONTROLADOR


El microprocesador puede tener una docena o más de registros que varían en tamaño desde 1
bit hasta 16 bits. Puede tener docenas de instrucciones, muchas de las cuales pueden
implementarse de diferentes maneras. Puede tener buses de datos, direcciones y control. En
suma, el microprocesador puede parecer desde afuera, complicado para programarse por ser
un micro desarrollado.

Un diagrama de bloques de una microcomputadora básica se muestra en la figura 1-3, la cual


muestra un microprocesador, la memoria y la circuitería de E/S. Por simplicidad, ignoraremos
los circuitos de E/S en ésta unidad. Podemos hacer esto suponiendo que el programa y los
datos se hallan en memoria y que los resultados se mantendrán en registros o en memoria. Al
final de este curso, se esclarecerá el movimiento de datos externos desde o hacia el micro,
dichos procedimientos se estudiarán en una de las ultimas unidades. Esto nos permitirá
concentrarnos en el microprocesador y la memoria.

Fig. 1-3. La Microcomputadora Básica

12
DL3155M24HC11

La unidad Microprocesadora

La unidad microprocesadora es mostrada en detalle en la figura 1-4. Por simplicidad, sólo se


incluyen los principales registros y circuitos. En nuestra unidad elemental, muchos de los
contadores, registros y buses son de 8 bits, por lo que pueden acomodar palabras de ese
tamaño.

CLOCK
AND
CONTROL
LINES

Fig. 1-4. Un microprocesador Elemental

13
DL3155M24HC11

Uno de los circuitos más importantes en el procesador es la unidad lógica-aritmética (ALU). Su


propósito es llevar a cabo operaciones lógicas o aritméticas sobre los datos que le son
entregados. La ALU tiene dos entradas principales. Una viene desde un registro llamado
acumulador, y la otra viene desde el registro de datos. La ALU puede sumar los dos datos de
entrada juntos, o puede restar una de la otra. También puede llevar a cabo algunas
operaciones lógicas, las cuales discutiremos en unidades posteriores. La operación que ejecute
la ALU está determinada por señales en las varias líneas de control.

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.

Fig. 1-5. Unidad Lógica Aritmética

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.

La MPU también contiene algunos otros registros y circuitos importantes: el registro de


direcciones, el contador de programa, el decodificador de instrucciones y el controlador-
secuencial. Estos son mostrados en la figura 1-4.

El registro de direcciones es otra localidad de almacenamiento temporal. Guarda la dirección


de la localidad de memoria o dispositivo de E/S que es usada en la operación que se está
llevando a cabo.

El contador de programa controla la secuencia en la que las instrucciones serán ejecutadas en


un programa. Normalmente, hace esto contando en secuencia 0, 1, 2, 3, etc.
En un instante dado, la cuenta indica la localidad en memoria de la que debe tomarse el
siguiente byte de información.

El decodificador de instrucciones. Después que una instrucción es sacada de la memoria y


colocada en el registro de datos, la instrucción es decodificada por éste circuito. El
decodificador examina el código de 8 bits y decide que operación debe ser llevada a cabo.

El controlador-secuenciador produce una variedad de señales de control para ejecutar la


instrucción. Ya que cada instrucción es diferente, se produce una combinación diferente de
señales de control para cada instrucción. Este circuito determina la secuencia de eventos,
necesaria para completar la operación descrita por la instrucción.
Más tarde verá como estos circuitos trabajan juntos para ejecutar programas simples. Primero,
demos en vistazo a la memoria de nuestra microcomputadora.

15
DL3155M24HC11

MEMORIA

Un diagrama simplificado de memoria lectura/escritura de 256 palabras a 8 bits, que se usa


nuestra microcomputadora hipotética se muestra en la figura 1-6. La memoria consiste de 25610
localidades, cada una de las cuales puede almacenar una palabra de 8 bits. Este tamaño de
memoria es referido frecuentemente como 256 X 8. Una memoria de lectura/escritura es
aquella en la que los datos pueden ser escritos y leídos con igual facilidad.

Fig. 1-6. Memoria de Acceso Aleatorio


(RAM)

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

El procedimiento se ilustra en la figura 1-7. Considere que la MPU va a leer el contenido de la


localidad de memoria 0416. Suponga que el número almacenado ahí es 9716.

Primero, la MPU coloca la dirección 0416 en el bus de dirección. El decodificador reconoce la


dirección y selecciona la localidad de memoria apropiada. Segundo, la MPU envía una señal
READ a la memoria, indicándole que el contenido de la localidad seleccionada esta siendo
colocado en el bus de datos. Tercero, la memoria responde colocando el número 971 6 en el bus
de datos. La MPU puede entonces tomar el número y usarlo como sea necesario.

Fig. 1-7. Leyendo desde memoria

Debe señalarse que el proceso de lectura de memoria no altera el contenido de la localidad


leída. Esto es, el número 9716 permanece en la localidad de memoria 04 después de la
operación de lectura. Esta característica se conoce como lectura no destructiva (NDRO). Es un
rasgo importante puesto que permite leer el dato cuanto sea necesario.

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

La memoria responde almacenando el número presente en el bus de datos en la localidad


seleccionada. Esto es, 5216 es almacenado en la localidad 03. El contenido previo se pierde al
haber sobre-escritura.

Fig. 1-8. Escribiendo en memoria

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.

Secuencia de Búsqueda – Ejecución

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.

La operación de la microcomputadora puede ser dividida en dos fases, como se muestra en la


Figura 1-9. Cuando se enciende el microprocesador entra a la fase de búsqueda. Durante esta
fase, una instrucción es tomada de la memoria y decodificada por la MPU.
Una vez que la instrucción es decodificada, la MPU conmuta a la fase de ejecución. En esta
fase, la MPU efectúa la operación indicada por la instrucción.

18
DL3155M24HC11

Fig. 1-9. Secuencia de busqueda-ejecución

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.

NOMBRE MNEMONICOS OPCODE DESCRIPCION


Cargar Cargar el contenido de la siguiente
acumulador LDA 1000 01102 o 8616 localidad de memoria en el acumulador
Sumar el contenido de la siguiente
localidad de memoria al contenido del
Add ADD 1000 10112 o 8B16
acumulador. Deja el resultado en el
acumulador
Stop STOP 1100 11112 o CF16 Detiene todas las operaciones

Fig. 1-10. Instrucciones usadas para el programa ejemplo.

La primera columna de la tabla, nos da el nombre de la instrucción. Cuando escribimos


programas, no es conveniente incluir el nombre completo. Por esta razón, cada instrucción
tiene una abreviatura o ayuda a la memoria llamada mnemónico. Los mnemónicos se dan en
la segunda columna. La tercera columna es la de códigos de operación u opcodes. Este es el

19
DL3155M24HC11

número binario que la computadora y el programador usan para representar la instrucción. El


opcode se da tanto en forma binaria como en hexadecimal. La columna final describe
exactamente que operación es llevada a cabo cuando se ejecuta la instrucción. El tener
presente esta tabla, será muy útil ya que empleará estas instrucciones una y otra vez.

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.

Usando los mnemónicos y la representación decimal de los números a sumar, el programa se


verá así:
LDA 7
ADD 10
STOP

La microcomputadora no puede entender mnemónicos o números decimales, solo interpreta


números binarios. Así, debe escribir el programa como una secuencia de números binarios.
Puede hacer esto reemplazando cada mnemónico por su correspondiente opcode y cada
número decimal por su contra parte binaria.

Entonces:

LDA 7 se convierte en 1000 0110 0000 0111


opcode de la representación
Figura 1-10 binaria de 7
Y:
ADD 10 se convierte en 1000 1011 0000 1010
opcode de la representación
Figura 1-10 binaria de 1010
Finalmente,
STOP se convierte en 1100 1111
opcode de la
Figura 1-10

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í:

1000 0110 Opcode de LDA


1a. Instrucción
0000 0111 Operando (7)
1000 1011 Opcode de ADD
2a. Instrucción
0000 1010 Operando (1010)

20
DL3155M24HC11

3a. Instrucción 1100 1111 Opcode de STOP

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.

Fig. 1-11. El programa en Memoria

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

2.1 ARQUITECTURA DE MICROPROCESADORES

2.2 ARQUITECTURA DEL MC68HC11

2.3 MODELO DE PROGRAMACION DEL MC68HC11

2.4 DIAGRAMA A BLOQUES DEL MC68HC11

23
DL3155M24HC11

2.1 ARQUITECTURA DE MICROPROCESADORES


En el lenguaje coloquial de las computadoras, la palabra arquitectura se usa para describir el
estilo de construcción de la computadora, su tamaño y arreglo de registros, su configuración de
buses, etc.

La arquitectura de nuestro microprocesador hipotético se muestra por última vez en la Figura 2-


1 Usted debe familiarizarse con esta arquitectura.

Fig. 2-1. Arquitectura del microprocesador hipotético

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

N Z V C REGISTROS CODIGO DE CONDICIÓN

Fig. 2-2. Modelo de programación del MPU hipotético

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.

El 68HC11 es un miembro de la familia de microprocesadores MC6800, Motorola que comenzó


en 1974 con la introducción del MC6800. Otros miembros de esta familia incluyen a los
microprocesadores MC6801 y MC6808, además de otros. Una ventaja del concepto de “familia”
de chips, es que muchas de las instrucciones usadas para programar uno de los micros pueden
usarse para programar otros de la familia. En este sentido se dice que el 68HC11 es totalmente
compatible con los otros miembros de la familia. Por ello comparte similitudes de diseño y la
habilidad de entender y ejecutar instrucciones del conjunto de instrucciones de la familia 6800.

Como resultado de esta compatibilidad entre miembros de la familia, un programa en lenguaje


ensamblador escrito para otro microprocesador, correrá casi sin problemas en el MC68HC11; lo
que nos indica que las principales diferencias entre los miembros de la familia tienen que ver
más con el hardware. Esto incluye a los circuitos de soporte interconstruidos, como relojes,
temporizadores, memoria RAM, memoria ROM, memoria EEPROM, y otros circuitos de soporte
para la CPU. La CPU del 68HC11 es básicamente una extensión del diseño de la CPU
MC6800/6801. Además de la posibilidad de ejecutar las 71 instrucciones del MC6800, el
68HC11 tiene un mapa “paginado” de opcodes con un total de 91 nuevos opcodes. Finalmente,
puesto que muchos términos y conceptos que aprenderá se aplican a otros microprocesadores,

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.

2.2 ARQUITECTURA DEL MC68HC11


Los 68HC11 son fabricados por Motorola y se diseñan para atender las necesidades
particulares del un sistema y para aplicaciones especializadas de los mercados. Las
aplicaciones de sistemas con microprocesadores requieren un microprocesador que es
expandible y tiene una capacidad de direccionamiento relativamente grande. Por otro lado, las
aplicaciones especializadas (automóviles, aparatos, etc.) requieren un dispositivo single-chip
autónomo que contiene en su interior CPU, memoria, y capacidades de I/O. Dicho dispositivo
se llama a menudo un microprocesador single-chip.

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.

Estructura de chip y características internas

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

15 SP 0 Apuntador de Pila (Stack Pointer)

15 PC 0 Contador de Programa (Program


Counter)
7 0
S X H I N Z V C Registro de código de condición.
Acarreo
Sobreflujo
Zero
Negativo
Mascara de
interrupción- IRQ
Medio acarreo o
semiacarreo
Mascara de interrupción
XIRQ
STOP deshabilitado

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

Recuerde que la memoria EEROM es principalmente de lectura. Es decir, puede ser de


escritura y lectura bajo un control de programa. Además, EEROM es no-volátil, siendo atractiva
para usarse al final de un programa largo en el almacenamiento de los datos. Los 68HC11
contienen 512 bytes de EEROM interna localizados en la dirección B60016 a B7FF16. La
información puede escribirse hacia y leída desde la EPROM vía un registro de control interno
especial llamado el registro PPROG.

I/O PARALELO

El 68HC11 proporciona 38 líneas I/O paralelas para interfaces externas, dependiendo de su


modo de operación. La mayoría de estas líneas pueden programarse como entradas o salidas,
por un registro interno asociado, dirección datos. Muchas de las líneas paralelas I/O, también
sirven como una función dual para dar otras características de I/O.

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.

EL TIMER INTERNO PROGRAMABLE

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 CONVERTIDOR DE A/D INTERNO

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.

LAS LÍNEAS DE LA CONEXIÓN DEL 68HC11

Para interconectar el microprocesador a los circuitos de soporte o dispositivos externos, es


importante estar familiarizado con la asignación de los pines, las líneas del control, etc. Por ello,
antes de iniciar los comentarios al respecto, necesitamos esta al tanto de las opciones de
configuración generales. El 68HC11 es un dispositivo muy complejo. Primeramente, existen dos
modos de que puede configurarse, como: single-chip o multiplexado. Cuando esta en su modo
de single-chip(chip sencillo), el 68HC11 es un microprocesador completamente autónomo, con
su propio componentes internos como el CPU, memoria y capacidades I/O. Configurado así, en
modo single-chip, es sumamente ventajoso cuando se emplea para las aplicaciones dedicadas
o especializadas, como en instrumentación, y automóviles, sólo para mencionar unos. De
hecho, algunos los fabricantes del automóvil incorporan el modo de single-chip del 68HC11, en
sus productos. Cuando se configura en su modo de single-chip, no hay datos externos o bus de
direcciones disponible, por consiguiente, usted no puede conectar un dispositivo periférico
como un A/D al 68HC11. Solo puede usar las capacidades interiores del dispositivo.

Cuando el 68HC11 se configuran en su modo multiplexado, la configuración de sus pines se


cambia para proporcionar un bus de datos externo de 8-bits y un bus de direcciones de 16-bits.
Como resultado, usted puede interconectar memoria externa y dispositivos periféricos I/O al
68HC11 en este modo.

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.

Pin 1, es etiquetado como Vss. Éste es el pin de tierra.

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

MOD B MOD A Modo Seleccionado


1 0 Single-chip
1 1 Multiplexado

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

I/O TIMER PROGRAMABLE


SERIE Y PARALELO Y I/O PARALELO

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

Pins 9 -16 son multiplexados para servir con un propósito dual:

§ 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 8)21 pin 18 es básicamente línea de entrada de interrupción no mascarable. Un nivel


lógico 0 aplicado a esta línea, causa que el MPU atienda al vector de interrupción no-
mascarable en las direcciones FFF416 y FFF516. El vector localizado en estas direcciones está
cargado en el contador del programa para que el MPU inicie la ejecución con la primera
instrucción de la rutina servicio de interrupción. No olvide que una instrucción RTI debe
aparecer al final de la rutina de servicio para volver al MPU, al lugar donde ocurrió la
interrupción.

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.

Pins 20-25 proporcionan I/O serie y paralelo hacia y desde el 68HC11.

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.

Pins 43 - 50 proporcionan acceso a un convertidor analógico a digital interno. Pueden aplicarse


ocho señales analógicas separadas a esta línea para su conversión interna a un valor digital de
8-bits.

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

Para ilustrar esto, se describirán los eventos significativos realizados durante la


búsqueda(fetch) y ejecución de la instrucción LDAA #(inmediato), que es una instrucción de 2-
bytes. El primer byte es el código de instrucción (8616). El segundo byte es el número que será
cargado al acumulador A. Esta instrucción requiere dos ciclos MPU. Durante el primer ciclo, el
código de instrucción es buscado y decodificado. Durante el segundo ciclo, el operando es
recuperado de la memoria y colocado al acumulador A.

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

Ciclo del MPU Ciclo del MPU


(FETCH, (EJECUCIÓN)
Búsqueda)

Fig. 2-7
Temporización de la instrucción LDAA#

Al tiempo 1, la dirección es transferida desde el contador de programa al bus de dirección a


través del registro dirección de memoria. Note que esto ocurre en el filo de caída de la señal E.
Las líneas AS y R/W no están en lógica 1, y deben cambiar a ésta lógica. Un estado lógico 1
en AS indica que una dirección está siendo colocada en el bus de direcciones. El estado lógico
1 en R/W indica a que el MPU desea leer el byte en la dirección indicada.

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.

Al tiempo 3, la dirección del operando también es transferido desde el contador de programa al


bus de direcciones. Al tiempo 4, el contador de programa se incrementa en uno en anticipación
de la siguiente fase de búsqueda.

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).

Temporizado de un segmento del programa

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.,

Nuestro segmento de programa muestra se ve en la Figura 2-8. Usando el modo de


direccionamiento inmediato, se carga el 0716 dentro del acumulador A carga y suma 2116. El
resultado se guarda entonces en localidad 0001 16. Note que la primera instrucción reside en la
dirección 001016.

DIRECCION CONTENIDO CONTENIDO HEX/. COMENTARIOS


HEX. HEX. MNEMONICO
0010 86 LDAA # Carga el acumulador A con el dato inmediato #07
0011 07 07
0012 8B ADDA # Suma al acumulador A, el dato inmediato # 21
0013 21 21
0014 97 STAA
Almacena el resultado en esta dirección
0015 01 01
0016 …. … Siguiente instrucción

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 1. Durante el primer ciclo, la dirección de la instrucción LDAA # (001016) es colocada en el


bus de direcciones. Como resultado, el código de operación 86, es leído desde esa dirección y
buscado por el MPU. Debido a que fue una operación de lectura, la línea R/W está en su
estado lógico 1. El MPU decodifica el código de operación y reconoce que éste es una
instrucción LDAA #. Por consiguiente, sabe que el próximo byte en memoria es él operando que
será cargado en el acumulador. Durante este ciclo, el contador del programa se incrementó a
001116, para que ahora apunte al operando.

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 3. Esta es la fase de búsqueda de la siguiente instrucción. La dirección 0012, es colocada


sobre el bus de direcciones. El código de operación a esa dirección se lee fuera y se coloca en
el bus de datos. El MPU recoge el código de operación, lo decodifica, y descubre que es la
instrucción ADDA #. En el proceso, el contador del programa se incrementa a 001316.
Ciclo 4. Aquí, la dirección 001316 se transfiere al bus de direcciones y la localidad de memoria
seleccionada sé lee. Por tanto, el operando 2116, se pone sobre el bus de datos. El MPU recoge
al operando y lo agrega a los contenidos del acumulador. La suma, 2816, se retiene en el
acumulador A. El contador del programa es incrementado a 001416.

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.

Por supuesto, la computadora no se pausa aquí. Durante el próximo ciclo, la próxima


instrucción es buscada y decodificada. Sin embargo, los ocho ciclos de la máquina ilustrados en
Figura 2-9 dan la idea general. Posteriormente verá, que las relaciones de temporización, aquí
mostradas, son importantes en las interfaces que realizará el MPU con memorias y circuitos
I/O.

36
DL3155M24HC11

2.3 MODELO DE PROGRAMACIÓN DEL MC68HC11


El 68HC11 es mucho más compleja que nuestra MPU hipotética. Consecuente-mente, un
modelo de programación del 68HC11 supone un buen comienzo. Este se muestra en la Figura
2-10.

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

15 SP 0 Apuntador de Pila (Stack Pointer)

15 PC 0 Contador de Programa (Program


Counter)
7 0
S X H I N Z V C Registro de código de condición.

Acarreo o préstamo de MSB

Sobreflujo

Zero

Negativo

Mascara de interrupción- I
Medio acarreo o semiacarreo (del bit
3)

Mascara de interrupción X

Paro deshabilitado

Fig. 2-10. Modelo de programación del MPU 68AC11

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:

Load Accumulator A, LDAA. (Cargar Acumulador A)


Load Accumulator B, LDAB. (Cargar Acumulador B)
Store Accumulator A, STAA. (Almacenar Acumulador A)
Store Accumulator B, STAB. (Almacenar Acumulador B)

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.

Contador de Programa de 16 Bits. El contador de programa en el 68HC11 tiene 16 bits en vez


de 8. Así, se pueden especificar 65,536 direcciones distintas. Esto significa que una
microcomputadora basada en el 68HC11 puede tener hasta 65,536 bytes de memoria.
Afortunadamente, nosotros podemos usar como mínimo o máximo el Byte 216, muchas
aplicaciones requieren menos memoria de este límite máximo. Ya que el contador de programa
tiene 16 bits, el bus de direcciones también debe ser de 16 bits. Contraste esto con el bus de
direcciones de 8 bits de nuestra máquina hipotética.

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.

Registros de Código de Condición. El 68HC11 tiene ocho bits de código de condición o


banderas. Cada una de ellas puede ser referida por la posición del bit (0-7) o por su nombre en
el registro de código de condición m, mostrado en la Figura 2-10. Cuatro de ellos son muy
similares, casi idénticos a los discutidos anteriormente. Estos incluyen los códigos de condición
negativo (N), Cero (Z), sobreflujo (V), y acarreo (C). En este momento surge una diferencia, por
haber dos acumuladores en el 68HC11. Así, la bandera de acarreo se pone a uno cuando hay

38
DL3155M24HC11

un acarreo de cualquier acumulador. También, un sobreflujo en cualquier acumulador pondrá a


uno la bandera V.

También se muestran cuatro nuevos códigos de condición en la Figura 2-10. La máscara I de


interrupción se usa para deshabilitar (enmascarar) toda interrupción enmascarable. Cualquiera
de ellas puede ser puesta a uno por hardware o a través de instrucción de programa. La
máscara X de interrupción es similar a la máscara I, sin embargo, es activada sólo por
hardware (Reset o XIRQ) y es borrado sólo por instrucción de programa (TAP o RTI). El uso de
estas será discutido después cuando estudie el uso de interrupciones. Ocupando la posición de
un bit entre las máscaras de interrupción I y X está la bandera de medio acarreo ó semiacarreo
(H). la bandera H es puesta a uno cuando hay un acarreo del bit 3 (al 4) del acumulador. La
MPU usa esta bandera para determinar cuando se implementa una instrucción de ajuste
decimal. Finalmente, el último bit de código de condición es: deshabilita STOP o PARO, su
bandera es S. Esta es puesta a uno bajo control del programa para deshabilitar la instrucción
STOP. Cuando STOP es deshabilitado de esta manera, su ejecución del programa es tratada
como una “no-operación” instrucción NOP. NOP será discutida con más detalle posteriormente.
Puesto que las últimas dos banderas de código de condición (X y S) generalmente no se
afectan por muchas de las instrucciones que se discutirán, consideraremos sólo los efectos
sobre las primeras seis banderas de código de condición.

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

2.4 DIAGRAMA A BLOQUES DE MC68HC11


Ahora que ha visto el modelo de programación de la MPU 68HC11, de un vistazo al diagrama
de bloques. Un diagrama simplificado se muestra en la Figura 2-11.

Se han omitido algunas rutas de datos, muchas líneas de control, y un registro de


almacenamiento temporal a favor de los registros y rutas de datos más importantes.

Fig. 2-11. Diagrama a bloques simplificado del MPU

40
DL3155M24HC11

41
DL3155M24HC11

UNIDAD 3

CONJUNTO DE INSTRUCCIONES

42
DL3155M24HC11

CONTENIDO

3.1 CONJUNTO DE INSTRUCCIONES DE MC68HC11

3.2 MODOS DE DIRECCIONAMIENTO

3.3 EXPLICACION DE INSTRUCCIONES

43
DL3155M24HC11

3.1 CONJUNTO DE INSTRUCCIONES DEL MC68HC11


Esas instrucciones pueden ser agrupadas en siete categorías generales. Aunque algunas de
ellas se superponen, la clasificación general de las instrucciones es: aritméticas, manejo de
datos, prueba de datos lógicos, registro índice y apuntador de pila, salto y bifurcación y código
de condición. En esta unidad discutiremos muchas de esas instrucciones en detalle

En esta sección no nos interesaremos en los modos de direccionamiento. Por lo tanto, no


manejaremos opcodes. Los varios modos de direccionamiento y los opcodes los veremos más
adelante. Por ahora identificaremos las instrucciones por sus nombres, mnemónicos y
operaciones. Verá lo que hace cada instrucción y como son afectados los primeros seis
registros de código de condición.

Instrucciones Aritméticas

La Figura 3-1 muestra las instrucciones aritméticas representativas de la MPU 68HC11. El


nombre de cada instrucción se muestra a la izquierda. La siguiente columna contiene el
mnemónico. La columna central da una explicación abreviada de lo que hace la instrucción. La
columna a la derecha muestra como se afectan los primeros seis registros de código de
condición.

* 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

Fig. 3-1 Instrucciones Aritméticas

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 ADDA y ADDB se comprenden fácilmente. La instrucción ABA suma el


contenido del acumulador A al contenido del acumulador B. Y el resultado lo almacena en el
acumulador A.

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.

Instrucciones de Manejo de Datos

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.

La instrucción de decremento nos permite restar 1 de la localidad de memoria o de cualquier


acumulador. La instrucción DEC es especialmente valiosa ya que decrementa un byte en
memoria con una sola instrucción. Previamente hemos cargado el byte, lo hemos
decrementado y lo entonces es almacenado atrás en memoria.

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

Fig. 3-2. Instrucciones de manejo de datos

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

A. antes que se ejecute la instrucción ROLA

B. después de ejecutar ROLA

Fig. 3-3. Ejecución de la instrucción ROLA

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.

La instrucción ROL le permite rotar un byte de memoria a la izquierda mientras está en


memoria. ROLB posibilita rotar el acumulador B a la izquierda. En cada caso se usa el registro
C como noveno bit.

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.

A. Antes de ejecutar RORA

B. Después de ejecutar RORA

Fig. 3-4. Ejecutando la instrucción RORA

La instrucción aritmética de rotación a la izquierda fué discutida anteriormente para la MPU


hipotética. La instrucción ASLA se ejecuta exactamente como se describió en la unidad previa.
Sin embargo, note que la MPU 68HC11 también tiene la instrucción ASLB que efectúa la misma
operación con el acumulador B. También tiene una instrucción ASL que permite efectuar esta
operación sobre un byte en memoria. La Figura 3-5 ilustra la ejecución de esta instrucción.

48
DL3155M24HC11

A. Antes de ejecutar ASL

B. Después de ejecutar ASL

Fig. 3-5. Ejecutando la instrucción ASL

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.

Cuando se ejecuta una instrucción aritmética de rotación a la derecha, el número en el registro


afectado es desplazado una posición a la derecha. El LSB pasa al registro C. B1 se desplaza a
B0, etc. B7 se desplaza a B6. Sin embargo, B7 permanece sin cambio. La Figura 3-6 ilustra la
ejecución de la instrucción ASRB. Note que también se listan las instrucciones ASRA y ASR en
la Figura 3-2. Estas efectúan el mismo tipo de operación de desplazamiento, pero sobre el
acumulador A y la localidad de memoria seleccionada, respectivamente.

A. Antes de ejecutar ASRB

B. Después de ejecutar ASRB

Fig. 3-6. Ejecutando la instrucción ASRB

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

A. Antes de ejecutar LSR

B. Después de ejecutar LSR

Fig. 3-7. Ejecutando la instrucción LSR

Volviendo a referirnos a la Figura 3-2, las instrucciones de almacenamiento del acumulador se


explican por sí solas.
Las instrucciones finales de manejo de datos son las instrucciones de transferencia del
acumulador. TAB copia el contenido del acumulador A en el acumulador B. Después que esta
instrucción se ejecuta, el número original del acumulador será el mismo en ambos
acumuladores. TBA hace lo opuesto. Copia el contenido del acumulador B en el acumulador A.
Después que TBA se ejecuta, el número original del acumulador B será el mismo en ambos
acumuladores.

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.

Fig. 3-8. Instrucciones Lógicas.

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.

La instrucción de complemento le permite hacer el complemento a uno del número en el


registro afectado. COM permite complementar un byte en memoria.

50
DL3155M24HC11

COMA y COMB le permiten complementar el contenido de los acumuladores A y B,


respectivamente. En cada caso, todos los 1´s son cambiados por 0´s y todos los 0´s son
cambiados por 1´s.

Las instrucciones de OR exclusivo trabajan similar al MPU hipotético. La operación OR


exclusivo se lleva a cabo bit a bit entre los contenidos del acumulador especificado y la
localidad de memoria seleccionada. El resultado es realmacenado en el acumulador
especificado.

La instrucción OR inclusivo es muy similar.

Instrucciones de Prueba de Datos

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.

Fig. 3-9. Instrucciones de prueba de datos

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.

De la misma manera, las instrucciones de comparación son similares a las instrucciones de


resta excepto que la diferencia resultante es ignorada. Por ejemplo, cuando se ejecuta la
instrucción CMPA, el contenido de la localidad de memoria seleccionada es restado del
contenido del acumulador A. Los códigos de condición son afectados sólo si se hubiera

51
DL3155M24HC11

producido una diferencia. Sin embargo, los contenidos originales de los acumuladores no son
afectados.

La instrucción de comparación de acumuladores (CBA) trabaja de la misma manera. Los


códigos de condición son puestos a uno, como si el contenido de B fuese restado del contenido
de A. Sin embargo, los contenidos de los acumuladores no son afectados.

Finalmente, la instrucción de prueba por cero o menos le permite probar un número en un


acumulador o la memoria para ver si es negativo o cero. Cuando esta instrucción es ejecutada,
la MPU revisa el número en cuestión y pone a uno las banderas N y Z, consecuentemente. El
número mismo no es cambiado.

Instrucciones del Registro Indice y del Apuntador de Pila.

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.

Fig. 3-10. Instrucciones de registro Indice


y del apuntador de la pila (stack pointer)

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:

M à XH, (M+1) à XL.

Ya que el apuntador de pila también es un registro de 16 bits, la instrucción de carga del


apuntador de pila (LDS) trabaja del mismo modo. Su operación puede ser descrita de la
siguiente manera: M à SPH ; (M+1) à SPL. Aquí, SPH se refiere a la mitad alta del apuntador de
pila y SPL se refiere a la mitad baja.

Cuando el contenido de los registros de 16 bits va a ser almacenado, la operación se invierte.


Por ejemplo, la instrucción STX almacena XH en M y XL en M+1. Una instrucción similar, STS,
nos permite almacenar el contenido del apuntador de pila de la misma manera.

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.

Fig. 3-11. Instrucciones de salto y bifurcación.

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:

Número en el Acumulador = 0000 00102


Operando en Memoria = 0000 00012

Cuando el operando es restado, el resultado es 000000012. Con este resultado, N y V son


limpiados. Note que N y V son iguales y que N ⊕ V = 0. Si la instrucción BGE sigue a la
operación de resta, se implementa la bifurcación.

Ahora veamos que pasa cuando el número en el acumulador es igual al operando:

Número en el Acumulador = 0000 00102


Operando en Memoria = 0000 00102

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.

Finalmente, note que pasa cuando el número en el acumulador es menor:

Número en el Acumulador = 0000 00012


Operando en Memoria = 0000 00102

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 Higher, Bifurca si es Mayor (BHI) es similar a la instrucción BGT


excepto que es aplicable a números no signados. BHI se usa normalmente después de una
operación de resta o comparación. La bifurcación ocurrirá sólo si el minuendo no signado es
mayor que el sustraendo no signado. Probando diferentes ejemplos, se puede probar que esto
ocurre sólo cuando las banderas C y Z son iguales a 0.

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

de resta o comparación, la bifurcación ocurrirá sólo si el minuendo no signado es menor o igual


que el sustraendo no signado.

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.

Se incluyen dos instrucciones adicionales en la Figura 3-11. Aunque no son instrucciones de


bifurcación, se agregan aquí por no caber en otra categoría.

La instrucción de No Operación (NOP) es una instrucción que simplemente consume un


pequeño lapso de tiempo. No cambia el contenido de ningún registro excepto el del contador de
programa. Incrementa el contenido del contador de programa en uno y consume dos ciclos
MPU. A pesar de ello, la NOP es una instrucción muy útil. Cuando se escribe un programa,
frecuentemente se emplean muchas instrucciones. Una vez que el programa se carga en
memoria, es muy inconveniente remover una sola instrucción. El hueco dejado en memoria
puede ser llenado recorriendo todas las instrucciones siguientes. Sin embargo, una manera
rápida es llenar el hueco con una o varias instrucciones NOP.

La instrucción STOP es la instrucción de “fin de programa” del 68HC11. En unidades anteriores


hemos empleado esta instrucción como PARO, o final de secuencias. Sin embargo, como verá
después en este curso, hay más detalles en la ejecución de una instrucción STOP que
simplemente detener la MPU. Por ahora, no obstante, siga considerando a STOP como la
instrucción para terminar la ejecución de un programa.

Instrucciones del Registro de Código de Condición


La MPU 68HC11 tiene ocho instrucciones que nos permiten tener acceso directo a los códigos
de condición. Se listan en la Figura 3-12.

Fig. 3-12. Instrucciones de registro código de condición

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.

Fig. 3-13 Ejecutando la instrucción TAP

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.

Fig. 3-14 Ejecutando la instrucción TPA

57
DL3155M24HC11

3.2 MODOS DE DIRECCIONAMIENTO

En el modo de direccionamiento inmediato, el operando es el byte en memoria inmediatamente


siguiente al opcode. Generalmente se trata de instrucciones de dos bytes. El primer byte es el
opcode, el segundo es el operando. Sin embargo, hay excepciones a la regla de los dos bytes.
Algunas operaciones involucran al registro índice de 16 bits y al apuntador de pila. En esos
casos, el operando se compone de los dos bytes siguientes al opcode. Esas son instrucciones
de tres bytes. El primer byte es el opcode, el segundo y tercero son el operando.

En el modo de direccionamiento directo, el byte siguiente al opcode es la dirección del


operando. Estas siempre son instrucciones de dos bytes. El primer byte es el opcode; el
segundo es la dirección del operando. Un byte puede especificar direcciones desde 00 a FF16.
Así, cuando sea empleado el modo de direccionamiento directo, el operando debe estar en los
primeros 25610 bytes de memoria. Puesto que la MPU 68HC11 puede tener hasta 65536 10
bytes de memoria, se deben usar otros medios para direccionar la porción superior de la
memoria.

El modo de direccionamiento relativo se emplea para bifurcar. Se trata de instrucciones de dos


bytes. El primer byte es el opcode, el segundo es la dirección relativa. Recuerde que la
dirección relativa se suma al contador de programa para formar la dirección absoluta. Puesto
que la dirección relativa es un número de 8 bits en complemento a dos, los límites de la
bifurcación son +12710 y –128 10.

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.

En esta sección discutiremos dos nuevos modos de direccionamiento. Son llamados


direccionamiento extendido y direccionamiento indexado. Trataremos el direccionamiento
extendido primero.

Direccionamiento Extendido

El direccionamiento extendido es similar al direccionamiento directo pero con una diferencia


significativa. Tenga en mente que en el direccionamiento directo el operando debe hallarse en
los primeros 25610 bytes de memoria. Ya que esto representa menos del uno por ciento de las
direcciones disponibles por la MPU 68HC11, es necesario un modo de direccionamiento más
poderoso. El modo de direccionamiento extendido cubre dicha necesidad.

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:

F6 Opcode para LDAB extendido


21 Dirección de orden alto
34… Dirección de orden baj

De la misma manera, si desea el numero de la localidad AA0016, la instrucción seria:

7C Opcode para INC extendido


AA Dirección de orden alto
00 Dirección de orden bajo

El modo de direccionamiento extendido nos permite direccionar un operando residente en


cualquier dirección incluyendo los primeros 25610 bytes de la memoria. Así, si desea cargar el
operando de la dirección 0013 16 en el acumulador A, puede usar direccionamiento extendido:

B6 Opcode para LDAA extendido


00 Dirección de orden alto
13 Dirección de orden bajo

O puede usar direccionamiento directo:

96 Opcode para LDAA directo


13 Dirección

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

El modo más poderoso disponible para el 68HC11 es el direccionamiento indexado. Recuerde


que el 68HC11 posee dos registros índices de 16 bits, el IX y el IY. Hay algunas instrucciones
asociadas con esos registros. Estas nos permiten cargar el registro desde memoria y

59
DL3155M24HC11

almacenar su contenido en memoria. También podemos incrementar y decrementar un registro


índice. Además, podemos comparar su contenido con dos bytes de memoria consecutivos.
Estas capacidades hacen que al registro índice capaz de funcionar como un contador de 16
bits. Este contador puede funcionar como un apuntador de direcciones dirigido a cualquier
dirección de memoria.

Propósito. Antes de entrar en detalles de cómo funciona el direccionamiento indexado,


veamos porque es necesario. Supongamos que deseamos sumar una lista de 2016 numeros, y
que estos se hallan en 2016 localidades de memoria consecutivas, comenzando en la dirección
0050. Empleando los modos de direccionamiento discutidos anteriormente, nuestro programa
podria verse como sigue:
CLRA Limpia el acumulador A
ADDA Suma el primer numero
50 al acumulador A
ADDA Suma el segundo numero
51 al acumulador A
ADDA Suma el tercer numero
52 al acumulador A
.
.
.
ADDA Suma el ultimo numero
6F al acumulador A
STOP Alto.

Aunque este programa nos proporciona el resultado deseado, emplea demasiadas


instrucciones repetitivas. Su extensión es de 6610 bytes de memoria. Note que todas las
instrucciones ADDA son idénticas, a excepción de la dirección del operando. El
direccionamiento indexado simplifica mucho los programas de este tipo.

Formato de la Instrucción. El formato de una instrucción que usa direccionamiento


indexado es como el de la Figura 3-15. Note que se trata de una instrucción de dos bytes. El
primer byte es el opcode, el segundo se llama compensación (offset) de dirección. La
compensación de dirección es un numero binario de 8 bits no signado. Este se suma al
contenido del registro índice para determinar la dirección en que se halla el operando.
Considere que, a menos que se especifique otra cosa, “registro índice” se refiere al registro
índice X.

Fig. 3-15. Formato de una instrucción que usa modo de direccionamiento indexado

60
DL3155M24HC11

Cada instrucción que involucra un operando en memoria puede usar el modo de


direccionamiento indexado. En esta unidad emplearemos la siguiente convención para indicar
direccionamiento indexado:
LDAA, X
STAA, X
ADDB,X
etc.

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.

Determinando la dirección del operando. Cuando se usa direccionamiento indexado,


la dirección del operando se determina con la dirección de compensación(offset) y el numero en
el registro índice. Específicamente, la compensación de dirección de 8 bits es sumada a la
dirección de 16 bits que se halla en el registro índice. La suma de 16 bits es la dirección del
operando. La Figura 3-16 ilustra esto.

Fig. 3-16. La dirección de operando es formada por la suma


de la dirección Offset y el contenido del registro índice.

Aquí, la instrucción en la localidad de memoria 00041 6 es LDAA, X. La dirección de


compensación es 1116. El contenido del registro índice es 013316 . Cuando se ejecuta la
instrucción LDAA, X; la dirección del operando se forma sumando la dirección de compensación
a él número en el registro índice. En este caso, la dirección del operando será:

013316
+
1116

014416

El operando de esta dirección es cargado en el acumulador A. En este ejemplo, el operando es


FF y se carga cuando la instrucción de la localidad 0004 es ejecutada. Es importante recordar

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.

DIRECCION CONTENIDO MNEMONICOS/ COMENTARIOS


HEX HEX CONTENIDO
HEX
0010 CE LDX # Carga en forma inmediata el registro
0011 00 00 índice con la dirección del primer
0012 50 50 número de la lista.
0013 4F CLR A Borra el acumulador A
0014 AB ADDA, X Suma al acumulador usando
0015 00 00 direccionamiento indexado con la
dirección de compensación(offset) de 00
0016 08 INX Incrementa el registro índice
0017 8C CPX # Compara el contenido del registro índice
0018 00 00 con la dirección más grande que la
0019 70 70 dirección del ultimo numero en la lista.
001A 26 BNE Si no es igual salta a la instrucción
001B F8 F8 ADDA, X
001C CF STOP De lo contrario detente

Fig. 3-17. Programa para sumar una lista de 2016 números

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 siguiente instrucción limpia el acumulador A. La suma será acumulada en este registro, lo


que hace necesario limpiarlo inicialmente.

La tercera instrucción (ADDA,X) es la única instrucción en el programa que usa


direccionamiento indexado. El símbolo X lo indica. La dirección offset es 00. Recuerde que la
dirección del operando se determina sumando el offset al contenido del registro índice. El
registro índice contiene 0050 16 de una instrucción previa. Ya que el offset es 00, la dirección del
operando es 0050 16. Esto es, el contenido de la localidad de memoria 00501 6 se suma al
contenido del acumulador A. Tenga en mente que 00501 6 es la dirección del primer número de
la lista.

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

Si ocurre la igualdad, la bandera Z es fijada a uno. Es claro que no se harán más


comparaciones. Note una vez más que el símbolo # indica el modo de direccionamiento
inmediato. Así, el contenido del registro índice es comparado con los dos bytes siguientes en el
programa o 0070.

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.

Empleando direccionamiento indexado, nuestro programa puede verse como se muestra en la


Figura 3-18. El primer paso es cargar el registro índice con la primera dirección de la lista
original. La instrucción LDAA, X tiene una compensación de dirección de 00. Por lo tanto, el
acumulador A es cargado desde la dirección especificada por el registro índice (0030). Esto es,
el primer número de la lista original es cargado en el acumulador A cuando se ejecuta la
instrucción LDAA, X.

DIRECCION CONTENIDO MNEMONICOS/ COMENTARIOS


HEX HEX CONTENIDO
HEX
0010 CE LDX # Carga en forma inmediata el registro
0011 00 00 índice con la dirección de La lista
0012 30 30 original
0013 A6 LDAA, X Carga el acumulador en forma indexada
0014 00 00 con un offset de 00
0015 A7 STAA, X Almacena el acumulador A con un offset
0016 10 10 de 1016
0017 08 INX Incrementa e registro índice
0018 8C CPX # Comparación indexada con una
0019 00 00 dirección más grande que la ultima
001A 40 40 dirección de la lista original
001B 26 BNE Si no es igual, salta a la instrucción
001C F6 F6 LDAA, X
001D CF STOP De lo contrario detente

Fig. 3-18. Programa para copiar una lista de direcciones


0030 – 003f dentro de otra 0040 – 004F

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

SUMARIO DEL CONJUNTO DE INSTRUCCIONES


Ahora ha sido introducido al uso de las instrucciones mas frecuentes e importantes del 68HC11.

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 Formatos Fuente es una lista de mnemónicos junto con la forma de la


instrucción con respecto a su operando. Note que ciertos tipos de instrucciones, como la
instrucción ADD, tienen relativamente muchas formas distintas. Aunque no es necesario
memorizar todas las instrucciones, usted puede aprender a reconocer la categoría de la
instrucción por su mnemónico y entonces determinar en cual de las siete categorías principales
cae. Por ejemplo, aunque hay 17 instrucciones cuyo mnemónico comienza con la letra A, un
examen mas detallado revela solo 3 tipos distintos. Estas son las instrucciones ADD, AND y las
instrucciones aritméticas (SHIFT). Un conocimiento básico de los distintos tipos de
instrucciones disponibles, junto con una aproximación sistemática, le dará un conocimiento
sorprendentemente completo del conjunto de instrucciones.

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).

La columna de Boolean Expression, (expresión boleana), proporciona una representación


lógica de la instrucción en forma simbólica. Esta información puede ser útil para diseñar o
analizar (depurar) programas.

La columna de Addressing Mode Operand, (modo de direccionamiento del Operando), contiene


abreviaturas de los posibles modos con el operando. A la derecha se localizan los códigos de
Máquina, cada operación dados en hexadecimal. Un sistema de abreviaturas, descrito en
“NOTES” al final de la Figura 3-19, se utilizan para indicar el formato, direccionamiento,
memoria y otra información relevante acerca de los opcodes. Las siguientes dos columnas
listan el número de bytes y ciclos de MPU requeridos para ejecutar la instrucción.

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

Fig. 3-19 CONJUNTO DE INSTRUCCIONES DEL MC68HC11

67
DL3155M24HC11

Fig. 3-19 CONTINUACION.

68
DL3155M24HC11

Fig. 3-19. CONTINUACION.

69
DL3155M24HC11

Fig. 3-19. CONTINUACION.

70
DL3155M24HC11

Fig. 3-19. CONTINUACION.

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

↓ Bit que puede ser borrado, pero no activado.

72
DL3155M24HC11

73
DL3155M24HC11

3.3 EXPLICACION DE LAS INSTRUCCIONES


Lista del conjunto de instrucciones del 68HC11.

NOMENCLATURA

La siguiente nomenclatura será empleada en las definiciones del las instrucciones.

(a) Operadores

( ) = Contenido del registro, mostrado entre paréntesis.


← = Transferido a…
↑ = Sacado de la pila
↓ = Colocado en la pila
• = Operación AND booleana
+ = Símbolo de suma aritmética excepto cuando es usada como símbolo
de OR-inclusiva, en formula booleana.
⊕ = OR-exclusiva
¬ = Operación NOT booleana
∗ = Multiplicación
: = Concatenación
− = Símbolo de substracción aritmética o símbolo de
negación(complemento a dos.)

(b). Registros en el microcontrolador.

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

(c). Memoria y direccionamiento.

M = Una localidad de memoria (1 byte)


M+1 = Un byte de memoria mas 0001, respecto a la dirección de la localidad
de memoria indicada por "M".
Rel = Ajuste Relativo (relative offset), como es el caso de almacenar
números con complemento a dos en él ultimo byte del código de
máquina correspondiente a una instrucción de salto.
(opr) = Operando
(msk) = Mascara usada en instrucciones de manipulación de bit.
(rel) = Ajuste relativo (relative offset), usado en instrucciones de salto.

(d). Bit 0 a Bit 7 del Registro código de condición

C = Acarreo/prestamo, bit "0"


V = Indicador de sobreflujo en complemento a dos, bit "1"
Z = Indicador del cero, bit "2"
N = Indicador negativo, bit "3"
I = Macara de interrupción I, bit "4"
H = Semiacarreo, bit 5
X = Macara de interrupción X, bit 6
S = “Paro deshabilitado (stop disable), bit 7

(e). Estado de los bits individuales, antes de la ejecución de una instrucción.

An = Bit n de ACCA (n = 7, 6, 5,…0)


Bn = Bit n de ACCB (n = 7, 6, 5,…0)
Dn = Bit n de ACCD (n = 15, 14, 13,…0), donde los bits 8-15 se refieren a
ACCA y el bit 0-7 a ACCB
Ixn = Bit n de IX (n = 15, 14, 13,…0)
IXHn = Bit n de IXH (n = 7, 6, 5,…0)
IXLn = Bit n de IXL (n = 7, 6, 5 ,…0)
IYn = Bit n de IY (n = 15, 14, 13,…0)
IYHn = Bit n de IYH (n = 7, 6, 5,…0)
IYLn = Bit n de IYL (n = 7, 6, 5 ,…0)
Mn = Bit n de M (n = 7, 6, 5,…0)
SPHn = Bit n de SPH (n = 7, 6, 5 ,…0)
SPLn = Bit n de SPL (n = 7, 6, 5,…0)
Xn = Bit n de ACCX (n = 7, 6, 5,…0)

75
DL3155M24HC11

(f). Estado de los bits individuales en el resultado de la ejecución de una instrucción.


(i) Para resultados de 8 bits

Rn = Bit n del resultado (n=7, 6, 5, 4,….0).


Este aplica a las instrucciones que proporcionan un resultado
contenido en un byte simple de memoria, o en un registro de 8 bits.

(ii) Para resultados de 16 bits.

RHn = Bit n del byte más significativo (n=7, 6, 5, 4,….0).


RLn = Bit n del byte menos significativo (n=7, 6, 5, 4,….0), este aplica a
instrucciones las cuales, proveen resultados contenidos en dos bytes
consecutivos de memoria o en un registro de 16 bits. .
Rn = Bit n del resultado (n=15, 14, 13, 12,….0).

(g). Simbologia para el CCR

- = 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

NOTA: Las banderas no mencionadas se sobre entenderá que son afectadas.

76
DL3155M24HC11

INSTRUCCIONES

ABA
Suma el acumulador B, al Acumulador A

Operación: ACCA ← (ACCA) + (ACCB)

Descripción: Suma el contenido de ACCB al contenido de ACCA y el resultado colócalo


en el acumulador A, ACCA.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — —

H=1 si ocurrió un acarreo en el bit 3; 0 en otro caso


N=1 el bit más significativo del resultado, es 1;en otro caso se borra.
Z=1 los bits del resultado son 00; 0 en cualquier otro caso.
V=1 si hubo sobreflujo en complemento a dos; 0 en otro caso.
C=1 si hubo un acarreo desde el bit más significativo del resultado, 0 en
otro caso.

ABX
Suma el acumulador B, al registro índice X

Operación: IX ← (IX) + (ACCB)

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.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — — — — —

Mnemónico: ABX

77
DL3155M24HC11

ABY
Suma el acumulador B, al registro índice Y

Operación: IY ← (IY) + (ACCB)

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.

Registro de Códigos de condición (CCR)


No afectados.

Mnemónico: ABY

ADC
Suma con acarreo.

Operación: ACCX ← (ACCX) + (M) + (C)

Descripción: Suma de los contenidos del bit "C", a la suma del contenido ACCX y M,
colocando el resultado en ACCX.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — —

H=1 Si ocurrió un acarreo en el bit 3; 0 en otro caso


N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro
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: ADCA (opr) ADCB (opr)

78
DL3155M24HC11

ADD
Suma sin acarreo

Operación: ACCX ← (ACCX) + (M)

Descripción: Suma el contenido de M al contenido de ACCX y el resultado se coloca en


ACCX.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — —

H=1 Si ocurrió un acarreo en el bit 3; 0 en otro caso


N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro
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: ADDA(opr); ADDB (opr)

ADDD
Suma con el acumulador doble

Operación: ACCD ← (ACCD) + (M:M + 1)

Descripción: Suma el contenido de M concatenado con M + 1, al contenido de ACCD y lo


coloca en ACCD.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.

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.

Mnemónico: ADDD (opr)

AND
Operación lógica AND

Operación: ACCX ← (ACCX) • (M)

Descripción: Ejecuta operación AND entre el contenido de ACCX y el contenido de M,


colocando el resultado en ACCX. (Cada bit de ACCX será afectado por la
operación AND lógica entre M y ACCX, de acuerdo a cada bit
correspondiente.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0 0

Mnemónico : ANDA (opr); ANDB (opr)

ASL
Corrimiento aritmético a la izquierda
(Igual que LSL)

Operación:

Descripción: Corrimiento de todos los bits de ACCX o M, una posición a la izquierda. El


bit “0” es cargado con un "0" lógico. El bit "C" en el CCR se carga desde el
bit más significativo de ACCX o M.

80
DL3155M24HC11

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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.

Desde fuente: ASLA; ASLB; ASL (opr)

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.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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: 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.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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ónicos: ASRA, ASRB, ASR (opr)

BCC
Salta si el acarreo es borrado
(igual a BHS)

Operación: PC ← (PC) + 0002 + Rel Sí C = 0

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.

Registro de Códigos de condición (CCR)


No afectados.

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.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0 0

Mnemónico: BCLR (opr)(msk)

BCS
Salta si el acarreo esta activado
(Igual a BLO)

Operación: PC ← (PC) + 0002 + Rel si C = 1

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.

Registro de Códigos de condición (CCR)


No afectados.

Mnemónico: BCS (rel)

83
DL3155M24HC11

BEQ
Salta si es igual

Operación: PC ← (PC) + 0002 + Rel si Z = 1

Descripción: Prueba el estado del bit "Z", del registro código de condición y causa un
salto si dicho bit esta activado.

Registro de Códigos de condición (CCR)


No afectados.

Mnemónico: BEQ (rel)

BGE
Salta si es mayor o igual a cero.

Operación: PC ← (PC) + 0002 + Rel si (N) ⊕ (V) = 0


Equivale a (ACCX) ≥ (M)
(números signados en complemento a dos)
4
Descripción: Causa un salto si N es activada y V también, ó, N es borrada al igual que V,
en
el CCR.
Si la instrucción BGE es ejecutada inmediatamente después de la ejecución
de alguna de las instrucciones CBA, CMP (A, B o D), CP(X o Y), SBA o SUB
(A, B o D), el salto ocurre, sí y solo sí, el número de complemento a dos
representado por el minuendo (ACCX), fue mayor o igual al número de
complemento a dos representado por el substraendo(M).

(Ver instrucción BRA para detalles de él salto).

Registro de Códigos de condición (CCR)


No afectados.
Mnemónico: BGE (rel)

84
DL3155M24HC11

BGT
Salta si es mayor a cero.

Operación: PC ← (PC) + 0002 + Rel si (Z) + [(N) ⊕ (V)] = 0


Equivale a (ACCX) > (M)
(números signados en complemento a dos)

Descripción: Causa un salto si (Z es borrada) y (N activada al igual que V) ó, (N es


borrada y V, también).
el CCR.
Si la instrucción BGT es ejecutada inmediatamente después de la ejecución
de alguna de las instrucciones CBA, CMP (A, B o D), CP(X o Y), SBA o SUB
(A, B o D), el salto ocurre, sí y solo sí, el número de complemento a dos
representado por el minuendo (ACCX), fue mayor que el número de
complemento a dos representado por el substraendo(M).

(Ver instrucción BRA para detalles de él salto).

Registro de Códigos de condición (CCR)


No afectados.

Forma canonica: BGT(rel)

BHI
Salta si es mayor.

Operación: PC ← (PC) + 0002 + Rel si (C) + (Z) = 0


Equivale a (ACCX) > (M)
(números binarios sin signo)

Descripción: Causa un salto si C es borrada al igual que Z en el CCR.


Si la instrucción BHI es ejecutada inmediatamente después de la ejecución
de alguna de las instrucciones CBA, CMP (A, B o D), CP(X o Y), SBA o SUB
(A, B o D), el salto ocurre, sí y solo sí, el número binario sin signo
representado por el minuendo (ACCX), fue mayor al número binario sin
signo representado por el substraendo (M).

Registro de Códigos de condición (CCR)


No afectados.

Mnemónico: BHI (rel)

85
DL3155M24HC11

BHS
Salta si es mayor o igual.
(igual a BCC)

Operación: PC ← (PC) + 0002 + Rel si C = 0


Equivale a (ACCX) ≥ (M)
(números binarios sin signo)

Descripción: Prueba el estado del bit C, en el registro código de condición y causa un


salto si ésta borrado.
Si la instrucción BHS es ejecutada inmediatamente después de la ejecución
de alguna de las instrucciones CBA, CMP (A, B o D), CP(X o Y), SBA o SUB
(A, B o D), el salto ocurre, sí y solo sí, el número binario sin signo
representado por el minuendo (ACCX), fue mayor o igual al número binario
sin signo representado por el substraendo(M).

(Ver instrucción BRA para más detalles de la ejecución de salto).

Registro de Códigos de condición (CCR)


No afectados.

Mnemónico: BHS(rel)

BIT
Bit de prueba.

Operación: (ACCX) • (M)

Descripción: Ejecuta la operación lógica AND, entre el contenido de ACCX y el contenido


de M, modificando los códigos de condición. Ninguno de los contenidos de
los operandos ACCX o M , son afectados. (Cada bit del resultado de la
operación AND, es el correspondiente a M y ACCX).

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.

86
DL3155M24HC11

V=0 0

Mnemónicos: BITA(opr); BITB(opr)

BLE
Salta si es menor o igual a cero.
(igual a BCC)

Operación: PC ← (PC) + 0002 + Rel si (Z) + [(N) ⊕ (V)] = 1


Equivale a (ACCX) ≤ (M)
(números signados con complemento a dos)

Descripción: Causa un salto si (Z esta activada) o (N activada y V borrada) o (N borrada y


V activada) en el CCR.
Si la instrucción BLE es ejecutada inmediatamente después de la ejecución
de alguna de las instrucciones CBA, CMP (A, B o D), CP(X o Y), SBA o SUB
(A, B o D), el salto ocurre, sí y solo sí, el número de complemento a dos
representado por el minuendo (ACCX), fue menor o igual al número de
complemento a dos representado por el substraendo(M).

(Ver instrucción BRA para más detalles de la ejecución de salto).

Registro de Códigos de condición (CCR)


No afectados.

Mnemónico: BLE(rel)

BLO
Salta si es menor
(Igual a BCS)

Operación: PC ← (PC) + 0002 + Rel si C = 1


Equivale a (ACCX) < (M)
(números binarios sin signo)

Descripción: Prueba el estado del bit C, en el registro código de condición y causa un


salto si ésta activado.
Si la instrucción BLS es ejecutada inmediatamente después de la ejecución
de alguna de las instrucciones CBA, CMP (A, B o D), CP(X o Y), SBA o SUB

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).

(Ver instrucción BRA para más detalles de la ejecución de salto).

Registro de Códigos de condición (CCR)


No afectados.

Mnemónico: BLO(rel)

BLS
Salta si es menor o igual

Operación: PC ← (PC) + 0002 + Rel si (C) + (Z) = 1


Equivale a (ACCX) ≤ (M)
(números binarios sin signo)

Descripción: Causa un salto si en el registro código de condición, C esta activo o Z


también lo esta.
Si la instrucción BLS es ejecutada inmediatamente después de la ejecución
de alguna de las instrucciones CBA, CMP (A, B o D), CP(X o Y), SBA o SUB
(A, B o D), el salto ocurre, sí y solo sí, el número binario sin signo
representado por el minuendo (ACCX), fue menor o igual a el número
binario sin signo representado por el substraendo(M).

(Ver instrucción BRA para más detalles de la ejecución de salto).

Registro de Códigos de condición (CCR)


No afectados.

Mnemónico: BLS(rel)

88
DL3155M24HC11

BNE
Salta si no es igual.

Operación: PC ← (PC) + 0002 + Rel si Z = 1

Descripción: Prueba el estado del bit Z en el registro de código de condición y causa un


salto si esta borrado.

Registro de Códigos de condición (CCR)


No afectados.

Mnemónico: BNE(rel)

BPL
Salta si es más.

Operación: PC ← (PC) + 0002 + Rel si N = 0

Descripción: Prueba el estado del bit N, en el registro código de condición y causa un


salto si ésta borrado.

(Ver instrucción BRA para más detalles de la ejecución de salto).

Registro de Códigos de condición (CCR)


No afectados.

Mnemónico: BPL(rel)

89
DL3155M24HC11

BRA
Salta siempre

Operación: PC ← (PC) + 0002 + Rel

Descripción: Salto incondicional a la dirección dada por la formula anterior, en donde


Rel, es el ajuste o compensación relativa almacenada como un número de
complemento a dos en el segundo byte del código de maquina
correspondiente a la instrucción de salto.
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.

Registro de Códigos de condición (CCR)


No afectados.
Mnemónico: BRA(rel)

BRCLR
Salta si el bit(s) es borrado.

Operación: PC ← (PC) + 0004 + Rel si:


M • ( PC + 2 )
PC ← (PC) + 0005 + Rel si:
M • ( PC + 3 ) Modo de direccionamiento
indexado Y

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

Registro de Códigos de condición (CCR)


No afectados.

Mnemónico: BRCLR (opr)(msk)(rel)

90
DL3155M24HC11

BRN
Nunca salta

Operación: PC ← (PC) + 0002

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.

(Ver instrucción BRA para más detalles de la ejecución de salto).

Registro de Códigos de condición (CCR)


No afectados.

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)

Descripción: Revisa la localidad M y salta si todos los bits especificados con 1 en la


mascara de bytes son 1 en el byte de prueba.
El salto será realizado solo si todos los bits probados son "1" en el byte de
prueba.

Registro de Códigos de condición (CCR)


No afectados.

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.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0 0
Mnemónico: BSET (opr)(msk)

BSR
Salto a subrutina
Operación: PC ← (PC) + 0002
↓ (PCL)
SP←← (SP) - 0001
↓ (PCH)
SP ← (SP) - 0001
PC ← (PC) + Rel

Descripción: El contador de programa es incrementado en 2. El byte menos significativo


correspondiente al contenido del contador de programa es colocado en la
pila. El stack pointer es entonces decrementado (por 1). El byte más
significativo que corresponde al contenido del contador de programa es
entonces colocado en la pila. El stack pointer es decrementado
nuevamente (por 1). El salto ocurre entonces, a la localidad especificada
por el salto.
(Ver instrucción BRA para más detalles de la ejecución de salto).

Registro de Códigos de condición (CCR)


No afectados.
Mnemónico: BSR(rel)

92
DL3155M24HC11

BVC
Salta si la bandera de sobreflujo esta borrada

Operación: PC ← (PC) + 0002 + Rel si V = 0

Descripción: Revisa el estado del bit V en el registro código de condición y causa un


salto si dicho bit, esta borrado.
Esta instrucción se usa después de una operación en valores binarios con
complemento a dos, puede causar un salto(si no hubo sobreflujo). De modo
que salta si el resultado del complemento a dos, fue valido.

(Ver instrucción BRA para más detalles de la ejecución de salto).

Registro de Códigos de condición (CCR)


No afectados.

Mnemónico: BVC(rel)

BVS
Salta si la bandera de sobreflujo esta activada

Operación: PC ← (PC) + 0002 + Rel

Descripción: Revisa el estado del bit V en el registro código de condición y causa un


salto si dicho bit, esta activado.
Esta instrucción se usa después de una operación en valores binarios con
complemento a dos, puede causar un salto(sí ocurrió un sobreflujo). De
modo que salta si el resultado del complemento a dos, es invalido.

(Ver instrucción BRA para más detalles de la ejecución de salto).

Registro de Códigos de condición (CCR)


No afectados.

Mnemónico: BVS(rel)

93
DL3155M24HC11

CBA
Comparación entre acumuladores

Operación: (ACCA) -- (ACCB)

Descripción: Compara el contenido de ACCA al contenido de ACCB y activa el código de


condición, el cual es usado para saltos condicionales con operaciones
aritméticas y lógicas. Ninguno de los operandos es afectado.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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ónicos: CBA

CLC
Borra el acarreo

Operación: C bit ← 0

Descripción: Borra el bit C en el registro código de condición

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — — — — 0

C=1 Si hubo un acarreo desde el bit más significativo del resultado, 0


en otro caso.

Mnemónicos: CLC

94
DL3155M24HC11

CLI
Borra la mascara de interrupción

Operación: I bit ← 0

Descripción: Borra el bit mascara de interrupciones, del registro código de condición.


Cuando el bit I es borrado, las interrupciones se habilitan.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — 0 — — — —

I=0

Mnemónicos: CLI

CLR
Borrado

Operación: (ACCX) ← 00
M ← 00

Descripción: El contenido de ACCX o de M es reemplazado por ceros

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 1 0 0

N=0 Borrado
Z=1 Activado
V=0 Borrado
C=0 Borrado

Mnemónicos: CLRA, CLRB, CLR(opr)

95
DL3155M24HC11

CLV
Borra el bit de sobreflujo en complemento a dos

Operación: V bit ← 0

Descripción: Borra el bit de sobreflujo en complemento a dos del registro código de


condición.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — — — 0 —

V=0

Mnemónicos: CLV

CMP
Compara

Operación: (ACCX) -- (M)

Descripción: Compara el contenido de ACCX o el contenido de M, determina los códigos


y el valor de las banderas, estableciendo las condiciones lógicas y
aritméticas de salto condicional. Ninguno de los operandos es afectado.
Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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 : CMPA(opr); CMPB (opr)

96
DL3155M24HC11

COM
Complementa

Operación: ACCX ← ¬ (ACCX) = FF - (ACCX)


M ← ¬ (M) = FF - (M)

Descripción: Reemplaza el contenido de ACCX o M con complemento a uno. (Cada bit


del contenido de ACCX o M es remplazado con el complemento de ese bit)

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 1

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0
C=1

Mnemónicos: COMA, COMB, COM (opr)

CPD
Compara acumulador - D

Operación: (ACCX) -- (M: M+1)

Descripción: Compara el contenido del acumulador D con un valor de 16 bits, de la


dirección especificada. Activa el código de condición en correspondiente.
La operación es realizada internamente al hacer una resta de (M:M+1) desde
el acumulador, sin modificar el acumulador D o (M:M+1).
Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.

97
DL3155M24HC11

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ónicos: CPD (opr)

CPX
Compara el registro índice X

Operación: (IX) -- (M:M+1)

Descripción: Compara el contenido del registro índice X con un valor de 16 bits en la


dirección especificada y activa el código de condición correspondiente. La
comparación se realiza internamente al restar (M: M+1) del registro índice X,
sin modificar alguno de los operandos.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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ónicos: CPX (opr)

98
DL3155M24HC11

CPY
Compara el registro índice Y

Operación: (IY) -- (M:M+1)

Descripción: Compara el contenido del registro índice Y con un valor de 16 bits en la


dirección especificada y activa el código de condición correspondiente. La
comparación se realiza internamente al restar (M: M+1) del registro índice Y,
sin modificar alguno de los operandos.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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ónicos: CPY (opr)

DAA
Ajuste decimal del ACCA

Operación: Suma números hexadecimales como 00, 06, 60 o 66 al acumulador, y activa


el bit de acarreo.
Mnemónico: DAA

99
DL3155M24HC11

BCD
(binary coded decimal). La tabla muestra los valores hexadecimales.

Descripción: Si el contenido de ACCA, el estado del bit C, acarreo/prestamo y el


semiacarreo del bit H, son el resultado de aplicar alguno de los operandos
ABA , ADD o ADC a operandos BCD, con o sin un acarreo inicial, la
operación DAA puede funcionar como sigue:
La operación DAA, sujeta a las condiciones de la tabla, ajustará el
contenido de ACCA y del bit C en el CCR para representar la suma BCD y el
correcto estado del bit C.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Se activa si el bit más significativo del resultado, se


encuentra activado; en cualquier otro caso es borrado.
Z=1 Se activa si todos los bits del resultado están borrados; se
limpia en cualquier otro caso.
V No definido
C=1: Se activa o se borra, de acuerdo a la misma regla, como si
DAA y un operando que precede inmediatamente ABA, ADD,
o ADC, fuesen remplazados por una adición BCD hipotética.

DEC
Decremento

Operación: (ACCX) ← (ACCX)−


− 01
M ← (M) − 01

Descripción: Resta uno de los contenidos de ACCX o de M.


Los bits N, Z y V en el CCR, se activan y deactivan de acuerdo a los
resultados de la operación.
El bit C en el CCR no es afectado por la oparación.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.

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.

Mnemónicos: DECA; DECB DEC(opr)

DES
Decremento del Stack Pointer

Operación: ← (SP) -- 0001


SP←

Descripción: Substrae un valor del stack pointer.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — — — — —

Mnemónico: DES

101
DL3155M24HC11

DEX
Decremento del registro índice X

Operación: ← (IX) -- 0001


IX←

Descripción: Substrae un valor del registro índice X.


Solo el bit "Z" es activado o borrado de acuerdo al resultado de la
operación.

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.

Mnemónico: DEX

DEY
Decremento del registro índice Y

Operación: ← (IY) -- 0001


IY←

Descripción: Substrae un valor del registro índice Y.


Solo el bit "Z" es activado o borrado de acuerdo al resultado de la
operación.

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.

Mnemónico: DEY

102
DL3155M24HC11

EOR
Operación de OR exclusiva.

Operación: ← (ACCX) ⊕ (M)


ACCX←

Descripción: Ejecuta la operación lógica de OR exclusiva, entre el contenido de ACCX y


el contenido de M, colocando el resultado en ACCX. (Cada bit de ACCX
llega a ser modificado por la operación y por el contenido correspondiente
de los bits de M).

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0

Mnemónico: EORA (opr), EORB(opr)

FDIV
División fraccional

Operación: (ACCX) / (IX); IX -- Cociente, ACCD -- residuo

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

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: FDIV

IDIV
División de enteros

Operación: (ACCX) / (IX); IX -- Cociente, ACCD -- residuo

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.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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: IDIV

104
DL3155M24HC11

INC
Incremento

Operación: ACCX ← (ACCX) + 01 ó


M ← (M) + 01

Descripción: Suma uno al contenido de ACCX o M.


Los códigos de condición N, Z y V se activan o borran de acuerdo al
resultado de esta operación.
El bit C no es afectado en esta operación.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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ónicos: INCA, INCB, INC (opr)

INS
Incremento del Stack Pointer

Operación: ← (SP) + 0001


SP←

Descripción: Suma un valor al stack pointer.

Registro de Códigos de condición (CCR)

No afectados

Mnemónico: INS

105
DL3155M24HC11

INX
Incremento del registro índice X

Operación: ← (IX) + 0001


IX←

Descripción: Suma uno al registro índice X.


Solo el bit "Z" es activado o borrado de acuerdo al resultado de la
operación.

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.

Mnemónico: INX

INY
Incremento del registro índice Y

Operación: ← (IY) + 0001


IY←

Descripción: Suma uno al registro índice Y.


Solo el bit "Z" es activado o borrado de acuerdo al resultado de la
operación.

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.

Mnemónico: INY

106
DL3155M24HC11

JMP
Salto

Operación: PC ← dirección efectiva

Descripción: Salto a la instrucción almacenada en la dirección efectiva. La dirección


efectiva es obtenida de acuerdo a las reglas de direccionamiento
extendido(EXT) o indexado(IND).

Registro de Códigos de condición (CCR)

No afectados

Mnemónico: JMP(opr)

JSR
Salto a subrutina

Operación: PC ← (PC) + 0003 (para direccionamiento EXT o IND Y)


PC ← (PC) + 0002 (para direccionamiento DIR o IND X)
↓ (PCL)
SP←← (SP) - 0001
↓ (PCH)
SP ← (SP) - 0001
PC ← dirección efectiva

Descripción: El contador de programa es incrementado en 3 ó 2, dependiendo del modo


de direccionamiento y es entonces colocado en la pila, 8 bits a la vez,
primero, el byte menos significativo. El stack pointer apunta a la siguiente
dirección vacía de la pila. El salto ocurre a la instrucción almacenada en la
dirección efectiva. La dirección efectiva es obtenida de acuerdo a las reglas
de direccionamiento IND, DIR, EXT.

Registro de Códigos de condición (CCR)

No afectados

Mnemónico: JSR(opr)

107
DL3155M24HC11

LDA
Carga el acumulador

Operación: ACCX ← (M)

Descripción: Carga el contenido de la memoria al acumulador. Los códigos de condición


son activados de acuerdo al dato.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0

Mnemónico: LDAA(opr), LDAB(opr)

LDD
Carga el acumulador doble

Operación: ACCD ← (M : M + 1); ACCA ← (M), ACCB ← (M + 1);

Descripción: Carga el contenido de la localidad de memoria M y M + 1 dentro del


acumulador D. Los códigos de condición, son activados de acuerdo al dato.
La información de la localidad M es cargada al acumulador A y la
información de M + 1 se carga en B.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0

Mnemónico: LDD(opr)

108
DL3155M24HC11

LDS
Carga el Stack Pointer

Operación: SPH ← (M)


SPL ← (M + 1);

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.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0

Mnemónico: LDS(opr)

LDX
Carga el registro índice X

Operación: IXH ← (M)


IXL ← (M + 1);

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.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.

109
DL3155M24HC11

V=0

Mnemónico: LDX(opr)

LDY
Carga el registro índice Y

Operación: IYH ← (M)


IYL ← (M + 1);

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.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0

Mnemónico: LDY(opr)

110
DL3155M24HC11

LSL
Corrimiento lógico a la izquierda
(Igual que ASL)

Operación:

Descripción: Corrimiento de todos los bits de ACCX o M, una posición a la izquierda. El


bit 0 se carga con un "0". El bit "C", es cargado desde el bit más
significativo de ACCX o M.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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.

Desde fuente: LSLA; LSLB; LSL (opr)

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
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro

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:

Descripción: Corrimiento de todos los bits de ACCX o M, una posición a la derecha. El


bit 7 es cargado con "0". El bit C, es cargado desde el bit menos
significativo de ACCX o M.
Registro de Códigos de condición (CCR)

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.

Mnemónico: LSRA; LSRB; LSR(opr)

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

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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: LSRD

MUL
Multiplicación sin signo

Operación: ACCD ← ACCA * ACCB

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.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — — — —

C=1 Si hubo un acarreo desde el bit más significativo del resultado, 0


en otro caso.

Mnemónico: MUL

113
DL3155M24HC11

NEG
Negación

Operación: ACCX ← - (ACCX) = 00 – (ACCX)


M ← - (M) = 00 – (M)

Descripción: Remplaza el contenido de ACCX o M con complemento a dos. Note que el


valor $80 no cambia.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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: NEGA; NEGB, NEG(opr)

NOP
No-operación

Descripción: Esta es una instrucción de un solo byte, que únicamente causa un


incremento en el contador de programa. Los registros no son afectados.

Registro de Códigos de condición (CCR)


No afectados.

S X H I N Z V C
— — — — — — — —

A. Mnemónico: NOP

114
DL3155M24HC11

ORA
Operación OR inclusiva

Operación: ACCX ← (ACCX) + (M)

Descripción: Ejecuta la operación OR inclusiva, entre el contenido de ACCX y el


contenido de M, colocando el resultado en ACCX. (Cada bit de ACCX será
afectado por la operación OR inclusiva del correspondiente bit de M y
ACCX).

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0 .

Mnemónico : ORAA (opr); ORAB (opr)

PSH
Coloca datos en la pila

Operación: ↓ (ACCX)
SP ← (SP) - 0001

Descripción: El contenido de ACCX, es almacenado sobre la pila en la dirección


contenida del stack pointer. El stack pointer, es decrementado.

Registro de Códigos de condición (CCR)

No afectados.

B. Mnemónico: PSHA, PSHB

115
DL3155M24HC11

PSHX
Coloca el registro índice X en la pila
Operación: ↓ (IXL), SP ← (SP) – 0001
↓ (IXH), SP ← (SP) - 0001

Descripción: El contenido del registro índice X, es colocado en la pila (primero el byte de


orden bajo) en la dirección contenida del stack pointer. El stack pointer, es
decrementado dos veces.

Registro de Códigos de condición (CCR)


No afectados.

C. Mnemónico: PSHX

PSHY
Coloca el registro índice Y en la pila
Operación: ↓ (IYL), SP ← (SP) – 0001
↓ (IYH), SP ← (SP) - 0001

Descripción: El contenido del registro índice Y, es colocado en la pila (primero el byte de


orden bajo) en la dirección contenida del stack pointer. El stack pointer, es
decrementado dos veces.

Registro de Códigos de condición (CCR)


No afectados.

D. Mnemónico: PSHY

116
DL3155M24HC11

PUL
Extrae datos de la pila
Operación: SP ← (SP) + 0001;
↑ ACCX

Descripción: El ACCX es cargado a la pila, en la dirección contenida del stack pointer. El


contenido del stack pointer es incrementado.

Registro de Códigos de condición (CCR)


No afectados.

E. Mnemónico: PULA, PULB.

PULX
Extrae el registro índice X de la pila
Operación: SP ← (SP) + 0001; ↑ (IXL),
SP ← (SP) + 0001; ↑ (IXH),

Descripción: El contenido del registro índice X, es extraído de la pila (primero el byte de


orden alto) en la dirección contenida del stack pointer + 1. El stack pointer,
se incrementa dos veces.

Registro de Códigos de condición (CCR)


No afectados.

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,

Descripción: El contenido del registro índice Y, es extraído de la pila (primero el byte de


orden alto) en la dirección contenida del stack pointer + 1. El stack pointer,
es incrementado dos veces.

Registro de Códigos de condición (CCR)


No afectados.

G. Mnemónico: PULY

ROL
Rota a la izquierda.

Operación:

Descripción: Corrimiento de todos los bits de ACCX o M, una posición a la izquierda. El


bit 0 se carga con "C", en donde "C" es el bit más significativo de ACCX o
M.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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.

Desde fuente: ROLA; ROLB; ROL(opr)

118
DL3155M24HC11

ROR
Rota 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 se carga con "C". El bit C, es el bit menos significativo de ACCX o M.
Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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: RORA; RORB; ROR(opr)

119
DL3155M24HC11

RTI
Regreso de interrupciones.

Operación: SP ← (SP) + 0001, ↑ CCR


SP ← (SP) + 0001, ↑ ACCB
SP ← (SP) + 0001, ↑ ACCA
SP ← (SP) + 0001, ↑ IXH
SP ← (SP) + 0001, ↑ IXL
SP ← (SP) + 0001, ↑ IYH
SP ← (SP) + 0001, ↑ IYL
SP ← (SP) + 0001, ↑ PCH
SP ← (SP) + 0001, ↑ PCL

Descripción: El código de condición, los acumuladores A y B, el registro índice X, el


registro índice Y, y el contador de programa, pueden ser restaurados a un
estado de extracción desde la pila. Nota que el bit "X" en el registro código
de condición puede ser borrado como resultado de la instrucción RTI, pero
no puede activarse si fue borrado antes de la ejecución de la instrucción
RTI.
Registro de Códigos de condición (CCR)

Restaurados a su estado de extracción desde la pila.


Mnemónico: RTI

RTS
Regreso de subrutina

Operación: SP ← (SP) + 0001


↑ PCH
SP ← (SP) + 0001
↑ PCL

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.

Registro de Códigos de condición (CCR)

No afectados
Mnemónico: RTS

120
DL3155M24HC11

SBA
Resta entre acumuladores
Operación: (ACCA) ← (ACCA) - (ACCB)

Descripción: Substracción entre los contenidos de ACCB, y ACCA colocando el


resultado en ACCA. El contenido de ACCB no es afectado.
Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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: SBA

SBC
Resta con acarreo

Operación: (ACCX) ← (ACCX) -- (M) - (C)

Descripción: Substrae el contenido de M y el contenido de C desde lo contenido en


ACCX y coloca el resultado en ACCX.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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 : SBCA(opr); SBCB (opr)

121
DL3155M24HC11

SEC
Activa el acarreo

Operación: Bit C ← 1

Descripción: Activa el bit "C" en el registro código de condición.

Registro de Códigos de condición (CCR)

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

Descripción: Activa el bit "I", de mascara de interrupciones, en el registro código de


condición. Cuando el bit "I" es activado, todas las interrupciones
mascarables son inhibidas y el MPU reconocerá solo las fuentes de
interrupciones no mascarables o un SWI.

Registro de Códigos de condición (CCR)

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.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — — — 1 —

V=1

Mnemónico: SEV

STA
Almacena el acumulador

Operación: M ← (ACCX)

Descripción: Almacena el contenido de ACCX en memoria. El contenido de ACCX


permanece sin cambio.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0 .

Mnemónico: STAA(opr), STAB(opr)

123
DL3155M24HC11

STD
Almacena el acumulador doble

Operación: M : M + 1 ← (ACCD)

Descripción: Almacena el contenido del acumulador doble ACCD en memoria. El


contenido de ACCD permanece sin cambio.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0

Mnemónico: STD(opr)

STOP
Detiene el proceso

Descripción: Si el bit "S", en el CCR es activado, entonces la instrucción STOP es


deshabilitada y funciona como instrucción de NOP. Si y solo si, el bit S en
el CCR es borrado, la instrucción STOP causa que todos los sistemas de
reloj sean alterados y el sistema sea colocado a potencia mínima, modo de
espera (standby mode). Todos los registros del CPU permanecen sin
cambio, así como los pins de I/O, permanecen sin ser afectados.

Para restablecerse después de una instrucción STOP, se puede utilizar el


Reset, XIRQ, o una IRQ no mascarable. Cuando se utiliza XIRQ y el bit X en
el CCR es borrado, la ejecución puede resumirse como operaciones
apiladas para la interrupción XIRQ. Si el bit X esta activado, la ejecución de
la interrupción XIRQ mascarable, se puede resumir con el opcode de
búsqueda para la instrucción que sigue la instrucción STOP (continue).
Registro de Códigos de condición (CCR)

No afectados

Mnemónico: STOP

124
DL3155M24HC11

STS
Almacena el stack pointer
Operación: M ← (SPH)
← (SPL)
M + 1←

Descripción: Almacena el byte más significativo del stack pointer, en la dirección de


memoria M, especificada por el programa. También almacena el byte menos
significativo del stack pointer, en la dirección de memoria, de la siguiente
localidad especificada por el programa.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0 .

Mnemónico: STS(opr)

STX
Almacena el registro índice X
Operación: M ← (IXH)
← (IXL)
M + 1←

Descripción: Almacena el byte más significativo del registro índice X, en la dirección de


memoria M, especificada por el programa y almacena el byte menos
significativo del registro índice X, en la dirección de memoria, de la
siguiente localidad especificada por el programa.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0

Mnemónico: STX(opr)

125
DL3155M24HC11

STY
Almacena el registro índice Y
Operación: M ← (IYH)
← (IYL)
M + 1←

Descripción: Almacena el byte más significativo del registro índice Y, en la dirección de


memoria M, especificada por el programa y almacena el byte menos
significativo del registro índice Y, en la dirección de memoria, de la
siguiente localidad especificada por el programa.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0 .

Mnemónico: STY(opr)

SUB
Substracción.
Operación: (ACCX) ← (ACCX) -- (M)

Descripción: Substrae el contenido de M y del contenido de ACCX, colocando el


resultado en ACCX.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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 : SUBA(opr); SUBB (opr)

126
DL3155M24HC11

SUBD
Substracción del acumulador "D", doble

Operación: (ACCD) ← (ACCD) -- (M: M+1)

Descripción: Realiza la substracción de M:M+1 desde el acumulador D y coloca el


resultado en ACCD.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


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ónicos: SUBD (opr)

SWI
Interrupción por software

Operación: PC ← (PC) + 0001


↓ (PCL), SP ← (SP) -- 0001
↓ (PCH), SP ← (SP) -- 0001
↓ (IYL), SP ← (SP) -- 0001
↓ (IYH), SP ← (SP) -- 0001
↓ (IXL), SP ← (SP) -- 0001
↓ (IXH), SP ← (SP) -- 0001
↓ (ACCA), SP ← (SP) -- 0001
↓ (ACCB), SP ← (SP) -- 0001
↓ (CCR), SP ← (SP) -- 0001
I← 1
PC ← (vector SWI)

Descripción: El contador de programa es incrementado una vez. El contador de


programa, el registro índice Y, el registro índice X, y los acumuladores A y
B son colocados dentro de la pila. El stack pointer es decrementado en 1,
después que cada byte es almacenado en la pila.

127
DL3155M24HC11

El bit "I" en el CCR esta activado. El contador de programa se carga con el


vector(dirección) y la ejecución de la instrucción se resume en esta
localidad.
Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — 1 — — — —

I=1

Mnemónico: SWI

TAB
Transferencia del acumulador A, al acumulador B

Operación: ACCB ← (ACCA)

Descripción: Mueve el contenido de ACCA a ACCB. El contenido previo de ACCB se


pierde, mientras el de ACCA no es afectado.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0

Mnemónico : TAB

128
DL3155M24HC11

TAP
Transferencia del acumulador A, al registro código de condición

Operación: CCR ← (ACCA)

7 6 5 4 3 2 1 0
ACCA

S X H I N Z V C CCR

Acarreo o préstamo de MSB

Sobreflujo

Zero

Negativo

Mascara de interrupción- I
Medio acarreo o semiacarreo (del
bit 3)

Mascara de interrupción X

Paro deshabilitado

Descripción: Transfiere el contenido del acumulador del bit 0 a 7, a su correspondiente


bit en el registro código de condición. El contenido del acumulador A
permanece sin cambio. Nota: el bit X, en el registro código de condición
puede ser borrado como el resultado de la instrucción TAP, pero puede no
activarse sí antes de la ejecución de TAP, fue borrado.

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

Operación: ACCA ← (ACCB)

Descripción: Mueve el contenido de ACCB a ACCA. El contenido previo de ACCA se


pierde, mientras el de ACCB no es afectado.

Registro de Códigos de condición (CCR)

S X H I N Z V C
— — — — 0 —

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=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.

Registro de Códigos de condición (CCR)

No afectados.

Mnemónico: TEST

130
DL3155M24HC11

TPA
Transferencia del registro código de condición, hacia el acumulador A

Operación: ACCA ← (CCR)

7 6 5 4 3 2 1 0
ACCA

S X H I N Z V C CCR

Acarreo o préstamo de MSB

Sobreflujo

Zero

Negativo

Mascara de interrupción- I
Medio acarreo o semiacarreo (del
bit 3)

Mascara de interrupción X

Paro deshabilitado

Descripción: Transfiere el contenido del registro código de condición, a su


correspondiente bit en el acumulador A. El registro código de condición
permanece sin cambio.

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

N=1 Si el bit más significativo del resultado, es 1; 0 en cualquier otro


caso.
Z=1 Si todos los bits del resultado es 00; 0 en cualquier otro caso.
V=0
C=0 .

Mnemónico: TSTA, TSTB, TST(opr)

TSX
Transferencia del stack pointer al registro índice X

Operación IX ← (SP) + 0001

Descripción: Carga el registro índice X, con el stack pointer más uno. El contenido del
stack permanece sin cambio.

Registro de Códigos de condición (CCR)

No afectados.

Mnemónico: TSX

132
DL3155M24HC11

TSY
Transferencia del stack pointer al registro índice Y

Operación IY ← (SP) + 0001

Descripción: Carga el registro índice Y, con el stack pointer más uno. El contenido del
stack permanece sin cambio.

Registro de Códigos de condición (CCR)

No afectados.

Mnemónico: TSY

TXS
Transferencia del registro índice X, al stack pointer

Operación SP ← (IX) -- 0001

Descripción: Carga el stack pointer con el registro índice X, menos uno. El contenido del
registro índice X, permanece sin cambio.

Registro de Códigos de condición (CCR)

No afectados.

Mnemónico: TXS

TYS
Transferencia del registro índice Y, al stack pointer

Operación SP ← (IY) -- 0001

Descripción: Carga el stack pointer con el registro índice Y, menos uno. El contenido del
registro índice Y, permanece sin cambio.

Registro de Códigos de condición (CCR)

No afectados.

Mnemónico: TYS

133
DL3155M24HC11

WAI
Espera para interrupción

Operación: PC ← (PC) + 0001


↓ (PCL), SP ← (SP) -- 0001
↓ (PCH), SP ← (SP) -- 0001
↓ (IYL), SP ← (SP) -- 0001
↓ (IYH), SP ← (SP) -- 0001
↓ (IXL), SP ← (SP) -- 0001
↓ (IXH), SP ← (SP) -- 0001
↓ (ACCA), SP ← (SP) -- 0001
↓ (ACCB), SP ← (SP) -- 0001
↓ (CCR), SP ← (SP) -- 0001

Descripción: El contador de programa se incrementa en uno. Los acumuladores A y B, el


registro índice Y, el registro índice X y el contador de programa, son
colocados dentro de la pila, así como, el registro código de condición.
El stack pointer es decrementado en uno, y después cada byte de datos es
almacenado en la pila.
El MPU entonces entra a un estado de espera para un número entero de
ciclos E-clock del MPU. Mientras, en el estado de espera, el bus de
direcciones es $FFFF. El MPU deja el estado de espera cuando censa una
interrupción, la cual no ha sido mascarada.
Después del estado de espera, el MPU activa el bit "I" en el CCR, busca el
vector(dirección) correspondiente a la interrupción censada, y la ejecución
de instrucciones continua en esta localización.
Registro de Códigos de condición (CCR)

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

Operación: (IX) ⇔ (ACCD)

Descripción: Intercambia el contenido del acumulador "D" con el contenido del registro
índice X.

Registro de Códigos de condición (CCR)

No afectados.

Mnemónico: XGDX

XGDY
Intercambio entre el acumulador "D" y el registro índice Y

Operación: (IY) ⇔ (ACCD)

Descripción: Intercambia el contenido del acumulador "D" con el contenido del registro
índice Y.

Registro de Códigos de condición (CCR)

No afectados.

Mnemónico: XGDY

135
DL3155M24HC11

TABLA DE CARACTERES ASCII


HEX (MS, LS)

CARACTERES ASCII (código de 7 bits)


MS 0 1 2 3 4 5 6 7
LS
0 NUL DLE SP 0 @ P ` p
1 SOH DC1 ! 1 A Q a q
2 STX DC2 " 2 B R b r
3 ETX DC3 # 3 C S c s
4 EOT DC4 $ 4 D T d t
5 ENQ NAK % 5 E U e u
6 ACK SYN & 6 F V f v
7 BEL ETB ' 7 G W g w
8 BS CAN ( 8 H X h x
9 HT EM ) 9 I Y i y
A LF SUB * : J Z j z
B VT ESC + ; K [ k {
C FF FS , < L \ l |
D CR GS - = M ] m }
E SO RS . > N ^ n ~
F SI US / ? O _ o DEL

136
DL3155M24HC11

CONVERSIÓN DECIMAL Y HEXADECIMAL.

Como usarse.

Conversión a decimal: Encuentre él numero correspondiente, comenzando con el carácter


hexadecimal menos significativo, la posición de los bits y el tamaño de la palabra,
facilitan la conversión. La suma total de cada valor decimal encontrado es el
proporcional al hexadecimal.

Conversión a hexadecimal: La conversión inicia buscando el numero correspondiente que


será menor o igual al número decimal a convertir, considerando que el carácter
hexadecimal es el más significativo. Reste el valor decimal encontrado, de él número a
ser convertido. Con la diferencia repita el proceso para encontrar el carácter hexadecimal
subsiguiente(respete el orden y la posición de cada byte).

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

4.2 OPERACIONES CON LA PILA

141
DL3155M24HC11

4.1 INTRODUCCION

En unidades previas usted fue introducido a la arquitectura y al conjunto de instrucciones del


microprocesador 68HC11. Se discutieron muchas de las capacidades de la MPU; sin embargo,
fueron omitidas algunas áreas importantes. Entre esas se incluyen las operaciones con la pila,
el uso de subrutinas, entrada/salida y capacidades de interrupción.

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

4.2 OPERACIONES CON LA PILA


En el lenguaje común de las computadoras, una pila es un grupo de localidades de
almacenamiento temporal en las cuales pueden almacenarse datos para ser recuperados
después. Desde este punto de vista, una pila es como una memoria. De hecho, muchos
microprocesadores usan una sección de la memoria como pila. La diferencia entre una pila y
otras formas de memoria es el método por el cual sé accesa a los datos y se direcciona. La
discusión comenzará considerando un arreglo de pila sencillo usado en algunos
microprocesadores. Después se discutirá un arreglo de pila más sofisticado empleado por la
MPU 68HC11.

H. Pila en cascada

Algunos microprocesadores tienen un grupo especial de registros


(usualmente 8 o 16) llamado pila en cascada. Cada registro puede
retener un dato de un byte. Puesto que estos registros forman parte del
chip del MPU, conforman unas localidades de almacenamiento
HACIA/DESDE EL
temporal excelentes. Si necesitamos liberar el acumulador por alguna
ACUMULADOR razón, podemos almacenar su contenido en la pila. Posteriormente, si
se requiere ese dato nuevamente, lo podremos recuperar de la pila.
Claro que pudimos liberar el acumulador guardando el dato en
TOPE DE LA PILA O STACK

memoria. ¿Cuál es, entonces, la ventaja de la pila?

Una ventaja de la pila, es la forma en que es accesada o direccionada.


Recuerde que para almacenar un byte en memoria, se requiere una
dirección. Esto representa una instrucción de 2 o 3 bytes para
almacenar el contenido del acumulador. Dependiendo del modo de
direccionamiento, el último o los últimos dos bytes son la dirección. Más
8 REGISTROS DE LA PILA

tarde, si se recupera el byte, se emplea otra instrucción que también


tiene una dirección.

Otra ventaja de la pila es que los datos pueden ser almacenados o


leídos con instrucciones de un solo byte. Es decir , las instrucciones
usadas con la pila no requieren dirección. Por lo tanto, se trata de
instrucciones de un solo byte.

La Figura 4-1 muestra una pila de 8 registros similar a la que se


encuentra en algunos microprocesadores. Esta se llama pila en
cascada, por el hecho de que los datos son cargados y recuperados.
Todas las transferencias de datos se hacen entre el tope de la pila y el
acumulador. Esto es, el acumulador se comunica sólo con la localidad
tope de la pila. Los datos son transferidos a la pila con una instrucción
especial llamada PUSH.
Fig .4-1. 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.

Fig. 4-2 Recorriendo datos hacia dentro de la pila

144
DL3155M24HC11

La Instrucción PULL.

La MPU recupera datos de la pila usando la instrucción PULL. En algunos microprocesadores,


esta se le conoce como la instrucción POP.

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).

Fig. 4-3. Extrayendo datos desde la pila.

145
DL3155M24HC11

Recuerde que es un byte previo de 18 para la instrucción PULY

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.

La pila en cascada, considerada antes, generalmente no requiere un apuntador de pila. La cima


de la pila se determina por hardware. Durante las operaciones de colocar y extraer, los bytes de
datos se mueven de un registro a otro. Esto es, la cima de la pila permanece estacionaria y los
datos se mueven hacia arriba o abajo con relación a 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.

Generalmente, cuando se planea un sistema basado en microprocesador, se reserva una


sección de RAM para la pila. Esta debiera ser una sección de RAM que no sea empleada para
cualquier otro propósito.

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.

Fig. 4-4 Ejecutando la instrucción PSHA

Si usted revisa el Apéndice A o la Programming Reference Guide, verá que la operación se


describe como sigue:

A à Stk, SP = SP – 1

Esto significa que el contenido del acumulador A es transferido a la localidad de memoria


especificada por el apuntador de pila. También, el contenido del apuntador de pila es
reemplazado por el contenido previo del apuntador de pila menos uno. En otras palabras,
después que tiene lugar la transferencia acumulador-a-pila, el apuntador de pila es
decrementado en uno.

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.

La ejecución de las instrucciones PSHX y PSHY es similar a las referidas al acumulador


excepto que el contenido del registro índice es colocado en la pila. Recuerde que los registros
índice son registros de 16 bits. Esto causa que, cuando PSHX o PSHY es ejecutado, el byte de
orden bajo, sea colocado en la pila (en la dirección contenida en el apuntador de pila) primero.
Entonces, el apuntador de pila es decrementado en dos. Estas operaciones son resumidas por
el registro IX como sigue:
IX à Stk, SP = SP – 2
IY à Stk, SP = SP – 2

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.

Fig. 4-5. Ejecutando la instrucción PSHB

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

localidad de memoria designada por el apuntador de pila es transferido al acumulador A. Así,


BB16 va al acumulador A. Note que el apuntador de pila es incrementado antes que el byte sea
retirado de la pila.

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

Fig. 4-6 Ejecutando la instrucción PULL

La función de las instrucciones PULX y PULY es similar a la de las instrucciones PULA/PULB


discutidas anteriormente, sin embargo, el dato es extraído (primero el byte de orden alto) y
cargado en el registro índice. Esto comienza en la dirección contenida en el apuntador de pila
+ 1. El apuntador de pila es incrementado en 2. Estas operaciones pueden ser expresadas
simbólicamente:
SP = SP + 2, IX ß Stk
SP = SP + 2, IY ß Stk
Recuerde que hay un pre byte de 18 para la instrucción PULY.

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.

Las 8 instrucciones restantes están enfocadas a operaciones de pila relativamente sencillas.


Muchas de ellas han sido discutidas o sé explican ellas misma. Estas incluyen a INS, que
incrementa en uno el apuntador de pila; DES para decrementarlo; LDS, que carga el apuntador
de pila desde dos direcciones de memoria consecutivas; TSX y TSY, que cargan el registro
índice especificado con el contenido del apuntador de pila más uno; y TXS y TYS que cargan el
apuntador de pila con el contenido del registro índice especificado menos uno. La Figura 4-7
resume estas instrucciones. Las instrucciones PUSH y POP son listadas con las Operaciones
del Acumulador y la Memoria. Aquellas instrucciones que afectan al apuntador de pila son
listadas con las Operaciones del Registro Indice y Apuntador de Pila. Como con otras
instrucciones, usted se familiarizará y adquirirá soltura en el uso de ellas a través del estudio y
la práctica.

MODOS DE DIRECIONAMIENTO

Fig. 4-7 Instrucciones de pila y apuntador de pila

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.

DIRECCION CONTENIDO CONTENIDO HEX/. COMENTARIOS


HEX. HEX. MNEMONICO
0020 8E LDS #
Carga el apuntador de pila o stack pointer inmediatamente con la
0021 01 01
FF dirección de la nueva entrada en la nueva lista
0022 FF
0023 CE LDX #
Cargar el registro indexado inmediatamente con la dirección de la
0024 00 00
ultima entrada en la lista original
0025 1F 1F
0026 A6 LDAA, X
Carga el acumulador A, indexado desde la lista original.
0027 00 00
0028 36 PSHA Coloca el contenido del acumulador A, en la nueva lista
0029 09 DEX Decrementa el registro indexado
002A 8C CPX #
Compara el contenido del registro indexado con una dirección
002B 00 00
0F menos que la de la primer entrada en la lista original.
002C 0F
002D 26 BNE
De lo contrario salta hacia atrás.
002E F7 F7
002F CF STOP Paro

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.

Enseguida, el acumulador A se carga usando direccionamiento indexado. Ya que la


compensación de dirección es 0016, el acumulador se carga con el contenido de 001F16. Esto
es, la última entrada en la lista original, es cargada al acumulador A.

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.

El registro índice es decrementado a 001E16 por la siguiente instrucción. Entonces, la


instrucción CPX compara el registro índice con 000F16 para ver si todas las entradas de la lista
han sido trasladadas. Si no son iguales, la MPU bifurca o salta hacia atrás y toma la siguiente
entrada de la lista. El lazo se repite una y otra vez hasta que la lista entera se transfiere a su
nueva localidad.

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

5.1 OPERACIONES DE ENTRADA SALIDA

5.2 RESETS E INTERRUPCIONES

154
DL3155M24HC11

5.1 OPERACIONES DE ENTRADA-SALIDA (I/O).

Un sistema microprocesador, es más funcional cuando acepta datos desde exterior,


procesándolos en alguna sección, y presentando los resultados hacia fuera del micro. Los
dispositivos de entrada pueden no ser más que un grupo de interruptores; así como los
dispositivos de salida pueden ser tan simples como un grupo de lamparas indicadoras. Un
simple microprocesador maneja diversos dispositivos como: teleimpresores, impresoras,
maquinas etc. El punto es que, los requerimientos de I/O, pueden variar considerablemente de
una aplicación a otra. Esta sección esta enfocada a operaciones de I/O e interfaces

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

-Fig. 5-1. Entradas y salidas para una microcomputadora

El address decoder, monitorea el bus de direcciones y habilita la circuitería de la interfaz para


un dispositivo particular, solo si la dirección apropiada se detecta. Esto previene al dispositivo
I/O particular, de una interferencia cuando el dato es transferido entre la memoria y el MPU. El
address decoder también previene a los diferentes dispositivos I/O, de interferencia mutua.

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).

Fig. 5-2. Circuito simplificado de salida

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.

Fig. 5-3. Circuito simplificado de entrada

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.

En otro caso, la dirección 800016 es colocada en la línea de dirección. El address decoder


reconoce estas direcciones y habilita el buffer. Por un breve intervalo de tiempo (típicamente

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".

Si cargamos un dato en uno de los acumuladores de dirección 800016 y después almacenamos


el dato en la dirección 9000 16, los interruptores parecerán el control de los LED’s. El programa
podrá verlos así:

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

tenemos porque tocar el hardware. En su lugar, cambiaremos el programa. El nuevo programa


será:

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.

PROGRAMA CONTROL DE OPERACIONES I/O

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.

El programa debe estar en un ciclo, revisando continuamente la estrada y actualizará la salida.


Como el número de datos manipulados crece, el ciclo se hace más largo y por tanto el MPU
revisará las entradas con menos frecuencia. Cuando diversos dispositivos de I/O son usados,
se debe revisar cada entrada y actualizar cada salida repetidamente. Si el ciclo se hace más
largo, el MPU puede perder momentáneamente los cambios en el interruptor. Esto es aceptable
en algunas aplicaciones pero en muchas otras puede ser intolerado.
Obviamente entonces, un método más sofisticado de manejo de operaciones I/O deberá estar
disponible para el microprocesador.

161
DL3155M24HC11

CONTROL DE INTERRUPCIONES EN OPERACIONES I/O.

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.

Las interrupciones de microprocesador pueden ser de hardware o software. Mientras más


operaciones I/O se usan generalmente, interrupciones de hardware, la instrucción SWI del
68HC11 puede generar una interrupción por software (detalle explicado más adelante).

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

5.2 RESETS E INTERRUPCIONES.


Las interrupciones fueron introducidas en la sección previa en conexión a las operaciones I/O.
Mientras que las operaciones I/O usan parte de la capacidad de las interrupciones del MPU, las
interrupciones son también usadas en otros ámbitos. Cinco tipos diferentes de reset´s e
interrupciones del 68HC11 serán consideradas.

RESET
Interrupción Pseudo Non-Maskable XIRQ
Petición de interupción(Interrupt Request) IRQ
Interrupción de software (SWI)
IIlegal Opcode Trap

En esta sección se examinara cada una de estas interrupciones en detalle.

REINICIALIZAR

En una aplicación típica, el microprocesador tiene un control o programa monitor en una


memoria de solo lectura (ROM). Además una memoria de acceso aleatorio(RAM), que escribe y
lee, se usa para conservar datos de entrada, recibir información, respuestas intermedias, datos
de salida, etc. Como hemos visto la MPU 68HC11 tiene la capacidad de direccionar arriba
65,53610 localidades de memoria. Muchas aplicaciones de microprocesadores no requieren de
mucha memoria. En algunas aplicaciones, el control del programa requiere menos que del
veinte por ciento de las localidades. La RAM puede ser usada en menos del diez por ciento.
Generalmente el monitor del programa es colocado en direcciones de memoria altas. La RAM
es usualmente dada en localidades bajas de memoria tal, que el modo de direccionamiento
directo sea usado. Los dispositivos I/O son dados en direcciones intermedias. Así, las
direcciones de memoria pueden colocarse como la Figura 5-4, lo muestra.

Fig. 5-4. Ejemplos de localidades de memoria en un sistema microcomputador

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.

Un vector de interrupción es simplemente una dirección que es cargada en el contador del


programa cuando una interrupción ocurre. La MPU dice cuando esta ejecutando un programa
especial llamando un servicio de rutinas de interrupción, o incluso interrupción manual.

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

Fig. 5-5. Asignación del vector de interrupción

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)

Carga el byte alto


del PC con el
contenido de
FFFE16

Carga el byte bajo Secuencia


del PC con el
contenido de reset de Interrupción
FFFF16

Ciclo
Inicio normal, ciclo de MPU Normal
búsqueda/ejecución

Figura 5-6. Secuencia reset de interrupció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.

La secuencia de reinicialización termina cambiando el MPU a éste ciclo de maquina normal de


busqueda-ejecución (fetch-execute). Así, la instrucción en la dirección C00016 es buscada y
ejecutada. Para este punto, todas las actividades del MPU son controladas por el programa.

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:

1. Un pin externo de 2%S%T,


2. Una señal reset de encendido(power-on).
3. Un reset por el watchdog timer, para una apropiada operación del sistema computador
(COP: Computer Operating Properly)
4. Un reset por el reloj monitor.

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

como un medio automático de un sistema de arranque. El circuito de encendido proporciona un


retardo (delay), 4064 ciclos de tiempo respecto a la primer operación del oscilador. El tiempo
del reset actual al encender para algún sistema microcomputador, depende de la frecuencia de
la salida E-clock, del micro. El tiempo de encendido reset de retardo(reset delay) puede ser
calculado como sigue:

TRD = 4064 ( 1/ fECK ) (7.1)

Donde: TRD es tiempo de reset delay en milisegundos (ms), y


FECK es la frecuencia de salida en MHz. del reloj 68HC11.

Sin embargo, por


FXTAL = 4fECK

Donde : fXTAL es la frecuencia del oscilador de cristal ( alimentado por los pines 7 y 8
del MPU 68HC11) en MHz.

La ecuación 7-1 puede ser presentada:


TRD = 16256 [ ( 1/f XTAL)]

Por ejemplo, para calcular el reset delay para el MPU 68HC11 con un f XTAL de 4 MHz.

TRD = 16256 x [1/(4 x 106)] = 4 ms.

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.

Situaciones parecidas pueden suceder en el sistema controlado por el microprocesador.


Algunas interrupciones pueden ser ignoradas por pocos segundos mientras el MPU esta
realizando otras tareas, a estas las llamamos interrupciones mascarables. Las que no se
pueden ignorar, no pueden ser mascarables. El diseñador decide que interrupciones serán
mascarables y cuales no, el MPU, esta provisto de ambos tipos de interrupciones. Las
mascarables serán las primeras en discutir, por ser las que el MPU maneja.

El Constitución física de circuito integrado (IC) 68HC11, en una versión de 52 líneas


conductoras, cuenta con una línea de control llamada, línea de interrupción no-mascarable. La
salida de esta línea es el pin 18. Designada la línea de interrupción 8)21, esta entrada
proporciona un medio para solicitar una interrupción no-mascarable, después del reset de
iniciación. Durante el reset, el bit X del registro código de condición es activado y alguna
interrupción (incluyendo 8)21), es mascarada hasta habilitar el software, usando la instrucción
TAP (Transfer from Acumulator A to CCR). Posteriormente, reset cuando el bit X (CCR) es
borrado, la interrupción 8)21 llega a ser efectivamente una interrupción no-mascarable. Esto
significa que, en términos de la lógica por prioridad de interrupción, 8)21 tiene una prioridad
mayor que cualquier fuente de interrupción mascarable por el bit "I". Después, siendo
habilitado, 8)21 no puede ser mascarada por software; sin embargo es mascarada durante el
reset, y recibe una interrupción sobre el pin 8)21. 8)21 es a veces conocido como línea de
"pseudo interrupción.

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.

La secuencia de interrupción no-mascarable se muestra en la figura 5-7. Una interrupción no-


mascarable inicia cuando la línea 8)21 va desde este estado alto al estado bajo. El MPU
finaliza la ejecución de la instrucción actual. Sin embargo antes, otra instrucción es buscada, el
MPU coloca el contenido de estos registros en la pila. Llamada que el stack pointer siempre
apunta al tope de la pila. Para este ejemplo se asume que el stack pointer siempre apunta al
tope de la pila y que el stack pointer ha sido activado por una instrucción cercana a la dirección
006A1 6.
XIRQ

no La actual
instrucción
finalizo?

si

Coloca los registros


dentro de la
Pila.

Activa el bit,
mascara de
interrupción (I)

Carga el byte alto


del PC con el
contenido de FFF416

Carga el byte bajo Secuencia


del PC con el
de Interrupción
contenido de
FFF516 No-mascarable

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.

La secuencia de eventos se ilustra en la figura 5-7; sucede automáticamente cuando una


secuencia de interrupción no-mascarable, inicia. La línea 8)21 da hardware externo, un
método para forzar un salto a subrutina. En este caso, la subrutina es un programa corto que
ejecuta alguna acción para dar atención por importancia a la interrupción (i.e una rutina servicio
de interrupción).

170
DL3155M24HC11

Instrucción retorno de Interrupción(RTI).

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.

El propósito de la rutina de servicio es dirigir la operación de la computadora para dar atención


de la interrupción. Típicamente, detecta primero cual dispositivo inicio la interrupción. Entonces,
así detectar la naturaleza de la interrupción. Finalmente, cual acción que se tomará para darle
atención a la interrupción. En muchos de los casos, la interrupción es una rutina natural y puede
ser fácilmente atendida. Sí es así, el MPU debe regresar al menú principal y continuar. Esto es
posible con una instrucción, llamada Retorno de interrupción (RTI, Return-From-Interrupt).

La figura 5-8 muestra el funcionamiento de la instrucción RTI. El programa principal ubicado en


la parte izquierda, mientras la rutina servicio de interrupción en la parte derecha. Asuma que la
señal de interrupción ocurre mientras la instrucción LDAB#, esta siendo ejecutada. El MPU
termina la instrucción y coloca todos los datos necesarios en la pila. Esta entonces salta a la
dirección determinada por el vector 8)21 en la dirección $FFF4 y FFF5. El contenido de estas
dos localidades determina la dirección de inicio de la rutina de servicio 8)21. Note que la ultima
instrucción en la rutina de servicio es la instrucción RTI. La instrucción regresa el control de
programa al punto en el que el MPU atendió la interrupción.
El estado previo del MPU fue preservado en la pila. La instrucción RTI causa que los
acumuladores, el contador de programa (PC), los registros índice y los registros códigos de
condición, sean cargados en la pila. Entonces, la misma información estuvo en la pila cuando
ocurre la interupciòn va fuera de la pila cuando la instrucción RTI es ejecutada.
DIRECCION
DETERMINADA POR
EL VECTOR 8)21,
EN FFF4 Y FFF5

INTERRUPCION NO-
MASCARABLE
(8)21)

Fig. 5-8 la instrucción RTI, control de retorno al programa principal


después de que una interrupción ha sido atendida

171
DL3155M24HC11

Petición de interrupción ())21 )

La petición de interrupción (interrupt request), es muy similar a la interrupción no-mascarable.


La principal diferencia radica en que )21 es mascarable.

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)

Carga el byte alto


del PC con el
contenido de FFF816

Carga el byte bajo


del PC con el
contenido de
FFF916

Ciclo MPU
Inicio normal, ciclo de Normal
búsqueda/ejecución

Fig. 5-9. Secuencia, petición de interrupció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

La dirección de la rutina de servicio )21, esta en las direcciones FFF816 y FFF916. El PC es


cargado desde estas direcciones. Entonces la siguiente instrucción a ejecutarse puede ser la
primera instrucción en la rutina de servicio de la petición de interrupción )21.

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.

Instrucciones para la mascara de interrupciones.

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.

Seguramente, no esperamos deshabilitar permanentemente la capacidad de interrupciones. Sin


embargo, una forma de habilitar la petición de interrupciones, es a través de la instrucción
"Clear -Interrupt-Mask" (Borrado de la mascara de interrupción). Es una instrucción de un byte y
su opcode es 0E16.

Mientras podemos deshabilitar o habilitar la línea petición de interrupciones con esta


instrucción, esto no afecta a la interrupción no-mascarable. Como su nombre lo indica, la
interrupción No-Mascarable, o línea 8)21, no puede ser deshabilitada por la bandera "I".

173
DL3155M24HC11

Instrucción Interrupción de Software (SWI)

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

Coloca los registros


dentro de la
Pila.

Activa el bit,
mascara de
interrupción (I)

Carga el byte alto


del PC con el
contenido de
FFFA16

Secuencia
Carga el byte bajo de Interrupción
del PC con el por Software
contenido de
FFFB16

Inicio normal, ciclo de Ciclo


búsqueda/ejecución MPU Normal

Fig. 5-10. Secuencia de interrupción por Software (SWI).

La instrucción Software de Interrupción puede emplearse para simular interrupciones por


hardware. Lo cual también ayuda para insertar pausas en un programa.

174
DL3155M24HC11

Illegal Opcode Trap

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.

Instrucción de espera para Interrupción (WAI)

Al ejecutarse la instrucción WAI (wait for Interrupt), el contador de programa es incrementado


en uno. Entonces el contenido del contador de programa, el registro índice, los acumuladores y
el CCR, son colocados en la pila. El orden es exactamente como ocurre la interrupción. El MPU
entra a un estado de espera (wait state), hasta que ocurre una interrupción.

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

Instrucción de paro (STOP)

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.

El desarrollo de los primeros circuitos integrados de microprocesadores, marco una ganancia


significativa en este ámbito. Ahora la aplicación de la tecnologías ha avanzado de tal forma, que
los microprocesadores son usados en un amplio espectro de dispositivos, y productos - muchos
de ellos usan baterías de alimentación. Para estas aplicaciones, la cantidad de potencia
consumida por el microprocesador puede ser crítica. Muchos productos basados en
microprocesadores son usados en forma intermitente, es decir, solo ejecutan algunas tareas
periódicas o trabajos (por ejemplo en tareas continuas de control). Para este tipo de
aplicaciones, es una ventaja tener un microprocesador que pueda energizarse en potencia baja
o en modo "idling", sin carga. El MPU 68HC11 tiene la capacidad de energizarse de este modo.
Esto se logra con la instrucción STOP.

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

Procesamiento de interrupciones por prioridad

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.

Afortunadamente, el 68HC11 cuenta con un circuito interconstruido llamado Interrupt Resolution


Priority Circuit o circuito para resolución de interrupciones por prioridad, IRPC. El IRPC resuelve
las peticiones de interrupción de acuerdo a la clasificación relativa fija o la prioridad. Véase la
figura 5-11.
Alta 2% S%%T
COP Monitor de reloj
Prioridad Falla del COP
Opcodes ilegal
8 )21
Baja )21 (por omisión)

Fig. 5-11 Prioridad de interrupciones establecido por IRPC

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

Retardo 4064 E-ciclos Falla en clock BAJA


monitor(CME=1)
CCP WATCHDOG
TIMEOUT
(CON NOCOP=0)
Carga el contenido Carga el contenido
del PCcon $FFFE, FFFF del PCcon $FFFC, FFFD
(VECTOR DE BUSQUEDA) (VECTOR DE BUSQUEDA) Carga el contenido
del PCcon $FFFA, FFFB
(VECTOR DE BUSQUEDA)

Activa los bits: S, X, I


en CCR
Reset MCU por
Hardware

Inicia una secuencia de


instrucciones Fig. 5-12.

Diagrama de flujo.
SI Bit X,
activado?
procesamiento por prioridad de
Interrupciones /reset
NO

Pin XIRQ, SI
edo. bajo?

NO Registros CPU Stack


Activa los bits
X, I
SI Bit I, Vector de busqueda
activado? $FFF4, FFF5

NO

Interrupción SI
pendiente?

NO

Busqueda de Opcode

Registros CPU Stack


NO Registros CPU Stack
Activa el bit “I” Opcode
legal?
Vector de busqueda
$FFF8, FFF9 SI

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

6.1 DESCRIPCION DE TARJETA

La tarjeta DL3155M24HC11 esta equipada con el microprocesador 68HC11, el dispositivo


dentro de la evolucion de microcontroladores de mas alta escala de integracion, donde
podriamos decir que solo depende de su programacion para dar solucion a un problema real, y
el minimo de perifericos externos.

A continuacion sé hara mension de todos los elementos con que cuenta la tarjeta:

TARJETA ENTRENADORA PARA MICROCONTROLADOR 68HC11

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

3 MATERIAL DE APOYO DIDACTICO:


A) GUIA TEORICA: EXPLICACION DE MC68HC11,
INSTRUCCIONES Y MANEJO DE LA TARJETA.
B) MANUAL DE PRACTICAS: EXPLICACION DE MANEJO DE
DE PUERTOS HASTA EL CONTROL DE PERIFERICOS
EXTERNOS(INCLUIDOS EN LA TARJETA ENTRENADORA).

182
DL3155M24HC11

6.2 PROGRAMACION DE TARJETA

El microcontrolador contiene un programa (ya cargado dentro del microcontrolador) llamado


BUFFALO, el cual se encarga de controlar todos los recursos internos del microcontrolador,
este sistema operativo contiene una serie de comandos los cuales le permitiran al alumno
realizar acciones en cualquier tipo de aplicación que quiera realizar. Este sistema operativo nos
permite comunicar con otro elemento y en forma particular con la computadora, atraves de la
interfaz de comunicación serie (SCI) bajo. Acontinuacion se mencionanran los camandos con
que cuenta este sistema operativo:

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

Lo que se encuentra entre [ ] indica opcional.

183
DL3155M24HC11

Forma de descarga un programa.

Para la descarga de un programa, previamente debe de tenerse el programa con extension


s19. Para esto se deben seguir los siguiente pasos:

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

En este momento, el programa esta listo para comunicarse con la tarjeta.


NOTA: Alimentar y conectar la tarjeta DL3155M24HC11 a la PC
F) 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 damos enter sobre el cursor paraeceran todos los comandos antes mencionados, los
cuales nos ayudaran a descargar el programa con extension s19.
Si el mensaje no aparece, indica que la tarjeta no tiene comunicación con la tarjeta
DL3155M24HC11

Nota importante: Si la tarjeta no responde con los parametros anteriores cambiar a


baud a 4800 dar reset en la tarjeta cambiar nuevamente baud a 9600 y dar reset,
momento en el cual se realizara la comunicación.

184
DL3155M24HC11

6.3 PROGRAMA DE PRUEBA


Acontinuacion se mostrara la forma de descarga de un programa de la PC a la tarjeta. Mediante
un ejemplo de prueba que consiste el manejo de un dato mediante acumuladores:

1) El programa que esta escrito abajo, teclearlo en el edito de ms-dos en el subdirectoria


DL_HC11, despues abrirlo en el editor del IASM11.

;===================================
;DL3155M24HC11 DE DELORENZO ITALY
;
;DESCARGA DE PROGRAMA
;===================================
;TITULO "PRUEBA.ASM"

DIR1 EQU $121 ;DIRECCIONES


DIR2 EQU $122 ;AUXILIARES

ORG $0100;ORIGEN DE PROGRAMA

INICIO LDAA #$01 ;ACUMULADOR CARGAR CON 01 HEX


STAA DIR1 ;MANDAR DATO DE ACUMULADOR "A" A DIR1
LDAB DIR1 ;CARGAR EL ACUMULADOR "B" CON DATO DE DIR1
INCB ;INCREMENTA ACUMULADOR "B"
STAB DIR2 ;MANDAR DATO DE ACUMULADOR "B" A DIR2
STOP ;INTERREPCION DEL PROGRAMA
@

Descripcion de simbologia del programa:

El simbolo #$ indica dato hexadecimal directo.


El simbolo $ dato hexadecimal indica direccion.
El simbolo ¡ dato decimal indica direccion.
El simbolo % dato binario indica direccion.

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

2) Despues de teclearlo, ir al submenu assembler habilitar la opcion listing, para obtener el


programa listado, inmediatamente despues salir al menu principal y oprimir la tecla F4, no
debera aparecer ningun mensaje de error, si es asi checar el programa. Cuando no
tengamos algun mensaje de error, ver con cualquier procesador de texto el programa lst
creado por el programa, en este caso veremos lo siguiente:

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

COL1 COL2 COL3 COL4

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 instrucción LDAB DIR1:


LDAB CODIGO ES f6 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.

En la COL4 aparece todos los nemonicos con sus etiquetas

En el REL1 aparece el valor que se le asignan a las etiquetas usadas en el programa

En el REL2 aparece el origen del cual empezara a correr el programa cargado

NOTA: En este momento conectamos la tarjeta DL3155M24HC11 a la PC

3) Despues de ensamblar el programa pulsamos la tecla de funcion F10 y colocamos los


valores para poder comunicarnos a la PC, estos valores son:

Comm: 1 o 2 (puerto serie de la computadora comm1 o 2 según el caso)


Baud: 9600
Parity: N
Length: 8
Stop: 1

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

Nota importante: Si la tarjeta no responde con los parametros anteriores cambiar a


baud a 4800 dar reset en la tarjeta cambiar nuevamente baud a 9600 y dar reset,
momento en el cual se realizara la comunicación.

4) Estando en el cursor > realizar lo siguiente:


LOAD T ↵ (inmediatamente despues oprimir la tecla de funcion F6 aprecera lo siguiente)

File to download:_
Escribir adelante del cursor nombre_archivo.s19 ↵
Aparecera lo siguiente:
S11001008601B70121F601215CF70122CF31
S9030000FC
Done
>_

Escribir delante de >_MD 100 ↵


Aparecera los siguiente:

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

6) Para ver que sucede en la memoria hacer lo siguiente:


En el cursor >_ escribir lo siguiente:
>_MD 100 130 ↵
En este momento el programa desplegara los datos contenidos en lamemoria de 100 Hex
hasta 13F Hex.
7) Inmediatamente despues seguir con el paso (5), asi hasta llegar la final del programa, esto
si es ejecutado el programa paso a paso.

189