jueves, 27 de junio de 2013

MODOS DE OPERACIÓN

EL microcontrolador MSP430G2553 puede trabajar en varios modos de funcionamiento u operación. Estos modos de operación se clasifican en dos grandes grupos, donde la clasificación se hace en base al consumo y la respuesta del micro a un evento.

  • Modo activo: todos los recursos del micro se encuentran activos y todas las señales de reloj se encuentran habilitadas. La CPU se encuentra ejecutando instrucciones. Las ventajas de este modo de operación es la rápida respuesta ante un evento. Sin embargo el consumo es mucho más elevado.
  • Modo de bajo consumo: algunas señales de reloj o todas se encuentran deshabilitadas. La CPU puede estar dormida, es decir, sin ejecutar instrucciones. La ventaja de este modo de operación es el bajo consumo. Sin embargo presenta como inconveniente una respuesta más lenta. El micro sale de este modo de funcionamiento a través de una interrupción generada por un periférico externo. Cuando sale de este modo vuelve al modo activo habilitando todas las señales de reloj.
Los modos de operación se determinan mediante los bits SCG1, SCG0, OSCOFF y CPUOFF del registro de estado. Teóricamente con 4 bits se podrían tener 16 posibilidades y en consecuencia 16 modos de operación. Sin embargo sólo son 6 los modos de operación que se tienen. En primer lugar recordemos qué es lo que hacía cada uno de esos bits:
  • OSCOFF: habilita o deshabilita las fuentes LFXT1CLK y VLOCLK (en función de cual sea la que esté establecida). Esto se puede hacer siempre y cuando esas fuentes no sean las fuetnes de las señales MCLK y SMCLK. Se deshabilita con un 1 y se habilita con un 0.
  • CPUOFF: señal MCLK activa (0) o parada (1).
  • SCG0: generador DC activo o parado.
  • SCG1: SMCLK activo (1) o parado.
Observemos que antes de ejecutar la RTI asociada a una interrupción, el registro de estado se pone a 0, es decir el micro entra en modo activo.
Para entrar en los modos de bajo consumo desde el programa principal hay que modificar los bits correspondientes del registro SR. 

Modos de operación.
  • Modo activo: todos los relojes se encuentran activados y la CPU se encuentra encendida (OSCOFF = 0, CPUOFF = 0, SCG0 = 0 y SCG1 = 0).
  • LPM0 (low power mode 0): CPU desactivada, ACLK y SMCLK permanecen activos, MCLK desactivado (OSCOFF = 0, CPUOFF = 1, SCG0 = 0 y SCG1 = 0).
  • LPM1 (low power mode 1): CPU desactivada, ACLK y SMCLK permanecen activos. MCLK desactivado. Generador DC del DCO desactivado siempre y cuando el DCO no se use en modo activo. (OSCOFF = 0, CPUOFF = 1, SCG0 = 1 y SCG1 = 0)
  • LPM2 (low power mode 2): CPU desactivada, MCLK y SMCLK desactivada. Generador de DC del DCO activo. ACLK permanece activo. (OSCOFF = 0, CPUOFF = 1, SCG0 = 0 y SCG1 = 1)
  • LPM3 (low power mode 3): CPU desactivada, MCLK y SMCLK desactivados. Generador DC del DCO desactivado. ACLK permanece activo. (OSCOFF = 0, CPUOFF = 1, SCG0 = 1 y SCG1 = 1)
  • LPM4 (low power mode 4): CPU desactivada, MCLK y SMCLK desactivados, generador de DC del DCO desactivado. OScilador de cristal parado. (OSCOFF = 1, CPUOFF = 1, SCG0 = 1 y SCG1 = 1).

miércoles, 26 de junio de 2013

WATCHDOG

En el MSP430G2553 existe un registro de 8 bits denominado WDTCTL que se destina a este periférico. Un watchdog es un timer que permite entre otras cosas generar eventos (y en consecuencia interrupciones) o eliminar un bloqueo software de microprocesador (generando una señal PUC).

Registro WDTCTL.
  • Consideraciones generales:
    • Es un registro de 8 bits.
    • Aunque es un registro de 8 bits, para escribir datos en él es necesario hacerlo con datos de 16 bits. El byte más significativo se utiliza como contraseña. El valor que debe tomar ese byte es 0x5A. La escritura de valores en el registro es del tipo 0x5AXY, donde Y es el valor en hexadecimal de los 4 bits del byte menos significativo y X es el valor en hexadecimal de los 4 bits del byte más significativo. Cuando se trabaja en C, se hace con la constante WDTPW, cuyo valor es 0x5A00. Esa costante sumada a una determinado valor [0x0000, 0x00FF] nos permite modificar el registro.
    • Cualquier intento de configuración sin la contraseña correcta provoca un reset PUC.
  • Bit WDTTMSEL.
    • Nos permite seleccionar el modo de funcionamiento. El watchdog presenta dos modos de funcionamiento:
      • Modo watchdog (WDTTMSEL = 0): genera una señal PUC tras un error software.
      • Modo timer (WDTTMSEL = 1): nos permite generar una interrupción en un intervalo de tiempo programado.
  • Bit WDTSSEL.
    • Nos permite elegir la fuente de reloj:
      • WDTSSEL = 0 ==> SMCLK.
      • WDTSSEL = 1 ==> ACLK.
  • Bits WDTIS0 y WDTIS1:
    • Nos permiten determinar el valor máximo de la cuenta:
      • 00 ==> 32768.
      • 01 ==> 8192.
      • 10 ==> 512.
      • 11 ==> 64.
  • Bit WDTCNTCL.
    • Si lo ponemos a 1, nos permite reiniciar la cuenta.
    • En cuento la cuenta se reinicia, el bit se poner a 0 automáticamente.
  • Bit WDTHOLD.
    • Nos permite detener o activar la cuenta del watchdog. 
      • WDTHOLD = 0 ==> activa la cuenta del watchdog.
      • WDTHOLD = 1 ==> desactiva la cuenta del watchdog.
Respuesta del sistema cuando se llega al final de la cuenta.

  • La respuesta del sistema es distinta en función del modo de funcionamiento (WDTTMSEL) seleccionado. 
    • Si está en modo watchdog, se genera un reset PUC. Se activa el flag WDTIFG del registro IFG1 (Special funtion).
    • Si está en modo timer, se activa el flag WDTIFG del registro IFG1. Este flag se borra (pone a 0) automáticamente al ser atendida la interrupción.
