Upload
dinhdiep
View
218
Download
3
Embed Size (px)
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.