La interrupción externa

Anuncio
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
1
Habilitación de la interrupción
Para habilitar la interrupción
externa hay que poner a uno
los bits “GIE” e “INTE” del
registro “INTCON”
En CCS usamos las
instrucciones:
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
(c) Domingo Llorente 2010
2
Configuración por flanco de subida o bajada
Para programar la
interrupción por flanco
de bajada/subida hay
que poner a cero/uno
el 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
3
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
4
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 segmento
debe seguir girando en la misma posición donde se encontraba.
x3
interrupción
(c) Domingo Llorente 2010
5
Solución en CCS (I)
Comenzamos utilizando el
asistente “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
6
Solución en CCS (II)
Elegir:
Pic: PIC17F877A
Frecuencia del oscilador: 4Mhz
Fuses: Crystal osc <=4Mhz
Memoria de programa: No protegida
(c) Domingo Llorente 2010
7
Solución en CCS (III)
En la pestaña de “Interrups” marcar
la casilla de “External interrups
(c) Domingo Llorente 2010
8
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
9
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
10
Solución en CCS (VI)
Una posible función de interrupción sería:
(c) Domingo Llorente 2010
11
Solución en CCS (VII)
El programa principal:
(c) Domingo Llorente 2010
12
Resumen
Para realizar un programa con la interrupción externa habilitada:
1º.- Antes de la función main();
#use fast_io(b)
#int_EXT
void EXT_isr(void)
{
// programar aquí la función de interrupción //
}
2º.- En la función main() incluir:
enable_interrupts(INT_EXT);
enable_interrupts(GLOBAL);
ext_int_edge(H_TO_L);
set_tris_b(0x01);
// Habilita la interrupción en RB0
// Habilitación general de interrupción
// Config. int. por flanco descendente. (L_TO_H) para ascendente
// 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.
(c) Domingo Llorente 2010
13
Descargar