Habilitación de interrupciones.
  • Si el watchdog actúa en modo timer, la interrupción que se genera cuando se culmina la cuenta se puede enmascarar. Esto se puede hacer o bien con el bit de habilitación general (GIE) o mediante el bit WDTIE del registro IE1. El flag de interrupción que se activa en tal caso es WDTIFG del registro IFG1.
  • Si el watchdog actúa en modo watchdog, la interrupción es reset (PUC) y no se puede enmascarar.
Reset PUC.
  • Se puede producir por varios motivos:
    • Que se trabaje en modo watchdog y expire el temporizador.
    • Que se escriba en el registro WDTCTL sin contraseña.
  • En ambos casos el flag WDTIFG del registro IFG1 se pone a 1. Hay que tener en cuenta que el reset PUC puede ser provocado por otros eventos. Para determinar cuál fue la causa se testea el bit WDTIFG. Ese bit se pone a 0 automáticamente.

TEMPORIZADORES

Los temporizadores nos permiten controlar el paso del tiempo en el sistema. Existen dos tipos de temporizadores:

  • Timers: entre otras cosas permiten:
    • Generar eventos transcurrido un determinado tiempo. En consecuencia nos permiten generar interrupciones.
    • Medir intervalos de tiempo. Nos permiten medir el tiempo transcurrido entre dos eventos consecutivos.
    • Generar señales digitales como PWMs.
  • Watchdog: es un temporizador específico que permite:
    • Controlar bloqueos software. Útil para generar un reset (PUC) tras la expiración del tiempo del temporizador.
    • Generar eventos y en consecuencia provocar interrupciones transcurrido un determinado intervalo de tiempo.

La familia MSP430 presenta dos tipos de timers: tipo A y tipo B. Ambos son equivalentes, aunque los del tipo B son algo más versátiles puesto que ofrecen algunas características adicionales que no ofrecen los del tipo A. En el caso del MSP430G2553 existen dos timers tipo A:
  • Timer0_A3.
  • Timer1_A3.
Desde el punto de vista del diagrama de bloques, cada timer está compuesto por varios elementos básicos:
  • Contador: encargado de realizar la cuenta. Cuenta flancos de subida de una señal de reloj, donde ésta se puede seleccionar con los bits de unos registros. El valor de la cuenta también se almacena en un registro.

