- ¿Por qué necesitamos interrumpir?
- Tipos de interrupción en MSP430
- Interrumpir el control del programa en MSP430
- Circuito MSP430 para probar la interrupción GPIO
- Programación de MSP430 para interrupciones
- Carga del programa a MSP430 desde CCS
- Interrumpir programa en MSP430
Considere un simple reloj digital que está programado para mostrarle la hora, ahora imagine que desea cambiar su zona horaria. ¿Qué harías? Simplemente presione un botón que cambia al menú que le permite cambiar la zona horaria. Aquí, el sistema no puede predecir su interrupción externa a sus procesos de cronometraje y no puede pedirle que espere ya que está ocupado incrementando el valor de los segundos en su reloj. Aquí es donde las interrupciones son útiles.
Las interrupciones no siempre tienen que ser externas; también puede ser interno. La mayoría de las veces en una interrupción integrada también se facilita la comunicación entre dos periféricos de la CPU. Considere que un temporizador preestablecido se reinicia y se activa una interrupción cuando el tiempo alcanza el valor en el registro del temporizador. El controlador de interrupciones se puede utilizar para iniciar los otros periféricos como DMA.
En este tutorial, hemos utilizado las interrupciones externas en MSP430 para alternar diferentes LED. Cuando se da una interrupción externa por el cambio de estado mediante un pulsador, el control se transfiere (se adelanta) al ISR y éste hace lo necesario. Para conocer los conceptos básicos, como la configuración del entorno CCS para la plataforma de lanzamiento MSP430G2, siga este enlace para comenzar con MSP430 usando CCS porque no entraremos en detalles de eso en este tutorial. También consulte otros tutoriales basados en MSP430 utilizando Energia IDE y CCS siguiendo el enlace.
¿Por qué necesitamos interrumpir?
Se necesitan interrupciones para ahorrar la sobrecarga de sondeo en un sistema integrado. Se llaman cuando las tareas con mayor prioridad deben ejecutarse adelantándose a la tarea en ejecución actual. También se puede usar para reactivar la CPU de los modos de bajo consumo. Cuando se despierta por la transición de borde de una señal externa a través de un puerto GPIO, el ISR se ejecuta y la CPU vuelve nuevamente al modo de bajo consumo.
Tipos de interrupción en MSP430
Las interrupciones en MSP430 se clasifican en los siguientes tipos:
- Reinicio de sistema
- Interrupción no enmascarable
- Interrupción enmascarable
- Interrupciones vectorizadas y no vectorizadas
Reinicio de sistema:
Puede ocurrir debido al voltaje de suministro (Vcc) y debido a una señal baja en el pin RST / NMI con el modo Reset seleccionado y también puede ocurrir debido a razones como el desbordamiento del temporizador de vigilancia y la violación de la clave de seguridad.
Interrupción no enmascarable:
Estas interrupciones no pueden ser enmascaradas por las instrucciones de la CPU. Una vez que se habilita la Interrupción general, la interrupción no enmascarable no se puede desviar del procesamiento. Esto es generado por fuentes como fallas del oscilador y un borde dado manualmente al RST / NMI (en modo NMI).
Interrupción enmascarable:
Cuando ocurre una interrupción y si puede ser enmascarada por una instrucción de CPU, entonces es interrupción enmascarable. No es necesario que sean siempre externos. También dependen de los periféricos y sus funciones. Las interrupciones del puerto externo utilizadas aquí pertenecen a esta categoría.
Interrupciones vectoriales e interrupciones no vectoriales:
Vectorizado: en este caso, los dispositivos que interrumpen nos proporcionan la fuente de la interrupción al pasar la dirección del vector de interrupción. Aquí la dirección del ISR es fija y el control se transfiere a esa dirección y el ISR se encarga del resto.
No vectorial: aquí todas las interrupciones tienen un ISR común. Cuando se produce una interrupción de una fuente no vectorizada, el control se transfiere a la dirección común, a la que comparten todas las interrupciones no vectorizadas.
Interrumpir el control del programa en MSP430
Cuando ocurre la interrupción, MCLK se enciende y se vuelve a llamar a la CPU desde el estado APAGADO. Como el control del programa se transfiere a la dirección ISR después de la ocurrencia de la interrupción, los valores en el contador del programa y el registro de estado se mueven a la pila.
Consecutivamente, el registro de estado se borra, borrando así el GIE y terminando el modo de bajo consumo. La interrupción con la prioridad más alta se selecciona y ejecuta colocando la dirección del vector de interrupción en el contador del programa. Antes de llegar a nuestro código de ejemplo de interrupción GPIO MSP430, es importante comprender el funcionamiento de los registros de puertos involucrados en él.
Registros de puertos para control GPIO en MSP430:
PxDIR: Es un registro de control de dirección de puerto. Permite al programador seleccionar específicamente su función escribiendo 0 o 1. Si un pin se selecciona como 1, entonces actúa como salida. Considere que el puerto 1 es un puerto de 8 bits, y si los pines 2 y 3 deben asignarse como puertos de salida, entonces el registro P1DIR debe configurarse con el valor 0x0C.
PxIN: Es un registro de solo lectura y los valores actuales en el puerto se pueden leer usando este registro.
PxOUT: este registro en particular se puede utilizar para escribir valores en los puertos directamente. Esto es posible solo cuando el registro pullup / pulldown está desactivado.
PxREN: Es un registro de 8 bits que se utiliza para habilitar o deshabilitar el registro pullup / pulldown. Cuando un pin se establece como 1 tanto en el registro PxREN como en el PxOUT, entonces se levanta el pin en particular.
PxDIR |
PxREN |
PxOUT |
Configuración de E / S |
0 |
0 |
X |
Entrada con resistencias desactivadas |
0 |
1 |
0 |
Entrada con pulldown interno habilitado |
0 |
1 |
1 |
Entrada con pullup interno habilitado |
1 |
X |
X |
Salida: PxREN no tiene ningún efecto |
PxSEL y PxSEL2: Como todos los pines en MSP430 están multiplexados, la función particular debe seleccionarse antes de usarla. Cuando los registros PxSEL y PxSEL2 se establecen en 0 para un pin en particular, se selecciona la E / S de propósito general. Cuando PxSEL se establece en 1, se selecciona la función periférica primaria, y así sucesivamente.
PxIE: Habilita o deshabilita las interrupciones para un pin en particular en un puerto x.
PxIES: Selecciona el flanco en el que se genera una interrupción. Para 0, se selecciona un flanco ascendente y para 1, se selecciona un flanco descendente.
Circuito MSP430 para probar la interrupción GPIO
El circuito MSP430 utilizado para probar nuestro código de ejemplo de interrupción MSP430 se muestra a continuación.
La tierra de la placa se utiliza para conectar a tierra tanto el LED como el botón. Los lados diagonalmente opuestos del botón pulsador son normalmente terminales abiertos y se conectan cuando se presiona el botón pulsador. Se conecta una resistencia antes del LED para evitar el alto consumo de corriente por parte del LED. Por lo general, se utilizan resistencias bajas en el rango de 100 ohmios a 220 ohmios.
Usamos 3 códigos diferentes para comprender mejor las interrupciones del puerto. Los dos primeros códigos utilizan el mismo circuito que en el Diagrama de circuito 1. Vamos a sumergirnos en el código. Una vez realizadas las conexiones, mi configuración se ve así.
Programación de MSP430 para interrupciones
El programa de interrupción MSP430 completo se puede encontrar en la parte inferior de esta página, la explicación del código es la siguiente.
La siguiente línea detiene el funcionamiento del temporizador de vigilancia. El temporizador de vigilancia generalmente realiza dos operaciones. Uno es evitar que el controlador realice bucles infinitos reiniciando el controlador y el otro es que activa eventos periódicos utilizando el temporizador incorporado. Cuando un microcontrolador se reinicia (o se enciende), está en el modo de temporizador y tiende a reiniciar la MCU después de 32 milisegundos. Esta línea impide que el controlador haga eso.
WDTCTL = WDTPW + WDTHOLD;
La configuración del registro P1DIR en el valor 0x07 establece la dirección de pin0, pin1 y pin2 como salida. Al configurar P1OUT en 0x30 se configura una entrada con resistencias pullup internas habilitadas en pin4 y pin5. Establecer P1REN en 0x30 habilita el pullup interno en estos pines. P1IE habilita la interrupción, donde P1IES selecciona la transición alta a baja como el borde de interrupción en estos pines.
P1DIR - = 0x07; P1OUT = 0x30; P1REN - = 0x30; P1IE - = 0x30; P1IES - = 0x30; P1IFG & = ~ 0x30;
La siguiente línea habilita el modo de bajo consumo y habilita el GIE en el registro de estado para que se puedan recibir las interrupciones.
__bis_SR_register (LPM4bits + GIE)
El contador de programa se establece con la dirección del vector del puerto 1 usando la macro.
PORT1_VECTOR . #pragma vector = PORT1_VECTOR __interrupt void Port_1 (void)
El siguiente código alterna cada uno de los LED conectados al pin0, pin1, pin2 uno por uno.
if (cuenta% 3 == 0) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; contar ++; } si no (cuenta% 3 == 1) { P1OUT ^ = BIT1; P1IFG & = ~ 0x30; contar ++; } más { P1OUT ^ = BIT2; P1IFG & = ~ 0x30; contar ++; }
Diagrama de circuito 2:
De manera similar, probemos con un pin diferente para entender mucho mejor el concepto. Entonces, aquí el botón está conectado al pin 2.0 en lugar del pin 1.5. el circuito modificado es el siguiente. Nuevamente, este circuito se usa para probar el programa de interrupción del botón MSP430.
Aquí, el puerto 2 se utiliza para la entrada. Por tanto, se debe utilizar un vector de interrupción diferente. P1.4 y P2.0 toman las entradas.
Como el puerto 2 se usa solo para entrada, P2DIR se establece como 0. Para configurar el pin0 del puerto 2 como entrada con las resistencias pull-up internas habilitadas, los registros P2OUT y P2REN deben configurarse con un valor de 1. Para habilitar el interrupción en el pin0 del puerto 2 y también para seleccionar el borde de la interrupción, P2IE y P2IES se establecen con un valor de 1. Para restablecer la bandera en el puerto 2, P2IFG se borra, de modo que la bandera se puede configurar de nuevo en el ocurrencia de la interrupción.
P2DIR - = 0x00; P2OUT = 0x01; P2REN - = 0x01; P2IE - = 0x01; P2IES - = 0x01; P2IFG & = ~ 0x01;
Cuando la fuente de interrupción es del puerto 1, el LED conectado al pin 1 del puerto 1 se ilumina. Cuando la fuente de interrupción pertenece al puerto 2, el LED conectado al pin 2 del puerto 1 se ilumina.
#pragma vector = PORT1_VECTOR __interrupt void Port_1 (void) { P1OUT ^ = BIT1; P1IFG & = ~ 0x10; para (i = 0; i <20000; i ++) { } P1OUT ^ = BIT1; } #pragma vector = PORT2_VECTOR __interrupt void Port_2 (void) { P1OUT ^ = BIT2; P2IFG & = ~ 0x01; para (j = 0; j <20000; j ++) { } P1OUT ^ = BIT2; }
Carga del programa a MSP430 desde CCS
Para cargar el proyecto en el Launchpad y depurarlo, seleccione el proyecto y haga clic en el icono de depuración en la barra de herramientas. Alternativamente, presione F11 o haga clic en RunàDebug para ingresar al modo de depuración.
Una vez que se ingresa al modo de depuración, presione el botón de ejecución de color verde para ejecutar libremente el código cargado en la MCU. Ahora, cuando se presiona el botón pulsador, la interrupción se activa por el cambio en el borde, lo que provoca el cambio en el estado del LED.
Interrumpir programa en MSP430
Una vez que el código se haya cargado correctamente, podemos probarlo simplemente usando el botón pulsador. El patrón de LED cambiará de acuerdo con nuestro programa siempre que se dé una interrupción usando el botón pulsador.
El trabajo completo se puede encontrar en el video vinculado a continuación. Espero que hayas disfrutado del tutorial y hayas aprendido algo útil. Si tiene alguna pregunta, déjela en la sección de comentarios o utilice nuestros foros para otras preguntas técnicas.