PIC 18F45XX La Interrupción externa 1. Características generales sobre interrupciones (I) La familia 18F45XX incorpora múltiples fuentes de interrupción. Cuando se produce una interrupción se produce un salto hacia la dirección que indica el vector de interrupción. Cada fuente de interrupción puede configurarse como: ALTA prioridad (vector: 000008h) BAJA prioridad (vector: 000018h) Si no se utilizan las prioridades (RCON.SPEN=0) todas las interrupciones son consideradas de alta prioridad. Cada fuente de interrupción tiene tres bits que configuran su funcionamiento: Bit de habilitación (Enable bit), permite/impide el “salto” al vector de interrupción. Bit de prioridad (Priority bit), configura el vector de salto ALTA o BAJA. Bit de bandera (Flag bit), se pone a uno cuando se produce la interrupción. La interrupción externa está implementada en los pines RB0, RB1 y RB2. Para habilitar la int. Externa en RB0 sin prioridad hay que poner a uno los bits GIE, y INT0IE del registro INTCON. 1. Características generales sobre interrupciones (II) Las rutinas de atención a las interrupciones tienen las siguientes limitaciones: No devuelven ni aceptan parámetros No pueden invocarse desde otros puntos del programa Las variables globales que se utilicen se deben declarar como volatile La directiva : #pragma interruptlow nombre_interrupcion Define la rutina de servicio a la interrupción como de baja prioridad La directiva: #pragma interrupt nombre_interrupcion Define la interrupción como alta prioridad Ejemplos de programación: #pragma interrupt UserHighPriorityISRCode void UserHighPriorityISRCode(){ } #pragma interruptlow UserLowPriorityISRCode void UserLowPriorityISRCode() {} 2. Hardware de interrupciones 3. Registro de configuración INTCON Para deshabilitar el control de prioridades poner a cero el bit IPEN del registro RCON: RCONbits.IPEN=0; Todas las interrupciones “saltan” al vector: 000008 Cuando se produce la int. Externa se pone a uno su bandera de interrupcion: INTCONbits.INT0IF=1 Para habilitar la int. Externa: INTCONbit.INT0IE=1; INTCONbits.GIE=1; 4. Registro de configuración INTCON2 La int. Externa en RB0 puede configurarse para activarse con flanco de subida o de bajada. Para configurar con cada flanco de bajada: INTCON2bits.INTEDG0=0; Para configurar con cada flanco de subida: INTCON2bits.INTEDGE=1; 5. Interrupciones en la placa de periféricos Para poder generar una interrupción por flanco de bajada: a) Poner el jumper J2 en posición (B0-E) b) Pulsar RB0 6. Programación en C18 Para configurar la interrupción externa RB0 sin prioridades se puede seguir el siguiente procedimiento: En la función main() • Deshabilitar prioridades. RCONbits.IPEN=0; • Hablilitar todas las interrupciones. INTCONbits.GIE=1; • Habilitar interrupción en RB0. INTCONbits.INT0IE=1; • Configurar el tipo de flanco (subida/bajada). INTCON2bits.INTEDG0=1/0; • Poner a cero la bandera de control. INTCONbits.INT0IF=0; En la función de interrupción • Deshabilitar todas las interrupciones. INTCONbits.GIE=0; • Guardar el estado del programa principal (si procede) • Programar la función según necesidades. • Recuperar el estado del programa principal (si procede) • Poner a cero la bandera de control. INTCONbits.INT0IF=0; • Habilitar todas las interrupciones. INTCONbits.GIE=1; 7. Programa de ejemplo 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 en RB0, 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. Solución (programa principal) Solución (función de interrupción) Simulación