Registros utilizados con los temporizadores (analizamos el Timer0_A3, el Timer1_A3 presenta las mismas características):
  • TA0R (Timer_A Register).
    • Son registros de 16 bits donde se almacena el valor de la cuenta.
    • El valor de ese registro se incrementa/decrementa por cada flanco de subida de la señal de reloj.
    • El que se incremente o decremente la cuenta depende del modo de operación que se elija (stop, up, continuous, up/down).
    • Se trata de un registro de lectura/escritura.
    • En caso de desbordamiento (cuando la cuenta llega a 0xFFFF o 0x0000 y se incrementa o decrementa respectivamente) puede generar una interrupción. 
  • TA0CCR0, TA0CCR1, TA0CCR2 (Timer_A Captura/compare).
    • Nos permite establecer un límite en la cuenta.
  • TA0CTL (TACTL Timer_A Control).
    • El bit TAIFG se pone a 1 cuando ocurre un desbordamiento en la cuenta el registro TAR, es decir se llega a 0x0000 o 0xFFFF. Al ser el registro TA[0|1]R de lectura escritura, podemos poner 0x0000 o 0xFFFF en dicho registro. Si se hace manualmente, este flag no se activa.
    • Los bits TASSEL0 y TASSEL1 nos permiten determinar cuál va a ser la señal de reloj con la cual va a trabajar el microcontrolador:
      • 00 ==> TACLK.
      • 01 ==> ACLK.
      • 10 ==> SMCLK.
      • 11 ==> INCLK.
    • Los bits ID0 e ID1 nos permiten dividir la frecuencia de la señal que se seleccione con los bits TASSEL0 y TASSEL1:
      • 00 ==> /1.
      • 01 ==> /2.
      • 10 ==> /4.
      • 11 ==> /8.
    • Los bits MC0 y MC1 nos permiten determinar el modo de operación, es decir, la forma en la cual el temporizador realiza la cuenta. Se tienen los siguientes modos:
      • 00 ==> modo parado (STOP).
        • Contador (registro TA0R) detenido. Si se cambia el modo de operación, el contador empieza a contar (en forma ascendente o descendente) a partir del valor de la cuenta en la cual se quedó, es decir trabajar en este modo de operación no implica modificar el registro TAR. 
      • 01 ==> modo ascendente (UP).
        • El contador cuenta a través del registro TAR desde 0 hasta el valor almacenado en el registro TA0CCR0. Tras esto la cuenta se reinicia.
        • Cuanta TA0CCR0+1 ciclos de reloj.
        • Cuando se llega al final de la cuenta (TA0CCR0), se activa el flag CCIFG del registro TA0CCTL0. La interrupción se genera cuando la cuenta cambia del valor TA0CCR0 a 0.
        • Al utilizar el registro TA0CCR0 para el funcionamiento, no se puede utilizar para otras funcionalidades.
        • Si se selecciona el modo UP cuando TAR > TA0CCR0, TAR se pone a 0 de forma automática.
      • 10 ==> modo continuo (COUNTINUOUS).
        • En este modo de operación, el registro T0AR cuenta desde 0x0000 hasta 0xFFFF que es el valor máximo del registro TA01.
        • Se cuentan 0x10000 = 65536 ciclos de reloj.
        • En este caso no se utiliza el registro TA0CCR0 y por tanto se puede usar para otras funcionalidades.
        • Se genera una interrupción cuando la cuenta pasa de 0xFFFF a 0x0000.
        • Cada vez que la cuenta alcanzar el valor TA0CCR0, TA0CCR1 o TA0CCR2, se genera una interrupción CCIFG, donde CCIFG es un flag del registro TA0CCTL0, TA0CCTL1 o TA0CCTLL2, función de cuál sea el registro TA0CCRx que se active.
      • 11 ==> modo ascendente/descendente (UP/DOWN).
        • El registro TA0R cuenta repetidamente desde 0 hasta el valor almacenado en el registro TA0CCR0 (cuenta ascendente) y de nuevo a 0 (cuenta descendente).
        • Se cuenta dos ciclos de la señal de reloj.
        • Al utilizar el registro TA0CCR0 para su funcionamiento, dicho registro no se puede utilizar para otras funcionalidades.
        • Ojo porque la interrupción en modo descendiente se genera cuando la cuenta pasa de 0x0001 a 0x0000, es decir contamos primero ascendentemente hasta el valor de TA0CCR0 y luego descendentemente hasta 0x0001. Cuando se pasa a 0x0000 se genera la interrupción y de nuevo se vuelve a contar ascendentemente.
    • El bit TACLR nos permite inicializar el contador:
      • Inicializa la cuenta a 0 escribiendo 0x0000 en el registro TAR.
      • Acto seguido el bit TACLR se pone a 0 automáticamente.
      • En caso de que el modo de operación seleccionado sea ascendente/descendente, inicializa la cuenta a ascendente.
      • La cuenta también se puede inicializar a un valor determinado escribiendo dicho valor en el registro TA0R.
  • Activación y desactivación del contador.
    • El contador comienza su funcionamiento si se cumplen todas las condiciones siguientes:
      • La señal de reloj fuente está activa.
      • El modo de operación no es STOP (MC0 = 0 y MC1 = 0).
      • En el modo de operación ascendente o ascendente/descendente, el valor del registro TA0CCR0 es distinto de 0x0000.
    • El contador detiene su funcionamiento cuando se cumple alguna de las siguientes condiciones:
      • La señal de reloj fuente está inactiva.
      • El modo de operación está parado.
      • En el modo de operación ascendente/descendente, el valor del registro TA0CCR0 es 0x0000.
  • Consideraciones sobre el contador.
    • Al detener el contador se mantiene el estado actual del mismo, de forma que al reanudar su funcionamiento continúa su operación a partir de dicho estado.
    • Si se detiene el contador escribiendo el valor 0x0000 en el registro TA0CCR0, al reanudar el funcionamiento cambiando el valor de dicho registro, se inicializa la dirección de la cuenta a ascendente en el modo de operación ascendente/descendente.
  • Cambio de configuración.
    • Antes de modificar la configuración del contador es recomendable detener el timer para evitar operaciones erróneas. Para detener el timer se tienen varias alternativas como hemos visto antes.
    • Si se realiza la modificación sin parar el timer se tienen las siguientes consecuencias:
      • Si se trabaja en modo ascendente: TAR > TA0CCR0 ==> TAR se inicializa a 0x0000.
  • Bloque comparador: compuesto por dos subsistemas:
    • Captura/comparación: contiene registros que en combinación del registro TA0R implementan las siguientes funcionalidades:
      • Almacenar el valor actual de la cuenta al detectar determinados eventos.
      • Comprobar el valor actual de la cuenta para generar determinados eventos.
    • Unidad de salida.
      • Contiene un módulo de salida (OUT0, OUT1 y OUT2) que en combinación con el TAR, TA0CCR0, TA0CCR1 y TA0CCR2 nos permite generar señales digitales en los pines del microprocesador.
  • Bloque captura/comparación.
    • Se puede trabajar con tres bloques de dos registros (TA0CCRx y TA0CCTLx) donde x varía entre 0, 1 y 2.
    • Estos bloques trabajan a la vez con el contador.
    • La elección de la forma de trabajo para estos dos registros, es decir, si trabajan en modo captura o comparación se hace a través del bit CAP del registro TA0CCTLx:
      • Un 0 indica comparación.
      • Un 1 indica captura.
    • MODO CAPTURA.
      • Cuando sucede un determinado evento, el valor del registro TA0R se almacena en el registro TA0CCRx.
      • Ese evento es un cambio de nivel (flanco) de determinadas señales que pueden ser o bien externas o internas.
      • Cuando se produce ese evento, trabajando en modo captura, se activa el flag de interrupción CCIFG del registro TA0CCTLx.
      • La señal a capturar (puede ser interna o externa al microcontrolador) se puede seleccionar mediante los bits CCIS0 y CCIS1 (Captura Compare Imput Select) del registro TA0CCTLx:
        • 00 ==> bit CCIxA.
        • 01 ==> bit CCIxB.
        • 10 ==> GND.
        • 11 ==> VCC.
      • Donde CCI0A y CCI1A se corresponden con los puertos P1.1 y P1.2.
      • Los bits CM0 y CM1 del registro TA0CCTLx nos permiten seleccionar el flanco a detectar:
        • 00 ==> no hay captura.
        • 01 ==> captura el flanco ascendente.
        • 10 ==> captura el flanco descendnete.
        • 11 ==> captura en ambos flancos.
      • El bit CCI permite leer el valor instantáneo de la señal a capturar.
      • El bit SCS permite sincronizar la entrada con el reloj del contador/temporizador, es decir, nos permite hacer una captura síncrona con al señal de reloj del contador (1) o asíncrona con la señal de reloj del contador (0). Esto se utiliza para resolver el problema que se tiene en caso de que el flanco de subida de la señal de reloj (se incremente la cuenta) se produzca en el momento en el cual cambia la señal que genera el evento. Si SCS se encuentra a nivel alto, la captura se hace en el flanco de bajada de la señal de reloj y por tanto no habría problemas.
      • El bit SCCI del registro TA0CCTLx contiene el valor digital sincronizado de la señal a capturar. Es decir contiene el valor instantáneo de la señal a capturar sincronizado con la señal de reloj del temporizador, o lo que es lo mismo, ese valor sólo cambia en los flancos de bajada de la señal del temporizador.
      • En el modo comparación el registro TA0CCRx se almacena la cuenta que se pretende lleva a cabo y en el modo captura se registra el valor que tiene TAR cuando se produce un determinado evento.
    • MODO COMPARACIÓN.
      • El proceso de comparación se utiliza para comprobar si el valor de la cuenta (registro TAR) coincide con un valor establecido (almacenado en uno de los registro TA0CCRx).
      • Cuando suceda que el valor almacenado en estos registros es igual al de la cuenta se deben generar ciertos eventos (interrupciones).
      • Cuando el valor del registro TAR coincide con el valor establecido en el registro TA0CCRx se realizan las siguientes operaciones:
        • En el bit SSCI se almacena el valor instantáneo de la señal CCI. Esa señal se determina mediante los bits CCIS0 y CCIS1.
        • La señal EQUx se pone a 1.
        • Se activa el flag de interrupción CCIFG del registro TA0CCTLx.

Puertos de entrada/salida

Los puertos de entrada/salida nos permiten introducir (entrada) o extraer (salida) valores digitales en el microcontrolador a través de sus pines. Si se configuran como entrada permiten comprobar el valor de las señales digitales generadas por dispositivos externos como pulsadores o teclados a través de sus terminales. Cuando se configuran como salida permiten generar señales digitales para controlar dispositivos externos como LEDs y relés.

