Está en la página 1de 13

Capitulo 3 Interrupciones externas.

3.0 Introduccin. Una solicitud de interrupcin o simplemente una interrupcin- es un evento de origen interno o externo que, si es atendido, hace que el microcontrolador interrumpa la ejecucin del programa en curso y en su lugar ejecute las instrucciones de otro programa. Regularmente, cuando un programa que atiende la solicitud de interrupcin ha completado su ejecucin, el microcontrolador continua con las instrucciones del programa interrumpido, justo con la instruccin que sigue a la que estaba ejecutando cuando se produjo la solicitud de interrupcin. En general, las solicitudes de interrupcin son eventos de carcter asncrono respecto al programa que ejecuta el microcontrolador. Esto significa que una solicitud de interrupcin se puede producir en cualquier momento mientras se ejecuta cualquier instruccin de un programa. Por ello no es posible prever durante qu instruccin ocurrir una interrupcin. En un microcontrolador hay varias fuentes de interrupcin, unas internas y otras externas. Las interrupciones internas tienen su origen en los mdulos de entrada salida del microcontrolador, la memoria o la CPU. Los temporizadores y otros mdulos de entrada y salida son fuentes de interrupciones comunes. Menos comunes son las interrupciones causadas por algn evento que tenga lugar en la memoria (por ejemplo, por escribir en la EEPROM de datos) o en la propia CPU (una divisin por cero). Las interrupciones externas se originan en un perifrico y llegan al microcontrolador por alguna de sus terminales. Los microcontroladores tienen recursos para recibir y procesar las solicitudes de interrupcin. Generalmente, cada dispositivo que es fuente de una posible interrupcin tiene asociados dos bits, que pueden estar en un mismo registro o en registros diferentes. El primer bit tiene una funcin informativa: es un indicador de que esta activado (es puesto a 1, por ejemplo) por el dispositivo que solicita la interrupcin. Este bit se puede consultar por programa si para atender al dispositivo se usa la tcnica de consulta o espera. El otro bit tiene una funcin de control y se emplea para permitir o impedir el paso de la solicitud de interrupcin hacia la CPU, lo que equivale a habilitar o inhabilitar la generacin de interrupciones por la fuente en cuestin. Este bit de control se puede manejar por programa. Los microcontroladores disponen adems de un bit para el control global de sistema de interrupciones. Con este bit se permite o impide el paso de cualquier interrupcin hacia la CPU, lo cual equivale a habilitar o inhabilitar la generacin de interrupciones por la fuente en cuestin. Para que una solicitud de interrupcin llegue a la CPU y sea atendida, tanto el sistema en su conjunto como la interrupcin en particular deben de estar habilitadas.

Los bits de control utilizados para permitir o no el paso de las solicitudes de interrupcin hacia la CPU se denominan mascaras; de ah que las interrupciones que se puedan habilitar o inhabilitar por programa se llamen interrupciones enmascarables y las interrupciones que no se pueden inhabilitar por programa (es decir, que estn siempre habilitadas), si las hay, se denominan interrupciones no enmascarables. Las interrupciones enmascarables disponen de bits de control asociados a cada fuente de interrupcin y del bit de control global del sistema. Para que una solicitud de interrupcin enmascarables progrese hacia la CPU, tanto el bit de control individual correspondiente como el bit de control global deben estar en 1. Si la interrupcin es no enmascarable, llegar a la CPU con independencia del bit de control global, y ser atendida. En general, cuando una solicitud de interrupcin que llega a la CPU es atendida, el sistema de interrupcin queda inhabilitado (el bit de control global es puesto a 0). Para poder atender otras solicitudes de interrupcin, el programador debe habilitar nuevamente el sistema; esto suele hacerlo el propio programa que atiende la interrupcin. 3.0.1 Atencin a las solicitudes de interrupcin. Atender una solicitud de interrupcin es interrumpir la ejecucin del programa y pasar a otro programa. Cuando se termina este segundo programa, hay que continuar con el programa interrumpido. La solicitud de interrupcin que llega a la CPU (en el supuesto de que la interrupcin y el sistema estn habilitados), se atiende cuando termina la ejecucin de la instruccin en curso. Como en general no se conoce de antemano cul es esa instruccin, hay que encontrar la forma de recordar la direccin de la instruccin que le sigue, para regresar a ella cuando termine el programa que atiende a la interrupcin. Esa direccin est en el contador de programa (PC). La forma de recordarla es guardar el contenido del PC en la pila, tal como lo hacen las instrucciones de llamada a una subrutina. Conviene por ello que el programa de atencin a una interrupcin tenga la estructura de una subrutina, porque la instruccin de retorno que pone fin a la ejecucin de esta subrutina har que se regrese satisfactoriamente al programa interrumpido. El programa de atencin a una subrutina es, pues, una subrutina que se llama por interrupcin. Tambin se puede decir que una solicitud de interrupcin equivale a insertar una instruccin de llamada a una subrutina (la que atiende a la interrupcin) en algn lugar previsible del programa. La ejecucin de la subrutina que atiende una interrupcin debe dejar intactos los valores de los registros y bits con los que el programa estaba trabajando. Por ejemplo, los valores que tienen los registros de propsito general, el registro de estado (status), los indicadores aritmticos, no deben alterarse por la ejecucin de la subrutina de atencin a una interrupcin. Para preservar esos y otros registros que no deban ser alterados, hay que guardar sus valores al iniciar la subrutina. Estos valores se guardan en la pila. 3.0.2 Interrupciones fijas y vectorizadas.

