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. Reloj Unidad 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 controladorsecuencial. 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 Cargar acumulador MNEMONICOS OPCODE LDA 1000 01102 o 8616 Add ADD 1000 10112 o 8B16 Stop STOP 1100 11112 o CF16 DESCRIPCION Cargar el contenido de la siguiente localidad de memoria en el acumulador Sumar el contenido de la siguiente localidad de memoria al contenido del acumulador. Deja el resultado en el acumulador 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 opcode de la Figura 1-10 0000 0111 representación binaria de 7 ADD 10 se convierte en 1000 1011 opcode de la Figura 1-10 0000 1010 representación binaria de 1010 Y: 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í: 1a. Instrucción 2a. Instrucción 1000 0110 0000 0111 1000 1011 0000 1010 Opcode de LDA Operando (7) Opcode de ADD 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 21 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 6800 CONVERTIDOR A/D RAM 256 x 8 68HC11 I/O PARALELO CLOCK 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 15 D 0 Acumulador de 8 bit, A y B, 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 7 Contador de Programa (Program Counter) 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 48pines. 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 1 1 MOD A 0 1 Modo Seleccionado Single-chip 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 DIRECCIONES MC 68HC11 52-FN I/O SERIE Y PARALELO TIMER PROGRAMABLE 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 nomascarable 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 2bytes. 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 Microsegundo s 1.09 Microsegundo s Ciclo del MPU (FETCH, Búsqueda) Ciclo del MPU (EJECUCIÓN) 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 HEX. 0010 0011 0012 0013 0014 0015 0016 CONTENIDO HEX. 86 07 8B 21 97 01 …. CONTENIDO HEX/. MNEMONICO LDAA # 07 ADDA # 21 STAA 01 … COMENTARIOS Carga el acumulador A con el dato inmediato #07 Suma al acumulador A, el dato inmediato # 21 Almacena el resultado en esta dirección 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 0 7 A B 0 15 D 0 Acumulador de 8 bit, A y B, o el acumulador doble D 15 IX 0 Registro Indexado X 15 IY 0 Registro Indexado Y 15 SP 0 15 PC 0 7 Apuntador de Pila (Stack Pointer) Contador Counter) de Programa (Program 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. B. Antes de ejecutar ASL 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. B. Antes de ejecutar ASRB 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. B. Antes de ejecutar LSR 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 Operando en Memoria = 0000 00102 = 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 AA 00 Opcode para INC extendido Dirección de orden alto 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 00 13 Opcode para LDAA extendido Dirección de orden alto Dirección de orden bajo O puede usar direccionamiento directo: 96 13 Opcode para LDAA directo 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 HEX CONTENIDO HEX 0010 0011 0012 0013 0014 0015 CE 00 50 4F AB 00 MNEMONICOS/ CONTENIDO HEX LDX # 00 50 CLR A ADDA, X 00 0016 0017 0018 0019 001A 001B 001C 08 8C 00 70 26 F8 CF INX CPX # 00 70 BNE F8 STOP COMENTARIOS Carga en forma inmediata el registro índice con la dirección del primer número de la lista. Borra el acumulador A Suma al acumulador usando direccionamiento indexado con la dirección de compensación(offset) de 00 Incrementa el registro índice Compara el contenido del registro índice con la dirección más grande que la dirección del ultimo numero en la lista. Si no es igual salta a la instrucción ADDA, X 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 HEX CONTENIDO HEX 0010 0011 0012 0013 0014 0015 0016 0017 0018 0019 001A 001B 001C 001D CE 00 30 A6 00 A7 10 08 8C 00 40 26 F6 CF MNEMONICOS/ CONTENIDO HEX LDX # 00 30 LDAA, X 00 STAA, X 10 INX CPX # 00 40 BNE F6 STOP COMENTARIOS Carga en forma inmediata el registro índice con la dirección de La lista original Carga el acumulador en forma indexada con un offset de 00 Almacena el acumulador A con un offset de 1016 Incrementa e registro índice Comparación indexada con una dirección más grande que la ultima dirección de la lista original Si no es igual, salta a la instrucción LDAA, X 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 ACCB ACCX ACCD = = = = CCR IX IXH IXL IY IYH IYL PC PCH PCL SP SPH SPL = = = = = = = = = = = = = Acumulador A Acumulador B Acumulador ACCA o ACCB Acumulador doble. Acumulador A concatenado con el acumulador B, donde A es el byte más significativo. Registro código de condición Registro índice X, 16 bits Registro índice X, 8 bits de orden alto. Registro índice X, 8 bits de orden bajo. Registro índice Y, 16 bits Registro índice Y, 8 bits de orden alto. Registro índice Y, 8 bits de orden bajo. Contador de programa, 16 bits. Contador de programa, 8 bits de orden alto (más significativo) Contador de programa, 8 bits de orden bajo (menos significativo) Stack Pointer, 16 bits. Stack Pointer, 8 bits de orden alto. Stack Pointer, 8 bits de orden bajo. 74 DL3155M24HC11 (c). Memoria y direccionamiento. M = M+1 = Rel = (opr) = (msk) = (rel) = Una localidad de memoria (1 byte) Un byte de memoria mas 0001, respecto a la dirección de la localidad de memoria indicada por "M". 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. Operando Mascara usada en instrucciones de manipulación de bit. Ajuste relativo (relative offset), usado en instrucciones de salto. (d). Bit 0 a Bit 7 del Registro código de condición C V Z N I H X S = = = = = = = = Acarreo/prestamo, bit "0" Indicador de sobreflujo en complemento a dos, bit "1" Indicador del cero, bit "2" Indicador negativo, bit "3" Macara de interrupción I, bit "4" Semiacarreo, bit 5 Macara de interrupción X, bit 6 “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 Ixn IXHn IXLn IYn IYHn IYLn Mn SPHn SPLn Xn = = = = = = = = = = ACCA y el bit 0-7 a ACCB Bit n de IX (n = 15, 14, 13,…0) Bit n de IXH (n = 7, 6, 5,…0) Bit n de IXL (n = 7, 6, 5 ,…0) Bit n de IY (n = 15, 14, 13,…0) Bit n de IYH (n = 7, 6, 5,…0) Bit n de IYL (n = 7, 6, 5 ,…0) Bit n de M (n = 7, 6, 5,…0) Bit n de SPH (n = 7, 6, 5 ,…0) Bit n de SPL (n = 7, 6, 5,…0) 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 = RLn = Rn = Bit n del byte más significativo (n=7, 6, 5, 4,….0). 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. . Bit n del resultado (n=15, 14, 13, 12,….0). (g). Simbologia para el CCR 0 1 = = = = = Bit no afectado. Se coloca un bit 0 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 ACCA ← (ACCA) + (ACCB) Operación: 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 — H=1 N=1 Z=1 V=1 C=1 X — H I — N Z V C si ocurrió un acarreo en el bit 3; 0 en otro caso el bit más significativo del resultado, es 1;en otro caso se borra. los bits del resultado son 00; 0 en cualquier otro caso. si hubo sobreflujo en complemento a dos; 0 en otro caso. 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 IX ← (IX) + (ACCB) Operación: 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 — Mnemónico: X — H — I — N — Z — V — C — 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 ACCX ← (ACCX) • (M) Operación: 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 0 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=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 0 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=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) PC ← (PC) + 0002 + Rel si C = 0 Equivale a (ACCX) ≥ (M) (números binarios sin signo) Operación: 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. (ACCX) • (M) Operación: 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 0 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. 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 indexado Y direccionamiento 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 0 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=0 0 Mnemónico: BSET (opr)(msk) BSR Operación: PC ← (PC) + 0002 ↓ (PCL) SP← ← (SP) - 0001 ↓ (PCH) SP ← (SP) - 0001 PC ← (PC) + Rel Salto a subrutina 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 C bit ← 0 Operación: 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 I bit ← 0 Operación: 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 0 N Z — V — C — — I=0 Mnemónicos: CLI CLR Borrado (ACCX) ← 00 M ← 00 Operación: Descripción: El contenido de ACCX o de M es reemplazado por ceros Registro de Códigos de condición (CCR) S — N=0 Z=1 V=0 C=0 Mnemónicos: X — H — I — N Z 0 V 1 C 0 0 Borrado Activado Borrado Borrado CLRA, CLRB, CLR(opr) 95 DL3155M24HC11 CLV Borra el bit de sobreflujo en complemento a dos V bit ← 0 Operación: 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 0 C — 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 ACCX ← ¬ (ACCX) = FF - (ACCX) M ← ¬ (M) = FF - (M) Operación: 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 0 C 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 SP← ← (SP) -- 0001 Operación: Descripción: Substrae un valor del stack pointer. Registro de Códigos de condición (CCR) S — Mnemónico: X — H — I — N — Z — V — C — DES 101 DL3155M24HC11 DEX Decremento del registro índice X Operación: IX← ← (IX) -- 0001 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← ← (IY) -- 0001 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← ← (ACCX) ⊕ (M) 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← ← (SP) + 0001 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← ← (IX) + 0001 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← ← (IY) + 0001 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 — A. X — H — I — N Z — V — C — — Mnemónico: NOP 114 DL3155M24HC11 ORA Operación OR inclusiva ACCX ← (ACCX) + (M) Operación: 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 SP ← (SP) + 0001; ↑ IYL, SP ← (SP) + 0001; ↑ IYH, Operación: 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, ↑ SP ← (SP) + 0001, ↑ SP ← (SP) + 0001, ↑ SP ← (SP) + 0001, ↑ SP ← (SP) + 0001, ↑ SP ← (SP) + 0001, ↑ SP ← (SP) + 0001, ↑ SP ← (SP) + 0001, ↑ SP ← (SP) + 0001, ↑ CCR ACCB ACCA IXH IXL IYH IYL PCH 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) Mnemónico: Restaurados a su estado de extracción desde la pila. 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) Mnemónico: No afectados RTS 120 DL3155M24HC11 SBA Resta entre acumuladores (ACCA) ← (ACCA) - (ACCB) Operación: 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 (ACCX) ← (ACCX) -- (M) - (C) Operación: 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 1 N Z — V — C — — 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 Operación: Almacena el stack pointer M ← (SPH) M + 1← ← (SPL) 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 Operación: M ← (IXH) M + 1← ← (IXL) Almacena el registro índice X 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 M ← (IYH) M + 1← ← (IYL) Operación: Almacena el registro índice Y 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. (ACCX) ← (ACCX) -- (M) Operación: 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 1 N Z — V — C — — I=1 Mnemónico: SWI TAB Transferencia del acumulador A, al acumulador B ACCB ← (ACCA) Operación: 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 CCR ← (ACCA) Operación: 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 ACCA ← (ACCB) Operación: 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 ACCA ← (CCR) Operación: 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 1 N Z — V — C — — 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 LS 0 1 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 NUL SOH STX ETX EOT ENQ ACK BEL BS HT LF VT FF CR SO SI DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US SP ! " # $ % & ' ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ 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 15 HEX 0 1 2 3 4 5 6 7 8 9 A B C D E F caract. Byte 12 11 caract. DEC 0 4,096 8,192 12,288 16,384 20,480 24,576 28,672 32,768 36,864 40,960 45,056 49,152 53,248 57,344 61,440 HEX 0 1 2 3 4 5 6 7 8 9 A B C D E F 8 8 DEC 0 256 512 768 1,024 1,280 1,536 1,792 2,048 3,304 2,560 2,816 3,072 3,328 3,584 3,840 7 Byte 0 7 caract. 3 caract. 0 4 HEX DEC HEX DEC 0 0 0 0 1 16 1 1 2 32 2 2 3 48 3 3 4 64 4 4 5 80 5 5 6 96 6 6 7 112 7 7 8 128 8 8 9 144 9 9 A 160 A 10 B 176 B 11 C 192 C 12 D 208 D 13 E 224 E 14 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 TOPE DE LA PILA O STACK HACIA/DESDE EL ACUMULADOR 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 temporal excelentes. Si necesitamos liberar el acumulador por alguna 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 memoria. ¿Cuál es, entonces, la ventaja de la pila? 8 REGISTROS 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 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. Fig .4-1. Pila en cascada 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. 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 HEX. 0020 0021 0022 0023 0024 0025 0026 0027 0028 0029 002A 002B 002C 002D 002E 002F CONTENIDO HEX. 8E 01 FF CE 00 1F A6 00 36 09 8C 00 0F 26 F7 CF CONTENIDO HEX/. MNEMONICO LDS # 01 FF LDX # 00 1F LDAA, X 00 PSHA DEX CPX # 00 0F BNE F7 STOP COMENTARIOS Carga el apuntador de pila o stack pointer inmediatamente con la dirección de la nueva entrada en la nueva lista Cargar el registro indexado inmediatamente con la dirección de la ultima entrada en la lista original Carga el acumulador A, indexado desde la lista original. Coloca el contenido del acumulador A, en la nueva lista Decrementa el registro indexado Compara el contenido del registro indexado con una dirección menos que la de la primer entrada en la lista original. De lo contrario salta hacia atrás. 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 DIRECCIONES BUS 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 lectura157 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 Petición de interupción(Interrupt Request) Interrupción de software (SWI) IIlegal Opcode Trap XIRQ IRQ 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 del PC con el contenido de FFFF16 Secuencia reset de Interrupción Ciclo Inicio normal, ciclo de búsqueda/ejecución MPU Normal 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 ) Donde: (7.1) 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 nomascarable 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 nomascarable 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 del PC con el contenido de FFF516 Inicio normal, ciclo de búsqueda/ejecución Secuencia de Interrupción No-mascarable Ciclo MPU Normal Fig. 5-7. Secuencia de Interrupción no-mascarable (8 8 )21 ) 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 (fetchexecute), 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 NOMASCARABLE (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 instrucción actual finalizo? NO SI Bit mascara de interrupción activado? NO 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 Inicio normal, ciclo de búsqueda/ejecución Ciclo MPU Normal 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 de Interrupción por Software Carga el byte bajo del PC con el contenido de FFFB16 Inicio normal, ciclo de búsqueda/ejecución Ciclo 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 Prioridad Baja 2% S% %T COP Monitor de reloj Falla del COP Opcodes ilegal 8 )21 )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 55. 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 monitor(CME=1) BAJA CCP WATCHDOG TIMEOUT (CON NOCOP=0) Carga el contenido del PCcon $FFFC, FFFD (VECTOR DE BUSQUEDA) Carga el contenido del PCcon $FFFE, FFFF (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 SI Fig. 5-12. Diagrama de flujo. procesamiento por prioridad de Interrupciones /reset Bit X, activado? NO Pin XIRQ, edo. bajo? SI NO SI Registros CPU Stack Activa los bits X, I Vector de busqueda $FFF4, FFF5 Bit I, activado? NO Interrupción pendiente? SI NO Busqueda de Opcode Registros CPU Stack Activa el bit “I” NO Vector de busqueda $FFF8, FFF9 Registros CPU Stack Opcode legal? SI SI WA 1? NO Registros CPU Stack SI Activa el bit “I” SW 1? Vector busqueda $FFF6, FFF7 SI RT 1? Realmacena los registros CPU desde el Stack Registros CPU Stack NO Interrupción Todavía ? Activa el bit “I” NO Ejecuta esta instrucción Resuelve lnterrupción de proridad y el vector 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 BF [Direccion]Enssamblador/Desensamblador <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) B) C) D) E) Crear una carpeta llamada DL_HC11 en el directorio raiz, y cargar el archivo iasm11.exe en el con su help correspondiente. En el programa IASM11.EXE, abrir un programa con extension ASM (NOMBRE_ARCH.ASM). 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. 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 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 DIR2 INICIO EQU EQU $121 ;DIRECCIONES $122 ;AUXILIARES ORG $0100;ORIGEN DE PROGRAMA LDAA STAA LDAB INCB STAB STOP #$01 ;ACUMULADOR CARGAR CON 01 HEX DIR1 ;MANDAR DATO DE ACUMULADOR "A" A DIR1 DIR1 ;CARGAR EL ACUMULADOR "B" CON DATO DE DIR1 ;INCREMENTA ACUMULADOR "B" DIR2 ;MANDAR DATO DE ACUMULADOR "B" A DIR2 ;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 0000 0000 0100 0100 0102 0105 0108 0109 010C COL1 DIR1 DIR2 INICIO 8601 B70121 F60121 5C F70122 CF COL2 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ;=================================== ;DL3155M24HC11 DE DELORENZO ITALY ; ;DESCARGA DE PROGRAMA ;=================================== ;TITULO "PRUEBA.ASM" DIR1 DIR2 INICIO COL3 EQU EQU $121 ;DIRECCIONES $122 ;AUXILIARES REN1 ORG $0100;ORIGEN DE PROGRAMA REN2 LDAA STAA LDAB INCB STAB STOP #$01 ;ACUMULADOR CARGAR CON 01 HEX DIR1 ;MANDAR DATO DE ACUMULADOR "A" A DIR1 DIR1 ;CARGAR EL ACUMULADOR "B" CON DATO DE DIR1 ;INCREMENTA ACUMULADOR "B" DIR2 ;MANDAR DATO DE ACUMULADOR "B" A DIR2 ;INTERREPCION DEL PROGRAMA COL4 0121 0122 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 110 120 86 FF FF 01 FF FF B7 FF FF 01 FF FF 21 FF FF F6 FF FF 01 FF FF 21 FF FF 5C FF FF F7 FF FF 01 FF FF 22 FF FF CF 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