El microcontrolador MSP430G2553 dispone de dos puertos de entrada/salida. Estos puertos constan de 8 pines cada uno. Se utiliza la notación PX.x para denotar el pin x del puerto X. Así P1.2 es el pin 2 del puerto 1.

Los puertos de entrada/salida son periféricos que incorpora el microcontrolador. La CPU ve a los periféricos como un conjunto de registros. Modificando el valor de estos registros podemos configurar el periférico para que realice las funciones deseadas.

  • Registros P1DIR Y P2DIR:  nos permiten determinar la dirección de cada pin de los puertos E/S P1 y P2, es decir, determina si un pin va a actuar como entrada o como salida. Son registros de 8 bits, donde el i-ésimo bit se corresponde con el pin i-ésimo:
    • Si el bit i-ésimo está a 0 ==> el pin i-ésimo actúa como entrada.
    • Si el bit i-ésimo está a 1 ==> el pin i-ésimo actúa como salida.
  • Registros P1IN y P2IN: en caso de que el pin actúe como entrada, estos regisros, nos permiten determinar el valor de ese pin. Estos registros son de lectura, en consecuencia cualquier escritura es ignorada, provocando un aumento del consumo de corriente. Existen limitaciones para la señal de entrada que se introduce en un determinado pin.
    • Si el bit i-ésimo está a 0 ==> la señal conectada al pin i-ésimo se encuentra a nivel bajo.
    • Si el bit i-ésimo está a 1 ==> la señal conectada al pin i-ésimo se encuentra a nivel alto.
  • Registros P1OUT y P2OUT: en caso de que el pin actúe como salida, estos registros nos permiten determinar el valor de de esa salida. Existe una limitación de 48 mA para la cantidad máxima de corriente de salida.
    • Si el bit i-ésimo está a 0, la señal digital del pin i-ésimo toma el valor 0.
    • Si el bit i-ésimo está a 1, la señal digital del pin i-ésimo toma el valor 1.
  • Registros P1REN Y P2REN (Resistor ENable): cada pin de los puertos de E/S dispone de una resistencia que se puede habilitar mediante los bits de los registros P1REN y P2REN. Si el pin está configurado como entrada se pueden configurar resistencias de PULL-DOWN o PULL-UP en ese pin mediante los bits del registro P1OUT y P2OUT. EStas resistencias deben estar habilitadas en los registros P1REN Y P2REN. Si el bit i-ésimo se pone a 0, la resistencia de pull-down se configura en el pin i-ésimo. Si el bit i-ésimo se pone a 1, la resistencia de pull-down se configura en el pin-iésimo. Recordemos que una resistencia de pull-up es una resistencia que se conecta a VCC para poner un nivel alto en la salida cuando el transistor que hay conectado en ese pin no conduce. Nos permiten a su vez poner un nivel bajo a la salida cuando transistor conduce. La resistencia de pull-down realiza una función similar aunque ésta se conecta a tierra.
    • Si el bit i-ésimo se pone a 0, la resistencia se deshabilita.
    • Si el bit i-ésimo se pone a 1, la resistencia de habilita.
  • Oscilaciones: cada pin de los puertos entrada/salida P1 y P2 posee la capacidad de producir oscilaciones cuya frecuencia depende de la capacidad de carga del pin. Esto se hace haciendo uso de los registros P1SEL, P1SEL2, P2SEL Y P2SEL2. Si se selecciona la funcionalidad de oscilación de un pin, se deshabilitan automáticamente el resto de funcionalidades de dicho pin. A su vez no se permite habilitar la funcionalidad de oscilacón en más de un pin del dispositivo simultáneamente.
  • Interrupciones en los puertos de entrada/salida: los pines de los puertos E/S de P1 y P2 pueden genera interrupciones. Estas interrupciones se generan cuando se detecta un cambio en el nivel de la señal digital conectada al pin. Se puede elegir si ese cambio de nivel puede ser en flanco de subida o bajada. Todos los pines de un mismo puertos E/S comparten la misma interrupción, es decir, la interrupción presenta múltiples (en este caso 8, una por pin) fuentes. El flag de interrupción está asociado a múltiples fuentes y en consecuencia debe ser el programador el que lo desactiva (no se desactiva automáticamente al ejecutar la RTI). Las interrupciones generadas en los puertos E/S son enmascarables, es decir se pueden habilitar/deshabilitar de forma global a través del bit general de habilitación GIE o a través de bit de habilitación específicos. Para el caso de los puertos E/S, esos bits son los de los registros P1IE y P2IE.
    • Si ponemos el bit i-ésimo del registro P1IE a nivel bajo se deshabilita la interrupción para el pin i-ésimo de ese registro.
    • Si ponemos el bit i-ésimo del registro P1IE a nivel alto se habilita la interrupción para el pin i-ésimo de ese registro.
    • El funcionamiento es el mismo para el registro P2IE.
  • Flanco de subida/flanco de bajada: la interrupción se genera por un cambio de nivel en un pin de un puerto. Ese cambio de nivel se puede especificar mediante los bits de los registros P1IES y P2IES.
    • Si el bit i-ésimo del registro P1IES se pone a 0, la interrupción que se puede generar en el pin i-ésimo se genera en el flanco de subida.
    • Si el bit i-ésimo del registro P1IES se pone a 1, la interrupción que se puede generar en el pin i-ésimo se genera en el flanco de bajada.
  • Interrupciones pendientes: la CPU tiene constancia de una interrupción generada en un puerto E/S a través de los bits de los registros P1IFG y P2IFG. 
    • Si el bit i-ésimo del registro P1IFG está a nivel bajo, no hay interrupción pendiente asociada al pin i-ésimo del puerto 1.
    • Si el bit i-ésimo del registr P1IFG está a nivel alto, hay interrupción pendiente asociada al pin i-ésimo del puerto 1.
    • Una consideración importante es que si se modifican los registros P1DIR Y P2DIR, P1OUT, P2OUT, P1IES ó P2IES, se pueden activar los correspondientes flag de interrupción en alguno de los registros P1IFG ó P2IFG. Es recomendable inicializar a 0 dichos flags tras modificar alguno de los registros indicados. A su vez cada bit se pone de forma automática a 1 cuando se produce un flanco activo en el terminal de entrada asociado. Eso genera una interrupción pendiente.
  • Funcionalidad de un pin:  se puede seleccionar mediante los bits P1SEL, P2SEL, P1SEL2 Y P2SEL2. 
