Vous êtes sur la page 1sur 15

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 Manejo de las Interrupciones INT0 e INT1.
Una interrupcin, como su nombre lo indica, interrumpe el programa principal y ejecuta una
subrutina de interrupcin donde se ejecuta el cdigo que el programador desea, el ejemplo ms
representativo es el RESET de una PC cuando se presiona ese botn se interrumpe el programa
principal y vuelve a iniciar el programa.
Existen dos tipos de interrupcin las internas o de software y las externas o de hardware, por
ejemplo la de reset es una externa ya que est asociada a una terminal. Las de software son
generadas por alguna condicin en los perifricos, por ejemplo podemos habilitar una
interrupcin cuando el ADC termine de hacer la conversin, o cuando suceda overflow en el timer,
etc.
Por ejemplo hay interrupciones que son por flanco de bajada en un pin, entonces, suceder una
interrupcin cuando haya un flanco de bajada en el pin. Las subrutinas de interrupcin son como
las funciones que hemos realizado, con la excepcin de que las subrutinas de interrupcin SON
LLAMADAS POR HARDWARE, es decir el microcontrolador llama a la subrutina de interrupcin
cuando el evento sucede y que puede ser en cualquier momento, en cambio las funciones que
define el usuario son llamadas por el software segn donde haya escrito el programador el
llamado de la funcin.

Figura 3.1 Ubicacin de las interrupciones externas.


En la figura 3.1 se aprecia que las interrupciones externas INT0 e INT1 que estn en los pines 4 y 5
del microcontrolador. Estas interrupciones se pueden configurar para que cuando exista un 0 (bajo
nivel) se genere una interrupcin, si cuando salga de la interrupcin sigue estando en 0 el pin
volver a saltar a la interrupcin. Los otros modos de configurar esas interrupciones es por flanco
de subida (rising edge) o por flanco de bajada (falling edge) o ambos flancos (any change).
Importante. Se observo que la INT0 e INT1 corresponde a los pines 4 y 5, y que a su vez son los
puertos D2 y D3; as que si se habilitan las funciones de interrupcin INT0 y la INT1, se debe
seleccionar esos pines para que sean de entrada; no deben ser habilitados como salida porque
ahora ya no funcionan como pines de entrada/salida sino como pines de entrada donde
detectarn un evento (flanco de bajada, subida, ambos o nivel 0 lgico) y en ese momento saltar
a la subrutina de interrupcin.
Las interrupciones INT0 e INT1 tienen sus propias funciones de interrupcin y pueden programarse
para que genere una interrupcin por flanco de bajada, subida, ambos o por nivel bajo; cuando se
configura por nivel bajo significa que mientras est en nivel bajo se generar la interrupcin, y si
cuando sale de la subrutina de interrupcin sigue en nivel bajo volver a saltar a la subrutina de
interrupcin. Tambin hay que hacer notar que la INT0 e INT1 son pines distintos, pero si habilita
las dos interrupciones y una la habilita por flanco de bajada la otra quedar habilitada con la
misma condicin, esto es que no se puede habilitar una por flanco de bajada y otra por flanco de
subida ya que es la misma condicin para las dos.
Importante. En los diagramas de interrupciones externas se coloca un pull-up externo en el pin de
la INT1 o INT0 y esto es porque no se puede activar la resistencia de pull-up interna debido a que
el pin ya no es de entrada/salida digital sino que funciona como una interrupcin externa, cuando
se pruebe en el circuito puede que se incremente el conteo 1,2 o 3 veces cuando se presione el
botn y es porque los interruptores mecnicos generan rebotes, por lo que detectar varios
flancos de subida y bajada cuando se le presiona una sola vez. Si en vez de conectar un botn

conecta un generador de funciones ya no se generaran rebotes y tampoco se necesitara la


resistencia de pull-up debido a que el generador no deja flotado el pin, ya que entrega 0 y 1 lgico.
3.0.2 Interrupciones externas PCINT0-PCINT23.
Adems de las interrupciones INT0 e INT1 existen otras interrupciones externas denominadas
PCINTX (Pin Change Interrupt) que son 24 interrupciones desde PCINT0 a PCINT23, pero existen
dos diferencias con respecto a las de INT0 e INT1 que son:
1. Las interrupciones PCINTX se activan nicamente en cambios de nivel, es decir cuando el pin
cambia de 1 a 0 y de 0 a 1. No pueden configurarse en ninguna otra opcin como las INT0 e INT1
que pueden configurarse para funcionar en flanco de subida, bajada, en ambos o nivel lgico 0.
2. Las interrupciones PCINTX slo tienen tres subrutinas de interrupcin.
En las PIN CHANGE INTERRUPT X, se puede generar una interrupcin cuando cambia de nivel
lgico de esos pines. Si se conecta a esos pines un interruptor se generara una interrupcin tanto
cuando se presiona el interruptor como cuando se suelta, ya que se generara un cambio de nivel
en ambos casos. A diferencia de las interrupciones INT0 e INT1 (pines 4 y 5) los PCINTX slo
funcionan por cambio de nivel lgico; y los INT0 e INT1 si se pueden configurar para que funcionen
por flanco de subida, bajada, ambos o por nivel lgico 0.

3.0.3 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.4 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 atemga48.

