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