En resumen:
  • P1DIR y P2DIR: nos permiten determinar si un pin de un puerto va a actuar como entrada (0) o como salida (1).
  • P1IN y P2IN: en caso de que el pin actúe como entrada, el valor que toma la señal de entrada se almacena en este registro.
  • P1OUT y P2OUT: en caso de que el pin actúe como señal de salida, la salida se puede configurar mediante estos registros.
  • P1REN y P2REN: cada pin dispone de una resistencia. Esta resistencia se puede habilitar/deshabilitar con los pines de estos registros. Si se habilita la resistencia, se puede determinar el tipo de resistencia (pull-up(1) o pull-down(0)), mediante los registros P1OUT y P2OUT.
  • P1SEL, P1SEL2, P2SEL, P2SEL2: permiten determinar el modo de funcionamiento de un determinado puerto (que el puerto funcione como E/S, produzca oscilación, etc.).
  • P1IE y P2IE: las interrupciones generadas por los puertos E/S son enmascarables. Se pueden habilitar/deshabilitar mediante los bits de habilitación individual o el bit general de habilitación. En el caso de los puertos E/S, los bits de habilitación individual específicos son los bits de este registro.
  • P1IES y P2IES: nos permite determinar si la interrupción que se genera en un puerto se hace por flanco de subida (0) o bajada (1).
  • P1IFG y P2IFG: cuando se genera una interrupción de E/S se activa un flag asociado a esa interrupción. En el caso de los puertos E/S, ese flag es uno de los bits de estos registros. Si el bit está a 1 indica que existe una interrupción pendiente, si está a 0 no hay interrupción pendiente.
Una consideración importante es el comportamiento que presenta el dispositivo cuando se enciende. Por defecto, las interrupciones que se generan en los puertos se encuentran deshabilitadas (registros P1IE y P2IE 0x0000). 

Los pulsadores (P1 y P2) son entradas del micro. Estos se encuentran conectados a tierra, en consecuencia para generar valores es necesario hacer uso de resistencias de pull-up (conectadas a VCC), de forma que si se pulsa se meta un 0 (flanco de bajada se produce) y si se despulsa se pone un 1 flanco de subida.

Sistema de relojes

Un microcontrolador es un sistema electrónico digital programable integrado en un único chip. Desde el punto de vista hardware el microcontrolador está formado por módulos y conexiones. Un módulo se puede ver como una caja negra que se encarga de una determinada tarea. Las conexiones conectan los módulos.

Uno de los módulos del microcontrolador es el módulo de reloj. Este módulo se encarga de la generación y distribución de señales de reloj, tanto para los dispositivos como para los periféricos. El hecho de conocer este módulo es de vital importancia para implementar soluciones de bajo consumo de energía y obtener mayor precisión en nuestras aplicaciones.

El módulo de reloj incluye fuentes de reloj y señales de reloj. El módulo de reloj genera las señales de reloj haciendo uso de las fuentes de reloj. Las fuentes de reloj son circuitos osciladores internos o externos al microcontrolador que generan señales eléctricas de frecuencia fija. Estas fuentes de reloj presentan parámetros configurables mediante software. 

Una señal de reloj es una señal cuadrada que en el caso del microcontrolador reciben todos los circuitos secuenciales (CPU, periféricos, memoria) y que nos permiten sicronizar el funcionamiento.. Dentro del microcontorlador existen varias señaels de reloj para la CPU y los distintos periféricos y varias fuentes de reloj que generan estas señales. El microcontrolador tiene tres fuentes de reloj para la CPU y periféricos. Dichas fuentes de reloj son LFXT1CLK, VLOCLK y DCOCLK. A su vez presenta las siguientes señales de reloj  ACLK, MCLK y SMCLK.

Las fuentes de reloj se pueden configurar haciendo uso de los registros de configuración del sistema de relojes. Se tienen cuatro registros de 8 bits que nos permiten configurar dichas fuentes:

  • Registro DCOCLT: nos permite configurar los parámeros del oscilador RC de la fuente de reloj DCOCLK. El estado inicial tras un reset es 0x60.
  • Registro BCSCTL1: nos permite configurar parámetros del DCO (circuito, no fuente, la fuente sería DCOCLK), la señal ACLK y el oscilador XT2. El estado inicial tras un reset es 0x87.
  • Registro BCSCTL2: nos permite configurar la selección de las fuentes de reloj para las señales MCLK y SMCLK. El estado inicial tras un reset es 0x00.
  • Registro BCSCTL3: configura los parámetros relacionados con el oscilador XT1 y XT2. El estado inicial tras un reset es 0x05.
Cuando encendemos el dispositivo (evento RESET ==> señal POR ==> señal PUC), los registros de configuración del sistema de relojes toman un valor por defecto. Ese valor por defecto va a determinar el estado de arranque del sistema de relojes tras el encendido del microcontrolador y en consecuencia va a determinar las señales MCLK, SMCLK y ACLK. Se tiene que la fuente por defecto es DCOCLK y ésta trabaja a una frecuencia de 1,1 MHz.

Podría haber únicamente una señal de reloj y una fuente para todo el microcontrolador, pero este sistema de relojes está pensado para optimizar rendimiento y las necesidades de consumo. Así para el caso de que se necesite rendimiento se hace uso de un reloj de alta frecuencia de inicio rápido y alto consumo (DCOCLK) para ejecutar el código lo más rápido posible. En caso de necesitar ajo consumo se hace uso de fuentes de baja frecuencia (LFXT1CLK y VLOCLK). Los relojes que no se vayan a utilizar se apagan para que no consuman.

Señales de reloj.
Se tienen las siguientes señales de reloj:
  • MCLK (master clock): puede ser generada por cualquiera de las fuentes (VLOCLK, DCOCLK y LFXT1CLK). Es el reloj de la CPU y del sistema. La frecuencia de la señal puede ser dividida entre 1, 2, 4 y 8.
  • SMCLK (sub-main clock): señal que va a los periféricos. Puede ser generada por cualquiera de las fuentes (DCOCLK, VLOCLK, LFXT1CLK). Puede ser dividido por 1, 2, 4 y 8.
  • ACLK (auxiliary clock): señal que va a los periféricos. Se obtiene a partir de la fuente VLOCLK o un cristal externo (LFXT1CLK). La frecuencia puede ser dividida entre 1, 2, 4 y 8. Se usa para proveer a los periféricos una señal de reloj cuando la CPU está a pagada.