Para informar a la CPU de la direccin donde comienza la subrutina que atiende la interrupcin, hay dos alternativas: La subrutina que atiende a la interrupcin se coloca en un lugar fijo de la memoria de programa, conocido de antemano por la CPU. Al solicitar la interrupcin se comunica a la CPU la direccin de la subrutina de atencin a la interrupcin.

La primera solucin es la empleada en las llamadas interrupciones fijas. En este tipo de interrupciones, el microcontrolador salta siempre a un lugar fijo de la memoria. En esta direccin debe estar la primera instruccin de la subrutina de atencin a la interrupcin. Segn el microcontrolador de que se trate, puede haber una direccin de memoria diferente para cada fuente de interrupcin, o puede haber una direccin nica para todas las solicitudes, como en el AVR; pero siempre son direcciones fijas. Por su simplicidad, este tipo de interrupciones es muy utilizado en los microcontroladores. La segunda solucin, aunque ms flexible que la primera, es tcnicamente ms compleja de implementar. En esta solucin, junto a la solicitud de interrupcin, se le proporciona a la CPU la direccin de la rutina de atencin, o alguna informacin que le permita construirla. Este dato que se le suministra a la CPU se conoce como vector de interrupcin; de ah que este tipo de interrupciones se denomina interrupciones vectorizadas. En las interrupciones vectorizadas, la subrutina que atiende la interrupcin puede estar (al menos en principio) en cualquier lugar de la memoria. El vector de interrupcin puede tener diferentes formas: la ms simple es que sea la propia direccin de la rutina; tambin puede ser el nmero que acta como puntero a la rutina (con el vector, la CPU busca la direccin de la rutina en una tabla de direcciones situada en la memoria), etc. Las interrupciones vectorizadas son muy utilizadas en los microcontroladores, en aras de conservar la mayor simplicidad en los dispositivos 3.1 Interrupciones. La base de una interrupcin es la necesidad de un dispositivo perifrico de enviar informacin al procesador principal del sistema. A nivel operativo, una interrupcin tiene ventaja de que delega la responsabilidad de comunicarse con el procesador al dispositivo perifrico en lugar de gastar tiempo de operacin en sondear el estado de dicho dispositivo. 3.2 Vector de interrupciones del microcontrolador atemga8. La tabla muestra la ubicacin en la memoria del microcontrolador atmega8. Direccin 0x000 0x001 0x002 0x003 Nombre de la seal SIG_INTERRUPT0 SIG_INTERRPUT1 SIG_OUTPUT_COMPARE2 Descripcin Pin de reset, BOD Reset, watchdog, Power-on Reset Requerimiento de interrupcin externa 0 Requerimiento de interrupcin externa 1 Timer/Counter2 igualdad en comparacin

0x004 0x005 0x006 0x007 0x008 0x009 0x00A 0x00B 0x00C 0x00D 0x00E 0x00F 0x010 0x011 0x012

SIG_OVERFLOW2 SIG_INPUT_CAPTURE1 SIG_OUTPUT_COMPARE1A SIG_OUTPUT_COMPARE1B SIG_OVERFLOW1 SIG_OVERFLOW0 SIG_SPI SIG_USART0_RECV SIG_USART_DATA SIG_USART_TRANS SIG_ADC SIG_EEPROM SIG_COMPARATOR SIG_2WIRE_SERIAL SIG_SPM_READY

