La interrupción externa - IES LUIS DE LUCENAc) Domingo Llorente 2010 2 Habilitación de la...

Preview:

Citation preview

(c) Domingo Llorente 2010 1

La interrupción externa

• La familia 16f87x dispone de hasta 15 fuentes de interrupción.• La interrupciones pueden ser por software o hardware.• Todas las interrupciones provocan un “salto” a la posición 04. (vector de interrupción).• Los registros implicados en el manejo de interrupciones son: OPTION_REG, INTCON, PIE1, PIE2, PIR1 y PIR2.• La interrupción externa está implementada en el pin RB0.• La interrupción externa se habilita activando el bit “INTE” y el “GIE” del registro INTCON.• Se puede configurar para que se genere por flanco de subida o por flanco de bajada.

(c) Domingo Llorente 2010 2

Habilitación de la interrupción

Para habilitar la interrupción externa hay que poner a unolos bits “GIE” e “INTE” del registro “INTCON”

En CCS usamos las instrucciones:

enable_interrupts(INT_EXT);

enable_interrupts(GLOBAL);

(c) Domingo Llorente 2010 3

Configuración por flanco de subida o bajada

Para programar la interrupción por flanco de bajada/subida hay que poner a cero/unoel bit INTEDG del registro OPTION_REG

En CCS usamos la instrucción:ext_int_edge(H_TO_L);

o bien:ext_int_edge(L_TO_H);

(c) Domingo Llorente 2010 4

Conexión hardware

� La interrupción externa está implementada en el pin RB0.� Para usarla hay que colocar el puente JP13 en posición “INT”. � Al usar la interrupción externa no podemos utilizar el led en RB0. � Para generar una interrupción utilizar la clema 3 puenteando 1-2.

(c) Domingo Llorente 2010 5

Ejemplo de programa

Diseñar un programa que presente un segmento girando en la parte baja del display de la placa de periféricos a intervalos de 300ms. Configurar la interrupción externa, generada por flanco de bajada, para que cuando se produzca parpadee la parte baja del display tres veces a intervalos de 200ms. Cuando termine la interrupción el segmentodebe seguir girando en la misma posición donde se encontraba.

x3

interrupción

(c) Domingo Llorente 2010 6

Solución en CCS (I)

Comenzamos utilizando elasistente “PIC Wizard”

Luego hay que crear la carpeta para nuestro proyecto y dar un nombre al archivo con extensión .pjt

(c) Domingo Llorente 2010 7

Solución en CCS (II)

Elegir:Pic: PIC17F877AFrecuencia del oscilador: 4MhzFuses: Crystal osc <=4MhzMemoria de programa: No protegida

(c) Domingo Llorente 2010 8

Solución en CCS (III)

En la pestaña de “Interrups” marcar la casilla de “External interrups

(c) Domingo Llorente 2010 9

Solución en CCS (IV)

En la pestaña “Code” podemos ver el código que se añadirá en nuestro programa.

(c) Domingo Llorente 2010 10

Solución en CCS (V)

El compilador nos genera la siguiente plantilla.

Función que se ejecutará al producirse la interrupción.

(c) Domingo Llorente 2010 11

Solución en CCS (VI)

Una posible función de interrupción sería:

(c) Domingo Llorente 2010 12

Solución en CCS (VII)

El programa principal:

(c) Domingo Llorente 2010 13

Resumen

Para realizar un programa con la interrupción externa habilitada:

1º.- Antes de la función main();#use fast_io(b)#int_EXTvoid EXT_isr(void) {

// programar aquí la función de interrupción //}

2º.- En la función main() incluir:enable_interrupts(INT_EXT); // Habilita la interrupción en RB0enable_interrupts(GLOBAL); // Habilitación general de interrupción ext_int_edge(H_TO_L); // Config. int. por flanco descendente. (L_TO_H) para ascendenteset_tris_b(0x01); // RB0 entrada, RB1..RB7 salidas

3º.- Programar la función main() según corresponda.

4º.- Cada vez que se genere un flanco de subida o bajada en RB0 se ejecutará la función de interrupción EXT_isr(void) y luego el programa continuará con el programa principal.

Recommended