Fuentes de reloj.

  • LFXT1CLK: se trata de un oscilador que puede trabajar en baja o alta frecuencia. Cuando trabaja en baja frecuencia usa un oscilador externo donde la frecuencia es de 32768 Hz = 2^15, conectándolo entre los terminales XIN y XOOUT. Cuando trabaja en alta frecuencia (400 kHz a 16MHz) pueden conectarse cristales de mayor frecuencia o resonadores en los mismos terminales que en el modo de baja frecuencia. Para el caso del cristal externo, en caso de tener que usar dicho cristal es necesario soldarlo a la placa. También es posible introducir señales externas de reloj sólo en el pin XIn. Habrá que asegurarse de que la frecuencia de esa señal externa esté dentro de los parámetros enunciados en el datasheet del dispositivo. Observemos que operando en baja frecuencia, la frecuencia es bastante baja en comparación de otras fuentes como DCOCLK. Frecuencia baja implica bajo consumo (se suele hablar en este caso de ultra bajo consumo). Se utiliza para genera las señales MCLK, SMCLK y ACLK. Es excluyente con VLOCLK, es decir, no podemos usar a la vez las dos fuentes. Esta fuente se utiliza cuando se precisa una mayor precisión y estabilidad. La frecuencia de la señales que se generan a partir de esta fuente será la indicada en las características y ésta tendrá una variación despreciable con el tiempo y la temperatura. Una desventaja importante es que cuando encendemos el dispositivo, el cristal requiere ciertos milisegundos para estabilizarse y poder oscilar a la frecuencia indicada. Se puede deshabilitar por software poniendo a 1 el bit OSCOFF del registro de estado. Esto se puede hacer siempre y cuando LFXT1CLK no sea la fuente de reloj de las señales MCLK y SMCLK. Por tanto sólo se puede deshabilitar si se está usando para la señal ACLK y no se usa para las otras señales.
  • VLOCLK (Very Low Power, Low Frecuency Oscilator): oscilador de bajo consumo y frecuencia. El oscilador (circuito) recibe el nombre de VLO, mientras que la fuetne VLOCLK. El oscilador es RC y es interno. Trabaja con una frecuencia típica de 12 kHz. Esa frecuencia es fija, es decir, no la podemos cambiar por software, pero ésta puede cambiar por cuestiones de temperatura y alimentación  (0.5 % /ºC y 4% /V). Se mueve en el margen de 4 a 20 kHz. Se utiliza en aplicaciones de bajo consumo. Es excluyente con la fuente LFXT1CLK, es decir, si está seleccionado VLOCLK se desactiva la fuetne LFXT1CLK. Deshabilitado por software poniendo a 1 el bit OSCOFF del registro de estado. Se utiliza para generar las señales MCLK (que va a la CPU) y ACLK (que va a los periféricos). En general esta fuente de reloj se usa en aplicaciones en las cuales no sea necesaria la precisión y sea necesario el bajo consumo. Se trata de un oscilador de baja precisión, frecuencia y muy bajo consumo pero poco estable a cambios en la temperatura. Para la configuración de este reloj se trabaja con los registros de configuración del sistema de relojes:
    • BCSCTL1: configurando los bits XT2OFF.
    • BCSCTL2: configurando los bits SELMx (0|1), SELS y DIVMx (0|1).
  • DCOCLK (Digitally Controlled Oscillator): es un oscilador interno (RC, resistencia-condensador serie) denominado DCO de alta frecuencia. Se usa para generar las señales MCLK (CPU) y SMCLK (periféricos). Esta fuente genera una señal cuya frecuencia varía con la temperatura, voltaje o de un microcontrolador a otro. Esa frecuencia se puede programar mediante los bits de los registros de configuración DCOCTL y BCSCTL1. El dispositivo ha sido calibrado de fábrica con 4 frecuencias: 1, 8, 12 y 16 MHz. El fabricante almacena en la flash (0x1000- 0x10FF) el valor que deben tomar los registros DCOCTL y BCSCTL1 para que la fuetne genera una señal a esa frecuencia concreta. En el archivo de cabecera, existen unas constantes simbólicas con el nombre CALB1_XMHZ CALDCO_XMHZ (donde X varía entre 1, 8, 12 y 16). El valor de estas constantes es una dirección de memoria. Esa dirección de memoria se corresponde con una zona de la flash donde el fabricante ha almacenado un valor que hace que el dispositivo trabaje a una frecuencia concreta. Las constantes que empiezan con el nombre de CALBC1_ es el valor que hay que almacenar en el registro de configuración BCSCTL1, mientras que las que empiezan por CALDCO es el valor que hay que almacenar en el registro de configuración DCOCTL. Una de las desventajas de usar la calibración de fábrica es el hecho de que Texas Instrument realiza sus calibraciones a 30ºC y 3V. Si nuestro sistema ha de operar lejos de estos valores, la calibración no será buena. Algunas consideraciones de esta fuente de reloj son las siguientes:
    • Una ventaja de esta fuente de reloj es el bajo tiempo de encendido (en menos de 1 us tenemos una señal de reloj estable con la frecuencia deseada).
    • Se puede deshabilitar por software, siempre que DCOCLK no sea la fuente de reloj de las señales MCLK o SMCLK en modo activo. Para ello se pone a 1 el bit SCG0 del registro de estado.
    • Es el reloj por defecto tras la señal (PUC y por tanto tras la señal POR) operando a 1,1 MHz aproximadamente.
    • Para el caso de trabajar con señales de reloj calibradas se tiene un error máximo del 6% en la frecuencia.
    • Para el caso de trabajar con señales de reloj no calibradas, el error máximo en la frecuencia puede ser del 23%.
  • XT2CLK: se trata de una fuente opcional de alta frecuencia que puede ser usada con un cristal estándar, resonador o reloj externo trabajando en un rango de 400 kHz-16MHz.