La tabla 3.1 muestra la ubicacin en la memoria del microcontrolador atmega48, del vector de
interrupciones, el nombre con el cual se define la direccin del vector de interrupciones dentro de
Winavr y una breve descripcin de a que corresponde dicha interrupcin.
La tabla muestra la ubicacin en la memoria del microcontrolador atmega48.

Direccin
0x000
0x001
0x002
0x003
0x004
0x005
0x006
0x007
0x008
0x009
0x00A
0x00B
0x00C
0x00D
0x00E
0x00F
0x010
0x011
0x012
0x013
0x014
0x015
0x016
0x017
0x018
0x019

Nombre de la seal

Descripcin
Pin de reset, BOD Reset, watchdog, Power-on Reset
INT0_vect
Requerimiento de interrupcin externa 0
INT1_vect
Requerimiento de interrupcin externa 1
PCINTO_vect
Interrupcin por cambio de pin grupo 0
PCINT1_vect
Interrupcin por cambio de pin grupo 1
PCINT2_vect
Interrupcin por cambio de pin grupo 2
WDT_vect
Watchdog timer
TIMER2_COMPA_vect
Timer/Counter2 igualdad en comparacin A
TIMER2_COMPB_vect
Timer/Counter2 igualdad en comparacin B
TIMER2_OVF_vect
Timer/Counter2 Sobre flujo
TIMER1_CAPT_vect
Timer/Counter1 Evento de captura
TIMER1_CAPA_vect
Timer/Counter1 igualdad en comparacin A
TIMER1_CAPB_vect
Timer/Counter1 igualdad en comparacin B
TIMER1_OVF_vect
Timer/Counter1 Sobre flujo
TIMER0_COMPA_vect
Timer/Counter0 igualdad en comparacin A
TIMER0_COMPB_vect
Timer/Counter0 igualdad en comparacin A
TIMER0_OVF_vect
Timer/Counter0 Sobre flujo
SPI_STC_vect
Transferencia serial completa
USART_RX_vect
Recepcin completa de la USART
USART_UDRE_vect
Buffer de datos vacio de la USART
USART_TX_vect
Transferencia completa de la USART
ADC_vect
Conversin analgico - completa
EE_READY_vect
EEPROM lista
ANALOG_COMP_vect
Comparador analgico
TWI_vect
Interfaz serial Two_wire (I2C)
SPM_RDY_vect
Almacenamiento de memoria de programa listo

Tabla 3.1 seales de interrupcin microcontrolador atmega48 para winavr.


3.3 Interrupciones externas.
Las interrupciones externas del microcontrolador atmega48 son activadas por las direcciones
0x001 y 0x002 (INT0_vect y INT1_vect), que se encuentran en PD2 y PD3 pines 4 y 5 del atmega48.
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 EICRA.
3.3.1 EICRA, 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 EIMSK, registro de mascara de interrupciones externas.

Bit 1 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 0 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 EIFR registro de banderas de interrupciones externas.

Bit 1 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 EIMSK, 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 EIMSK, 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
4
4
1
1
1

Resistor de 1K
Resistores de 220
Diodos emisores de luz LEDs
Programador de microcontroladores
Microcontrolador atmega48
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>

//llamada de la subrutina de entradas y salidas


//llamada de la subrutina de interrupciones
//llamada de la subrutina de seales

#define step1
#define step2
#define step3
#define step4

//define a step1 igual a 8


// define a step2 igual a 4
// define a step3 igual a 2
// define a step4 igual a 1

8
4
2
1

void config_io(void) {
DDRC=0x0F;
DDRD=0b11111011;
PORTD=_BV(PD2);
EICRA=_BV(ISC01);
EIMSK=_BV(INT0);
sei();
}

//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 retardo(void) {
int16_t i;
for(i=0; i<25000; i++);
}

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

void secuencia1(void){
PORTC=step1;
retardo();
PORTC=step2;
retardo();
PORTC=step3;
retardo();
PORTC=step4;
retardo();
}

//funcin para secuencia1 de IO

ISR(INT0_vect) {
PORTC=step4;
retardo();
PORTC=step3;
retardo();
PORTC=step2;
retardo();
PORTC=step1;
retardo();
}

//interrupcin para secuencia 2 de IO

void main(void) {
config_io();
while(1){

//funcin principal
//llamada a funcin config_io
//ciclo infinito
secuencia1();

}
}

//se va a la secuencia 1

//termina el ciclo while


//termina el programa main

//______________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 ATmega48
Programador

Introduccin
Interrupcin externa
Las interrupciones externas en el ATmega48 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>

//librera necesaria para manejar las interrupciones

int main (void) {


DDRB=0xFF;
cli();
EICRA=0x03;
EIFR =0x40;
EIMSK=0x40;
sei();
while(1){
}
}

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

ISR(INT0_vect)
{
PORTB=0x01;
_delay_ms(2000);
PORTB=0x00;
}

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


EICRA=0x03;

Al asignrsele un 0x03 se le est indicando que active los bits 0 y 1 los cuales para el registro EICRA
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.

EIFR

0x01 = 0b00000001, esto es, que se est seleccionando el bit 0 del registro EIFR el cual indica que
al activarlo se limpia la bandera INTF0.

EIMSK=0x10;

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

Vous aimerez peut-être aussi