Tutorial Microcontroladores
Microcontroladores
Interrupciones Externas
Las interrupciones externas proceden del pin /IRQ o de los bits 3 - 0 del port A, si el port A se ha configurado como port de interrupciones. En el MC68HC705J1A, la sensibilidad del pin /IRQ es programable. Disponemos de disparo sólo sensible a un flanco o bien sensible a flanco descendente y nivel. El MC68HC705J1A usa un bit del registro máscara de opciones (MOR) en la posición de memoria $7F1 para configurar la sensibilidad del pin /IRQ. El pin /IRQ es activo bajo y las interrupciones del port A son activo alto.
Cuando una interrupción es reconocida, el estado actual de la CPU es salvado en la pila y el bit I es puesto en uno. Esto enmascara posteriores interrupciones hasta que la presente sea atendida. La dirección de rutina de atención de la interrupción externa es especificada por el contenido de las posiciones de memoria $07FA y $07FB.
Fig. 4-6 – Diagrama de Flujo de la Interrupción por Hardware.
NOTE: When an interrupt occurs, CPU registers are saved the stack in the order PCL, PCH, X, A, CCR.
On a return-from-interrupt, registers are recovered from the stack in reverse order.
Fig. 4-7 – Orden de Apilamiento (stacking) de una Interrupción.
Interrupciones Internas
Los microcontroladores a veces incluyen sistemas periféricos dentro de su mismo chip que pueden generar interrupciones a la CPU. El sistema de temporización en el MC69HC705J1A es un ejemplo de semejante periférico. Las interrupciones internas trabajan del mismo modo que las externas excepto por que hay vectores de interrupción separados para cada sistema periférico incluido en el circuito integrado.
Interrupciones por Programa (SWI)
La interrupción por programa es una instrucción ejecutable. La acción de la instrucción SWI es similar a la de una interrupción (bit I) del CCR. La dirección de la rutina de atención es especificada por el contenido de las posiciones de memoria $07FC y $07FD (en el MC68HC705J1A).
Revisión del Capítulo 4
En la arquitectura del MC69HC705J1A hay cinco registros de la CPU que están directamente con la CPU y no forman parte del mapa de memoria. Toda otra información disponible por la CPU está dispuesta en una serie de posiciones de memoria de 8 bits.
Un mapa de memoria presenta el nombre y el tipo de memoria de todas las posiciones que son accesibles por la CPU. La expresión I/O mapeado en memoria dice que la CPU trata a los registros de I/O y control exactamente igual que a cualquier otro tipo de memoria. (En algunas arquitecturas de computadoras se separan los registros de I/O del espacio de memoria de programa y se usan instrucciones separadas para acceder a las posiciones de I/O).
Para poder comenzar de un lugar conocido, se debe hacer el reset de la computadora. El reset obliga a los sistemas periféricos incluidos en el chip y a la lógica de I/O a ir a condiciones conocidas y carga al contador de programa con una dirección de inicio conocida. El usuario especifica la posición de memoria de inicio deseada colocando los bytes de mayor y menor peso de esta dirección en las posiciones de memoria del vector de reset ($07FE y $07FF en el MC68HC705J1A).
La CPU utiliza al registro puntero a la pila (SP) para implementar una pila del tipo último en ingresa / primero en salir (LIFO) en la memoria RAM. Esta pila retiene el contenido previo de todos los registros mientras la CPU está ejecutando una secuencia de interrupción. Al recobrar esta información de la pila, la CPU puede proseguir en el punto en que se encontraba antes que la subrutina o la interrupción comenzaran.
Las computadoras usan un reloj de alta velocidad para pasar a través de las sub etapas de cada operación. Ya que cada instrucción toma varios ciclos de este reloj, resulta tan rápido que las operaciones parecen ser instantáneas para una persona. Un MC68HC705J1A puede ejecutar alrededor de 500000 instrucciones por segundo.
Una CPU ve a un programa como una secuencia lineal de números binarios de 8 bits. Los códigos de operación y datos de la instrucción están mezclados en esta secuencia pero la CPU se mantiene alineada con los límites de la instrucción ya que los códigos de operación le dicen a la CPU cuántos bytes de datos de operando vienen con el código de operación.
Jugando a la computadora es una técnica de adiestramiento con la que tratamos de ser la CPU que ejecuta el programa.
El reset puede producirse por condiciones internas o externas. Un pin de reset permite que una causa externa inicie un reset. Un cronómetro de vigilancia y un sistema detector de acceso a dirección legal pueden producir un reset en el supuesto caso que el programa no esté ejecutándose en la secuencia deseada.
Las interrupciones causan que la CPU detenga temporariamente la ejecución del programa principal para responder a la interrupción. Todos los registros de la CPU son salvados en la pila de modo que la CPU puede regresar al punto del programa principal una vez que la interrupción ha sido atendida.
Las interrupciones pueden ser inhibidas globalmente cargando el bit I del CCR con uno o bien localmente colocando cero en los bits de control de habilitación de cada fuente de interrupción.
Los pedidos podrán ser registrados mientras las interrupciones están inhibidas de modo que la CPU pueda atenderlos tan pronto como las interrupciones se rehabiliten. SWI es una instrucción y no puede ser inhibida.
Capítulo 5.
El Repertorio de Instrucciones del MC68HC05
El repertorio de instrucciones de una computadora es su vocabulario. Este capítulo describe a la CPU y al repertorio de instrucciones del MC68HC05. El apéndice A contiene la detallada descripción de cada instrucción del MC68HC05 y puede usarse como referencia. En este capítulo se discuten las mismas instrucciones en grupos de operaciones de simular funcionamiento. También se discuten la estructura y los modos de direccionamiento del MC68HC05. Los modos de direccionamiento refieren las variadas maneras en que una CPU puede acceder a los operandos participantes de una instrucción.
Unidad Central de Proceso del MC68HC05 (CPU)
La CPU del MC68HC05 es la responsable de ejecutar todas las instrucciones en la secuencia programada para una aplicación específica. En la figura 5-1 se presenta el diagrama en bloques de una CPU típica del MC68HC05.
Fig. 5-1 – Diagrama en Bloques del CPU MC68HC05.
Unidad Aritmético / lógica (ALU)
La unidad aritmético / lógica (ALU) es usada para realizar las operaciones aritméticas y lógicas definidas por el repertorio de instrucciones.
Varios circuitos de operación aritmética binaria decodifican la instrucción en curso y preparan a la ALU para cumplir con la función deseada. La mayor parte de la aritmética binaria se basa en el algoritmo de suma, y la resta es manejada como una suma de números negativos. La multiplicación no se realiza como una instrucción directa, sino como una cadena de operaciones de suma y de desplazamiento en el interior de la ALU bajo el control de la lógica de control de la CPU. La instrucción multiplicación (MUL) requiere 11 ciclos internos del procesador para completar esta cadena de operaciones.
Lógica de Control de la CPU
El circuito de control de la CPU secuencia los elementos lógicos de la ALU para producir la operación requerida. Un elemento central de la sección de control de la CPU es el decodificador de instrucciones. Cada código de operación es decodificado para determinar cuántos operandos se necesitan y qué secuencia de etapas se requiere para completar una instrucción. Al finalizar una instrucción el próximo código de operación es leído y decodificado.
Registros de la CPU
(CPU05)
La CPU contiene cinco registros tal como se lo presenta en la figura 5-2. Los registros de la CPU son registros de memoria que se alojan dentro del microprocesador (no son parte del mapa de memoria). El conjunto de registros de la CPU es a veces denominado el modelo de programación. Un programador experimentado puede aventurarnos la suerte de una computadora a partir de su modelo de programación.
Fig. 5-2 – Modelo de Programación (Registros del CPU).
Acumulador (A). El acumulador es un registro de propósitos generales de 8 bits usado para almacenar operandos, resultados de cálculos aritméticos, y de manipulación de datos. Además él es directamente accesible a la CPU para operaciones no aritméticas. El acumulador es usado durante la ejecución de un programa donde el contenido de alguna posición de memoria es cargado en el acumulador. También, la instrucción almacenar causa que el contenido del acumulador sea almacenado en alguna posición de memoria preestablecida.
Registro Índice (X). El registro índice es usado para los modos de direccionamiento indexados o bien puede ser usado como un acumulador auxiliar. Este registro de 8 bits puede ser cargado directamente o sino desde memoria, siendo su contenido almacenado en memoria, o bien su contenido puede ser comparado con memoria.
En las instrucciones indexadas, el registro X provee un valor de 8 bits que es sumado a la dirección base provista por la instrucción para crear una dirección afectiva. El valor provisto por la instrucción puede ser de 0, 1 ó 2 bytes de largo.
Registro de Código de Condición (CCR). El registro de código de condición contiene una máscara de interrupción y cuatro indicadores de estado que reflejan el resultado de operaciones aritméticas y de otro tipo de la CPU. Las cinco banderas son semi acarreo (H), máscara de interrupción (I), negativo (N), cero (Z) y acarreo / préstamo (C).
Registro de Código de Condición
Bit de Semiacarreo (H). La bandera de semiacarreo es usada por las operaciones aritméticas en decimal codificado en binario (BCD) y es afectada por las instrucciones de suma ADD o ADC. El bit H se pone en uno cuando se produce un acarreo del dígito hexadecimal de menos peso en los bits 3-0 al dígito de más peso en bits 7-4. Luego de la suma binaria de dos valores de 2 dígitos BCD, este bit de semiacarreo es parte de la información necesaria para volver el resultado a un valor BCD válido.
Bit de Máscara de Interrupción (I). El bit I no es una bandera de estado, es un bit de máscara de interrupción que desabilita todas las fuentes de interrupción enmascarables cuando el bit I está en uno. Las interrupciones están habilitadas cuando este bit está en cero. Cuando cualquier interrupción ocurre, el bit I es automáticamente forzado a uno luego de haber salvado los registros en la pila, pero antes el vector de interrupción es buscado.
Si una interrupción interna ocurre mientras el bit I está en uno, la interrupción es almacenada y procesada luego que el bit I se ponga en cero; de esta manera, no perderemos una interrupción IRQ que se presente cuando el bit está en uno.
Luego de haber atendido a una interrupción, la instrucción retorno desde una interrupción (RTI) provocará que los registros recuperen sus valores previos. Normalmente, el bit I permanecería en cero luego que fuese ejecutada la instrucción RTI. Luego de cualquier reset, el bit I estará en uno y sólo podrá llevárselo a cero por medio de una instrucción.
Bit de Negativo (N). el bit N es forzado a uno cuando el resultado de la última operación aritmética, lógica o de manipulación de datos es negativo. Para los valores signados según el convenio de complemento a dos, se considera que un número es negativo si el bit más significatico es un uno.
El bit N tiene otros usos. Mediante la asignación de un bit de bandera de evaluación frecuente al MSB de un registro o posición de memoria, podemos evaluar este bit simplemente cargando el acumulador con el contenido de esta posición de memoria.
El bit de Cero (Z). El bit Z es forzado a uno cuando el resultado de la última operación aritmética, lógica o de manipulación de datos es cero. Una operación de comparación resta un valor desde la posición de memoria que está siendo evaluada. Si los valores son iguales antes de la comparación, el bit Z se pondrá en uno.
Bit de Acarreo/Préstamo (C). El bi C es usado para indicar si ha habido o no acarreo de una suma o pedido de préstamo como resultado de una resta. Las instrucciones de desplazamiento y rotación operan sobre y a través del bit C para facilitar operaciones de desplazamiento de múltiples bytes. El bit C es además afectado durante las instrucciones de evaluación de bit y de bifurcación.
La figura 5-3 es un ejemplo del modo en que los bits de código de condición son afectados por operaciones aritméticas.
El bit H carece de sentido luego de realizar la operación ya que el acumulador no contenía un valor BCD válido antes de la operación.
Fig. 5-3 – Como el CCR es afectado por las operaciones Aritméticas.
Contador de Programa (PC). El contador de programa es un registro de 16 bits que contiene la dirección de la próxima instrucción u operando de instrucción a ser buscado por el procesador. En muchas de las variantes del MC68HC05, algunos de los bits superiores del contador de programa no son usados y están siempre en cero. El MC68HC705J1A usa sólo 11 bits del contador de programa de modo que los cinco bits superiores están siempre en cero. El número de bits utilizados en el contador de programa coincide con el número de líneas de dirección implementadas en el sistema de computadora.
Normalmente, el contador de programa avanza una posición de memoria a la vez cuando se buscan instrucciones y operandos de instrucciones. Las operaciones de salto, bifurcación e interrupción provocan que el contador de programa sea cargado con la dirección de una posición de memoria diferente que la de la posición de memoria de la próxima secuencia. Durante el Reset, el contador de programa (PC) se carga con la dirección contenida en el "Reset Vector" que para el MC68HC705J1A se encuentra en la posición $07FE y $07FF. La dirección contenida en el vector, es la dirección de la primera instrucción a ser ejecutada después de salir del estado de RESET.
Puntero de Pila (SP). El puntero de pila puede tener tantos bits como líneas de dirección, en el MC68HC705J1A se ha pensado al SP como un registro de 10 bits. Durante un reset del MCU o por instrucción reset del puntero a la pila (RSP), el puntero de pila es cargado con la dirección $000FF. El puntero de pila decrementado cuando un dato es almacenado (push) dentro de la pila e incrementado cuando un dato es recuperado (pull/pop) desde la pila.
Algunas variantes del MC68HC05 permiten a la pila usar más de 64 posiciones (de $00FF a $00C0), pero las versiones más pequeñas permiten sólo 32 bytes de pila (de $00FF a $00E0). En el MC68HC705J1A, los cuatro MSBs del puntero de pila están permanentemente puestos en 0011b. Estos cuatro bits junto con los seis bits menos significativos producen una dirección en el rango que va de $00FF a $00C0. Las subrutinas y las interrupciones pueden utilizar hasta 64 posiciones de memoria.
Si se excede las 64 posiciones, el puntero de pila retorna a $00FF y comienza a escribir sobre la información previamente almacenada. Un llamado a subrutina usa dos posiciones de la pila y una interrupción usa cinco posiciones.
Registros del CPU08
El CPU08 (CPU de la familia HC908) es una versión mejorada del CPU05 de la familia HC705, en el, podemos encontrar los mismos códigos de instrucciones que en el CPU05 más el agregado de nuevas instrucciones y modos de direccionamiento. Por ello, podemos decir que el CPU08 es código compatible (100%) con los del CPU05. En el CPU08 podemos hallar la misma cantidad de registros que el CPU05, pero con las siguientes diferencias:
Acumulador (Acc, A):
Es idéntico al del CPU05, 8 bits de largo de palabra.
Registro Índice (H:X):
Aquí el registro índice, a diferencia del CPU05, es de 16 bits de longitud, formado por una parte "baja" (el byte de menor peso) denominado "X" y una parte alta (el byte de mayor peso) denominado "H". Estos registros se encuentran concatenados para formar un único registro H:X. Esto permite direccionamientos indexados de hasta 64 Kbytes de espacio de memoria.
Para conservar la compatibilidad con la familia HC705, en el registro Índice puede utilizarse la parte baja ("X"), en los distintos modos de direccionamiento, de igual forma que en esta. Solo se debe tener en cuenta que cuando en una instrucción con direccionamiento indexado, se menciona el registro "X", en realidad se está haciendo mención al registro concatenado H:X de 16 bits de largo, por lo que deberá ponerse a cero
(forzar el valor $00) la parte superior del registro índice, o sea "H", para guardar total compatibilidad con la familia HC705. De esta forma, cuando se utilice el registro índice, el contenido del mismo será $00xx, donde "xx" contendrá el valor del registro "X" propiamente dicho.