Resumen.
  • Elección de las fuetnes VLOCLK o LFXT1CLK: a través de los bits 4 y 5 (LFXT1Sx) del registro de configuración del sistema de relojes BCSCLT3.
  • Elección de la fuente de la señal MCLK: mediante los bits 6 y 7 (SELMx) del registro BCSCTL2.
  • Elección de la fuente de la señal SMCLK: mediante el bit 3 del registro BCSCTL2.
  • Elección de la fuente de la señal ACLK al elegir entre VLOCLK y LFXT1CLK: a través de los bits 4 y 5 del registro BCSCLT3.
  • Dividir la frecuencia de MCLK: (bit 4-5) del registro BCSCTL2.
  • Dividir la frecuencia de SMCLK: (bit 2-1) del registro BCSCTL2.
  • Dividir la frecuencia de ACLK: (bit 5-4) del registro BCSCTL1.
  • Determinar la frecuencia de la fuetne DCOCLK: (RSELx registro BCSCTL1 y MODx, DCOx del registro DCOCTL).
  • Habilitación/Deshabilitación de la fuente DCOCLK: bit SCGO0 del registro de estado. Si se pone a 1 se deshabilita, a 0 se habilita.
  • Habilitación/Deshabilitación de la fuente VLOCLK y LFXT1CLK: mediante el bit OSCOFF del registro de estado. Si se pone a 1 deshabilitado, a 0 habilitado. Hay que tener en cuenta que con ese bit se puede habilitar/deshabilitar los dos puesto que las dos fuentes son excluyentes.

Anidamiento de interrupciones


  • Anidamiento de interrupciones: determinar el comportamiento del microcontrolador cuando, ejecutando el código de la RTI asociada a una interrupción se genera otra. En primer lugar hay que tener en cuenta que antes de ejecutar la RTI asociada a una determinada interrupción, el registro de estado toma el valor 0x0000. En consecuencia el bit GIE = 0 y por tanto las interrupciones enmascarables se encuentran deshabilitadas. Que estén deshabilitadas no implica que no se vayan a atender, implica que durante ese trozo de código, éstas se ignoran. Las interrupciones quedan pendientes (el flag de interrupción se encuentra a 1). Cuando se termine de ejecutar el código de la RTI (se termine con RETI), las interrupciones pendientes se atienden (atendiendo a aquella interrupcón que presente mayor prioridad). En caso de activar el bit GIE dentro del código de la RTI, las interrupciones enmascarables no se ignoran. Las interrupciones no enmascarables no se ignoran si estas se producen dentro del código de la RTI asociada a una determinada interrupción. De la misma forma las interrupciones (no) enmascarables (NMI) tampoco se ignoran si éstas se encuentran habilitadas. Si habilitamos las interrupciones enmascarables (bit GIE) dentro del código de una RTI, en caso de que se genere una interrupción mientras se están ejecutando el código, éstas son atendidas. Así se ejecuta la RTI asociada a esa interrupción generada y cuando se termine dicha interrupción se continua por el código asociado a la primera de las interrupciones que se generó.
  • Consideraciones sobre interrupciones.
    • La interrupción que se está ejecutando cuando sucede una interrupción se termina.
    • Anidamiento de interrupciones (interrupción cuando se ejecuta el códido de la RTI de otra):
      • Interrupciones no enmascarables no se ignoran.
      • Las interrupciones NMI no se ignoran siempre que se encuentren habilitadas. (bits de habilitación individuales del registro de habilitación de interrupciones IE1). Recordemos que sólo hay 3 tipos de interrupciones NMI y se habilitan/deshabilitan con los bits (NMIIFG, OFIFG y ACCVIFG) del registro IE1.
    • Las interrupciones presentan prioridades: si existen interrupciones pendientes se selecciona aquella que presente más prioridad. Cuando se termina de ejecutar la RTI asociada a una determina interrupción, en caso de quedar pendiente interrupciones, se ejecuta aquella que presente mayor prioridad. El proceso continua hasta que no haya interrupciones pendientes.
    • Si sucede una interrupción NMI y ésta se encuentra deshabilitada por los bit del registro IE1, estas quedan pendientes. Quedar pendiente es que el flag de interrupción permanece a 1.

martes, 25 de junio de 2013

INTERRUPCIONES EN EL MSP430

Conceptos previos.


  • Evento: cualquier cambio en las entradas, salidas o periféricos internos del microprocesador cuya ocurrencia interesa detectar.
  • Interrupción: una interrupción es el nombre que se le da a la situación que se produce cuando la CPU deja de ejecutar el código de un programa y pasa a ejecutar el código correspondiente a una RTI (rutina de tratamiento de información). Existen dos tipos de interrupciones:
    • Hardware: cuando la CPU recibe una señal eléctrica. Esa señal informa a la CPU que se ha producido un evento y éste requiere su atención. En el MSP430 se trabaja con este tipo de interrupciones. Estas interrupciones se pueden habilitar o deshabilitar (enmascarar). Esto se puede implementar mediante el bit GIE del registro de estado (bit de habilitación general) o bit de algún determinado registro.
    • Software: llamadas al sistema.
  • Flag de interrupcion: es un bit de un registro que se activa cuando sucede un evento (se utilizan para hacer constar a la CPU la ocurrencia de un evento). Estos flags se localizan en el MSP430 en los registros especiales de la CPU. También se utilizan para notificar interrupciones pendientes.
  •  Mecanismo de interrupciones: es el mecanismo que utiliza el micro MSP430 para dar respuesta rápida a eventos. Consideraciones sobre este mecanismo:
    • Las interrupciones se notifican activando un flag de interrupción.
    • Existen interupciones que se pueden habilitar/deshabilitar(enmascarar).
    • MSP430 trabaja con un mecanismo de interrupciones con prioridad. El sistema atiende aquellas interrupciones que presenten más prioridad, quedando pendientes el resto (quedar pendiente significa que el flag de interrupción permanece activo). La prioridad de las interrupciones no la puede determinar el usuario, se establece de fábrica.
    • Antes de ejecutar la rutina de tratamiento de información (RTI):
      • La siguiente instrucción a ejecutar se almacena en la pila.
      • El valor del registro de estado se almacena en la pila.
      • El registro de estado toma el valor 0x0000. Al tomar ese valor 0x0000, el bit GIE se pone a 0, es decir, las interrupciones enmascarables se encuentran deshabilitadas.
      • Si la interrupción es generada por una única fuente, el flag de interrupción se pone a 0 automáticamente.
      • Si la interrupción está asociada a múltiples fuentes, el flag de interrupción debe ser puesto a 0 por parte del programador.
  • Interrupciones en el MSP430:
    • Interrupciones no enmascarables: interrupciones que no se pueden deshabilitar. En el MSP430 estas interrupciones están asociadas a eventos tipo RESET.
    • Interrupciones (no) enmascarables (NMI): interrupciones que no se pueden enmascarar mediante el bit de habilitación general (GIE) del registro de estado. Pero sí que se pueden enmascarar por bits de habilitación individuales (NMIE, ACCVIE, OFIE) del registro de habilitación de interrupciones (IE1). A este registro se accede desde el programa IAR con la opción registros, "SPECIAL FUNCTION". Las posibles causas de las interrupciones NMI son las siguientes:
    • Interrupciones enmascarables: estas interrupciones se pueden deshabilitar por los bits de habilitación individuales de cada interrupción o por el bit de habilitación general GIE. Si se deshabilitan con el bit GIE, se deshabilitan todas las interrupciones enmascarables. Así pueden deshabilitarse de manera local mediante los bits de habilitación individuales o de manera global mediante el bit GIE.
  • RESET: es un evento especial que lleva asociado una interrupción no enmascarable. Puesto que la interrupción no se puede deshabilitar, se usa para "sacar" a la CPu de cualquier situación en la que se encuentre. Nos permite definir un estado inicial para el sistema. El MSP430 presenta dos señales RESET:
    • POR (Power On Reset): la señal se genera:
      • Al encender el dispositivo.
      • Cuando hay problemas de alimentación.
    • PUC (Power Up Clear): la señal se genera:
      • Cuando se produce un PUR.
      • Cuando se expira el tiempo de Watchdog.
      • Violación de la clave de seguridad.