Timer/Counter2 Sobre flujo Timer/Counter1 Evento de captura Timer/Counter1 igualdad en comparacin A Timer/Counter1 igualdad en comparacin B Timer/Counter1 Sobre flujo Timer/Counter0 Sobre flujo Transferencia serial completa Recepcin completa de la USART Buffer de datos vacio de la USART Transferencia completa de la USART Conversin analgica digital completa EEPROM lista Comparador analgico Interface serial Two wire (I2C) Almacenamiento de memoria de programa listo

Tabla 3.1 seales de interrupcin microcontrolador atmega8 para winavr. 3.3 Interrupciones externas. Las interrupciones externas del microcontrolador atmega8 son activadas por las direcciones 0x001 y 0x002 (SIG-INTERRUPTO y SIG_INTERRUPT1), que se encuentran en PD2 y PD3 pines 4 y 5). Destaca el hecho de que estas interrupciones son activadas an cuando los pines estn configurados como salidas, lo que provee una forma de generar interrupciones va software. Las interrupciones externas pueden ser activadas por flancos de subida, flancos de bajada o un nivel lgico bajo. Esto es configurable a travs del registro MCUCR. 3.3.1 MCUCR, registro de control del microcontrolador.

Para la configuracin de las instrucciones externas, se ocupan los cuatro primeros bits de este registro. Estos bits tienen las siguientes funciones: Bit 3,2 ISC11, ISC10: Bits de control de sensado de interrupcin externa 1. Estos bits controlan la forma en la que se activara la interrupcin externa 1 y su configuracin es igual que la de los bits 1,0. Bit 1,0 ISC01, ISC00: Bits de control de sensado de interrupcin externa 0. La interrupcin externa 0 es activada por el pin correspondiente a INT0 (PD2), siempre y cuando el bit I del registro SREG y su correspondiente mascara de interrupcin estn activados. La tabla 3.2 muestra las posibles configuraciones para disparar las interrupciones 0 y 1.

ISC11 ISC10 Descripcin 0 0 El nivel bajo de INT1 genera una solicitud de interrupcin 0 1 Cualquier cambio lgico en INT1 genera una solicitud de interrupcin 1 0 El flanco de bajada de INT1 genera una solicitud de interrupcin 1 1 El flanco de subida de INT1 genera una solicitud de interrupcin

ISC01 ISC00 Descripcin 0 0 Le nivel bajo de INT0 genera una solicitud de interrupcin 0 1 Cualquier cambio lgico de INT0 genera una solicitud de interrupcin 1 0 El flanco de bajada de INT0 genera una solicitud de interrupcin 1 1 El flanco de subida de INT0 genera una solicitud de interrupcin

Tabla 3.2 configuraciones para el disparo de las interrupciones 0 y 1 3.3.2 GICR, registro de control de interrupciones.

Bit 7 INT1: Habilitacin de interrupcin externa 1. Si el bit I del SREG est en uno y este bit se pone en uno; se habilita la interrupcin externa 1. Bit 6 INT0: Habilitacin de interrupcin externa 0. Si el bit I del SREG est en uno y este bit se pone en uno; se habilita la interrupcin externa 0. 3.3.3 GIFR registro de banderas de interrupciones generales.

Bit 7 INTF1: cuando un evento dispara la interrupcin externa 1, este bit de bandera se pone a uno. Si estn activados los bits I del SREG e INT1 de GICR, al activarse este bit se ejecuta un salto al vector de interrupciones. Este bit es limpiado por hardware al ejecutarse la rutina de interrupcin. BIT 6 INTF0: cuando un evento dispara la interrupcin externa 0, este bit de bandera se pone a uno. Si estn activados los bits I del SREG e INT0 de GICR, al activarse este bit se ejecuta un salto al vector de interrupciones. Este bit es limpiado por hardware al ejecutarse la rutina de interrupcin. 3.4 Practica de interrupcin externa. 3.4.1 Objetivo.

Conocer el funcionamiento de una interrupcin, como se forma el vector de interrupciones y los registros que interviene en el uso de las interrupciones externas. 3.4.2 Material. El material necesario para realizar esta prctica es el siguiente:

Cantidad cantidad 1 Cristal de cuarzo de 4 MHZ. 2 Capacitores de 22 pf 1 Interruptor tipo push button 1 Resistor de 10K 1 Resistor de 1K 4 Resistores de 220 4 Diodos emisores de luz LEDs 1 Programador de microcontroladores 1 Microcontrolador atmega8 1 Fuente de alimentacin de 5 volts Pinzas, protoboard, cable telefnico

3.4.3 Desarrollo. Para la realizacin de esta prctica se arma el siguiente circuito.

