Vous êtes sur la page 1sur 7

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 tabal muestra la ubicacin en la memoria del microcontrolador atemega8. Direccin 0x000 0x001 0x002 0x003 Nombre de la seal SIG_INTERRUPT0 SIG_INTERRPT1 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 seria 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 atemga8 son activadas por las direcciones 0x001 y 0x002 (SIG-INTERRUPTO y SIG_INTERRUPT1), que se encuentran en PD2 y PD3 8pines 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 la interrupcin 0.

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. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX 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 //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

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; retardo(); } void main(void) { config_io(); while(1){ secuencia1(); } }

//activacin de interrupciones globales

//funcin de retardo //declaracin d entero de 16 bits

//funcin para secuencia1 de IO

//interrupcin para secuencia 2 de IO

//funcin principal //llamada a funcin config_io

//______________fin de programa