- 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:
- Se produce un evento (cambio en una de las entradas, salidas o en los periféricos internos (watchdog, temporizadores, etc.) del microcontrolador.
- Se activa el flag de interrupción asociado a ese evento (una interrupción puede estar asociada a varias fuentes). (Registro IE1).
- Se pone en marcha el proceso de tratamiento de interrupción.
- 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.
- Se almacena en la pila la dirección de memoria de la siguiente instrucción del código del programa que se estaba ejecutando.
- Se almacena en la pila el valor del registro de estado.
- 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.
- Si existen varias interrupciones pendientes se selecciona aquella que presente más prioridad (la selecciona el micro automáticamente).
- 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.
- El registro de estado toma el valor 0x0000. En consecuencia se deshabilitan todass las interrupciones enmascarables (GIE = 0).
- 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.
- Se ejecuta la secuencia de sentencias de la RTI.
- La RTI termina con la instrucción RETI (REtorn interrupTIon).
- 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.
Hola, muchas gracias por tu aporte.
ResponderEliminarTengo un problema con este código de interrupciones, espero me puedas ayudar. El problema es que no lo hace cada segundo, de repente se esta hasta 3, al hacer debugin noto que en ocasiones se esta dos veces en la interrupción, como si hubiera otra cosa aparte del timer que crea la interrupción.
Gracias.
#include
unsigned char A;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
P1DIR |= BIT0; // P1.0 como salida (para el led 1)
P1OUT &=~ BIT0;
TACCTL0= CCIE; //habilito la interrupcion por CCR0
TACCR0 = (4095); //para que me genere una interrupción cada segundo.
TACTL = TASSEL_1 + MC_1 + ID_3; //fuente de reloj ACLK=32768Hz, modo up y el divisor de //de frecuencia ID_3=8 de modo que la frecuencia real es 4096Hz.
_BIS_SR(GIE);
while(1){
if(A==1){
P1OUT ^= 0x01;
}
A=0;
}
}
// Timer A0 interrupt service routine
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
A=1;
}
Hola, necesito ver el código entero para poderte ayudar.
EliminarBuenas tardes, ¿cómo se logra realizar una interrupcion por software en la familia MSP430? En particular estoy trabajando con una MSP430F5529 y pretendo crearle un sistema operativo de tiempo real. Gracias por su atención.
ResponderEliminar