3.4.4 Cdigo. //___________inicio de programa #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #define step1 #define step2 #define step3 #define step4 8 4 2 1 //llamada de la subrutina de entradas y salidas //llamada de la subrutina de interrupciones //llamada de la subrutina de seales //define a step1 igual a 8 // define a step2 igual a 4 // define a step3 igual a 2 // define a step4 igual a 1 //funcin de configuracin de IO //configuracin de puertos IO //PD2 como entrada //activar resistencia de pull up en PD2 //seleccin de comportamiento para INT0 //activacin de interrupcin externa 0 //activacin de interrupciones globales

void config_io(void) { DDRC=0x0F; DDRD=0b11111011; PORTD=_BV(PD2); MCUCR=_BV(ISC01); GICR=_BV(INT0); sei(); } void retardo(void) { int16_t i; for(i=0; i<25000; i++); } void secuencia1(void){ PORTC=step1; retardo(); PORTC=step2; retardo(); PORTC=step3; retardo(); PORTC=step4; retardo(); } INTERRUPT(SIG_INTERRUPT0) { PORTC=step4; retardo(); PORTC=step3; retardo(); PORTC=step2; retardo(); PORTC=step1;

//funcin de retardo //declaracin de entero de 16 bits i //ciclo de for

//funcin para secuencia1 de IO

//interrupcin para secuencia 2 de IO

retardo(); } void main(void) { config_io(); while(1){ secuencia1(); } } //funcin principal //llamada a funcin config_io //inicio de ciclo infinito //secuencia 1 //fin de ciclo infinito //fin de programa principal

//______________fin de programa 3.5 Otra opcin. 3.5.1 Practica

Interrupcin Externa
Descripcin
El push button est conectado al microcontrolador, el cual se encuentra configurado para las interrupciones externas, esto es, que el programa deja de hacer lo que est haciendo para atender la interrupcin y ejecutar las instrucciones dentro esta funcin, que para este caso es prender el LED que se encuentra conectado al microcontrolador.

Diagrama Esquemtico

Materiales
1 Push Button 1 Resistencia de 220 Ohms 1 Resistencia de 1 kOhms 1 LED 1 Microcontrolador ATmega8 Programador

Introduccin
Interrupcin externa
Las interrupciones externas en el ATmega8 son activadas con los pines INT0 y INT1, en caso de que se habiliten las interrupciones los pines INT siempre activaran alguna interrupcin sin importar como se haya configurado el puerto en el que estos pines se encuentren. Las interrupciones externan se habilitan cuando la entrada del pin, cambia de estado, se puede configurar si se requiere que se active cuando cambia de un estado bajo a uno alto o viceversa. Resistencia de Pull down

Cuando se conecta un pin del microcontrolador a un interruptor, ste al presionarlo presenta un nivel alto en el pin, pero cuando ste est abierto con el resistor de pull down se asegura un cero o nivel bajo en el microcontrolador.

Resistor de pull down

Programa en C
#include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> int main (void) { DDRB=0xFF; cli(); MCUCR=0x03; GIFR =0x40; GICR=0x40; sei(); while(1){ } } ISR(INT0_vect) { PORTB=0x01; _delay_ms(2000); PORTB=0x00; } //librera necesaria para manejar las interrupciones

//inicio del programa principal //terminales del puerto B como salidas //desactiva las interrupciones globales //habilita interrupcin con flanco de subida //bandera de interrupcin cero //seleccin de interrupcin cero //activar las interrupciones globales //ciclo infinito

//vector de interrupcin externa del INT0 //pone la terminal cero del puerto B en uno lgico //retardo de 2 segundos //pone terminal cero del puerto B en cero lgico

Detalles del programa


#include <avr/interrupt.h> Cada que se utilice alguna interrupcin es necesario llamar a la librera avr/interrupt.h que es la que contiene todos los vectores de interrupcin de los AVR's. cli();

Esta instruccin deshabilita las interrupciones. sei();

Habilita las interrupciones. MCUCR=0x03;

Al asignrsele un 0x03 se le est indicando que active los bits 0 y 1 los cuales para el registro MCUCR indican de qu manera se activa la interrupcin, como se puede ver en la tabla, hay cuatro opciones que son: el nivel bajo de INT1, cualquier cambio lgico, el flanco de bajada y el flanco de subida. Con los bits 0 y 1 en unos, se habilita la opcin del flanco de subida.

GIFR

0x40 = 0b01000000, esto es, que se est seleccionando el bit 6 del registro GIFR el cual indica que al activarlo se limpia la bandera INTF0. GICR=0x40;

Al igual que en el registro anterior se est activando el bit 6 del GICR el cual indica que se utiliza el pin INT0 para la interrupcin externa.

También podría gustarte