De las dos señales POR están asociadas a aspectos hardware, mientras que PUC está asociada a aspectos software. Un RESET hardware provoca un reset software, el recíproco no es cierto.
Este evento permite definir el estado inicial del sistema. Cuando se inicializa el sistema, el contador de programa carga la dirección de memoria almacenada en 0xFFE0 + RESET_VECTOR. Tras el rESET, el software de usuario debe encargarse de inicializar la pila, configurar el watchdog de forma adecuada y configurar los periféricos que se vayan a utilizar.
  • Vector de interrupción: se puede ver como un array (reserva de una serie de posiciones consecutivas de memoria) ubicado al final de la memoria (0xFFE0-0xFFFF) de programa cuya finalidad es almacenar las direcciones de memoria de las RTI para una determina interrupción. Cuando sucede una interrupción, la CPU recurre a este vector para saber dónde se halla la RTI asociada a la interrupción que se produjo. Cada periférico tiene asociado intrínsicamente una posición en el array. Es responsabilidad del programador inicializar correctamente los valores almacenados en el vector de interrupción para que cada interrupción se pueda localizar correctamente. En el archivo de cabecera (*.h) del microcontrolador existen unas constantes asociadas a interrupciones concretas, de forma que, si se suma la dirección de memoria 0xFFE0 + una de esas constantes y almacenamos el en esa dirección de memoria la posición de memoria (del código) donde se ubica la primera instrucción de la RTI asociada a una interrupción, el microcontrolador, cuando se produzca una interrupción busca en la posición del array la RTI asociada a esa interrupción. Nuestro programa siempre debe contener una entrada para la interrupción RESET. Sin esta interrupción, el programa no funciona cuando el micro se enciende se genera un RESET (señal PON y en consecuencia PUC). 
/************************************************************
* Interrupt Vectors (offset from 0xFFE0)
************************************************************/

#define PORT1_VECTOR        (2 * 2u)  /* 0xFFE4 Port 1 */
#define PORT2_VECTOR        (3 * 2u)  /* 0xFFE6 Port 2 */
#define ADC10_VECTOR        (5 * 2u)  /* 0xFFEA ADC10 */
#define USCIAB0TX_VECTOR    (6 * 2u)  /* 0xFFEC USCI A0/B0 Transmit */
#define USCIAB0RX_VECTOR    (7 * 2u)  /* 0xFFEE USCI A0/B0 Receive */
#define TIMER0_A1_VECTOR    (8 * 2u)  /* 0xFFF0 Timer0)A CC1, TA0 */
#define TIMER0_A0_VECTOR    (9 * 2u)  /* 0xFFF2 Timer0_A CC0 */
#define WDT_VECTOR          (10 * 2u) /* 0xFFF4 Watchdog Timer */
#define TIMER1_A1_VECTOR    (12 * 2u) /* 0xFFF8 Timer1_A CC1-4, TA1 */
#define TIMER1_A0_VECTOR    (13 * 2u) /* 0xFFFA Timer1_A CC0 */
#define NMI_VECTOR          (14 * 2u) /* 0xFFFC Non-maskable */
#define RESET_VECTOR        (15 * 2u) /* 0xFFFE Reset [Highest Priority] */


#endif /* __IO430xxxx */
  • Proceso de una interrupción:
  1. Se produce un evento (cambio en una de las entradas, salidas o en los periféricos internos (watchdog, temporizadores, etc.) del microcontrolador.
  2. Se activa el flag de interrupción asociado a ese evento (una interrupción puede estar asociada a varias fuentes). (Registro IE1).
  3. Se pone en marcha el proceso de tratamiento de interrupción.
  4. En función de cómo se encuentre la CPU se tienen dos casos: que la CPU se encuentra ejecutando una instrucción del programa. Para poner en marcha el proceso de interrupción se espera a que se termine de ejecutar la instrucción en curso. O bien que la CPU se encuentre dormida. La CPU se encuentra parada, es decir, no se encuentra ejecutando instrucciones. Se finaliza "temporalmente" el estado de bajo consumo hasta que se haya tratado completamente la interrupción.
  5. Se almacena en la pila la dirección de memoria de la siguiente instrucción del código del programa que se estaba ejecutando.
  6. Se almacena en la pila el valor del registro de estado.
  7. Al hecho de almacenar en la pila (zona de la RAM) el PC y el SR se le conoce como aceptación de la instrucción.
  8. Si existen varias interrupciones pendientes se selecciona aquella que presente más prioridad (la selecciona el micro automáticamente).
  9. Si el flag de interrupción está asociado a una sóla fuente, se borra (pone a 0) el flag de interrupción asociado al evento que provocó la interrupción. Si la CPU no hiciera esto, entendería que el evento se está produciendo continuamente. Si la interrupción está asociada a múltiples fuentes (varios eventos) el programador es el que debe desactivarlo.
  10. El registro de estado toma el valor 0x0000. En consecuencia se deshabilitan todass las interrupciones enmascarables (GIE = 0).
  11. El contenido del vector de interrupción, es decir la dirección de memoria de la primera instrucción de la RTI asociada a la interrupción concreta se carga en el contador de programa.
  12. Se ejecuta la secuencia de sentencias de la RTI.
  13. La RTI termina con la instrucción RETI (REtorn interrupTIon).
  14. Se aplica un par de push (extraer dato de la pila) y el el registro de estado toma el valor que tenía antes de que se ejecutar la RTI y se el SP toma el valor de la siguiente instrucción a ejecutar.