INTERRUPCIONES
Microcontroladores
INTRODUCCIÓN Una solicitud de interrupción (comúnmente conocida solo como interrupción) es un evento externo exte rno o interno que cuando es atendida hace que el microcontr microcontrolador olador interrumpa la ejecución del programa actual y ejecuta otro programa.
o
En general cuando el programa que atiende la solicitud de interrupción termina, el microcontrolador microcontr olador continua ejecutando las instrucciones del programa que estaba siendo ejecutada antes de que ocurriera la interrupción.
o
o
Las interrupciones son eventos asíncronos al programa que es ejecutado por el MCU.
o
En un microcontrolador hay varias varias fuentes de interrupción, una internas y otras externas.
Las interrupciones internas tienen su origen en los módulos de E/S del MCU; la memoria o la CPU, temporizadores, etc.
o
Las interrupciones externas se originan en un periférico y llegan al microcontrolador por alguno de sus terminales.
o
INTRODUCCIÓN
INTRODUCCIÓN Cada dispositivo que es fuente de una posible interrupción tiene asociados dos bits (Gama media y baja) y tres bits (Arquitectura PIC 18), estos pueden estar en el mismo registros o en distintos registros.
o
1.
El primer bit tiene una función informativa: Es un indicador que es activado (puesto a ‘1’) por el dispositivo que solicita la interrupción. o
Este Bit se puede consultar por el programa con el fin de atender al dispositivo.
o
Los bits con esta función tiene la terminación IF (Interrupt Flag).
2.
El segundo bit tiene una función de control: Se usa para permitir o impedir el paso de la solicitud de interrupción hacia la CPU, lo que equivale a habilitar o deshabilitar la interrupción, también son denominados como mascaras. o
Este bit de control se puede manejar dentro del programa.
o
Los Bits que tienen esta función llevan la terminación IE (Interrupt Enable).
3.
El tercer bit (exclusivo de la Familia PIC 18), se utiliza para indicar la prioridad de la interrupción. o
Este bit permite indicar la prioridad de la fuente de interrupción, se manejan dos niveles alto (Dirección 0008h) y bajo (Dirección 00018h).
INTRODUCCIÓN Los MCU también tiene un bit global de control de interrupciones.
o
o
o
o
Este habilita o deshabilita cualquier solicitud de interrupción que llega a la CPU. En el caso de los MCU’s PIC es el bit GIE (Global Interrupt Enable). Este bit solo puede controlar las interrupciones enmascarables, a las que no son enmascarables ocurren aun cuando este bit esta deshabilitado.
Cuando ocurre una interrupción lo normal es deshabilitar el GIE hasta que se termine el programa de la interrupción y después se vuelva a habilitar, esto se realiza dentro del programa.
o
FUENTES DE INTERRUPCIÓN EN EL PIC 18F4520. o
En el caso del 18F4520 existen una gran variedad de fuentes de interrupción de tipo externo e interno.
o
Fuentes de interrupción Internas (Enmascarables).
o
Por desbordamiento de Temporizador. o
o
TIMER 0, 1 y 3.
Por comparación del valor del temporizador. o
TIMER 2.
o
Conversor Analógico – Digital.
o
Memoria EEPROM.
o
Detector de Voltaje Alto/Bajo (HLVD).
o
Fallo en el oscilador.
o
Fuentes de interrupción Internas (No Enmascarables).
o
Watchdog Timer.
Power On Reset. o Power Down Reset. o
Bro
Out Rese
FUENTES DE INTERRUPCIÓN EN EL PIC 18F4520. o
En el caso del 18F4520 existen una gran variedad de fuentes de interrupción de tipo externo e interno.
o
Fuentes de interrupción Externas (Enmascarables).
o
Interrupciones externas en terminales (PORTB 0, 1 y 2).
o
Cambios en niveles lógicos de terminales (PORTB 4, 5, 6 y 7)
o
Escritura/Lectura del puerto paralelo (Modo Esclavo).
o
Recepción en la USART.
o
Transmisión en la USART.
o
Transmisión/Recepción del puerto serial síncrono (Modo Maestro).
o
Captura o Comparación de los módulos CCP (1 y 2).
o
Fuentes de interrupción Externas (No Enmascarables).
o
Botón de RESET.
FUENTES DE INTERRUPCIÓN EN EL PIC 18F4520. Para realizar la configuración, inspección y control de las interrupciones el 18F4520 utiliza un total de 10 registros:
o
RCON. o INTCON. o INTCON1. o INTCON2. o PIR1, PIR2. o PIE1, PIE2. o IPR1, IPR2. o
EL PROCESO DE UNA INTERRUPCIÓN 1. Programar el MCU para reaccionar a las interrupciones. El MCU debe estar programado para habilitar las fuentes de interrupción a ocurrir. Se configura el Global Interrupt Enable (GIE) [Se habilitan en general todas las fuentes de interrupción] y en muchos casos el Peripheral Interrupt Enable (PEIE) [Se habilitan las interrupciones proveniente de periféricos].
o o
o
Estos dos bits se encuentran en el registro I NTCON.
2. Habilitar las interrupciones desde las fuentes seleccionadas. o o
o
Cada periférico en el MCU tiene un bit individual de habilitación. Un bit de habilitación individual para cada periférico debe ser activado adicionalmente al GIE y el PEIE antes del que el periférico puede generar una interrupción. Los bits individuales de habilitación se encuentran en los registros INTCON, INTCON2, PIE1 y PIE2.
3. Solicitud de Interrupción de un Periférico. o
Cuando un periférico alcanza un estado donde se programa la intervención es necesario que el
EL PROCESO DE UNA INTERRUPCIÓN 3. Confirmación de Solicitud de Interrupción de un Periférico. Estas banderas de interrupción son puestas a ‘1’ a pesar de el estado de GIE, PEIE y los bits de habilitación individuales. Las banderas de interrupción están localizadas en los registros INTCON, INTCON2, PIR1 y PIR2. La mayoría de las banderas de solicitud de interrupción son “latcheadas” en estado alto cuando son puestas a ‘1’ y deben ser borradas por la rutina de servicio de interrupción creada por el usuario.
o
o o
4. La interrupción ocurre. Cuando la bandera de solicitud de interrupción es puesta a ‘1’ y la interrupción esta habilitada de forma correcta, el proceso de interrupción inicia.
o
1. 2. 3. 4. o o
Interrupciones globales son deshabilitadas mediante la puesta a ‘0’ del bit GIE. El contexto (Registro W, STATUS, BSR, PCLATH, etc.) del programa actual es guardado en registros sombra. El valor del contador de programa (PC) es guardado en la pila de regreso (Return Stack). El control de programa es transferido a la dirección vector de interrupción. En caso de no activar niveles de prioridad la dirección del vector de interrupción es 0008h. Si se encuentran activos los niveles de prioridad la dirección del vector 0008h para las de alto nivel y 0018h para las de bajo nivel.
EL PROCESO DE UNA INTERRUPCIÓN 5. Se activa la rutina de servicio de la interrupción (ISR). La rutina de servicio de la interrupción es una función creada por el usuario que se encuentra situada en los vectores de interrupción (0008h o 0018 según sea el caso). La rutina de servicio de la interrupción hace lo siguiente:
o
o
1.
Se revisan los periféricos habilitados para generar interrupción con el fin de determinar la fuente de interr upción.
2.
Se realizan las tareas necesarias.
3.
Se limpia la bandera apropiada de interrupción (la que genero la interrupción).
4.
Se ejecuta el regreso desde una interrupción (RETFIE) como e l final de la función ISR.
6. El control es devuelto al programa principal. Cuando la instrucción RETFIE es ejecutado:
o
1.
Las interrupciones globales son habilitadas (GIE=1).
2.
El contexto del programa (registro W, STATUS, BSR, PCLATH, etc.) debe ser restaurado desde los registros sombra.
3.
La dirección de regreso es cargada desde la pila (stack) hacia el contador de programa (PC).
4.
La ejecución continua desde el punto en el cual fue interrumpida.
REGISTROS USADOS EN EL PROCESO DE INTERRUPCIÓN o
Registros para el control de interrupciones:
GIE/GIEH – Habilitación global de interrupciones / Habilitación global de interrupciones de alta prioridad. o PEIE/GIEL – Habilitación de interrupción de periféricos / Habilitación global de interrupciones de baja prioridad. o TMR0IE – Habitación de interrupción por desborde del TIMER (Temporizador) 0. o INT0IE – Habilitación de interrupción externa 0. o RBIE – Habilitación de la interrupción por cambios en el Puerto B. o TMRIF – Bandera de interrupción por desborde del TIMER 0 (Debe ser limpiada mediante software). o INT0IF – Bandera de interrupción externa 0 (Debe ser limpiada mediante software). Bandera de interrupción cambios en el Puerto B (Debe ser limpiada mediante software). o RBIF o
REGISTROS USADOS EN EL PROCESO DE INTERRUPCIÓN o
Registros para el control de interrupciones:
RBPU – Habilitación de Pull-Up en el Puerto B. o INTEDG0 – Selección de flanco de la interrupción externa 0. o INTEDG1 – Selección de flanco de la interrupción externa 1. o INTEDG2 – Selección de flanco de la interrupción externa 2. o TMR0IP – Nivel de prioridad de la interrupción por desborde del TIMER 0. o RBIP - Nivel de prioridad de la interrupción por cambios en el Puerto B. o
REGISTROS USADOS EN EL PROCESO DE INTERRUPCIÓN o
Registros para el control de interrupciones:
INT2IP – Nivel de prioridad de la interrupción externa 2. o INT1IP – Nivel de prioridad de la interrupción externa 1. o INT2IE – Habilitación de interrupción externa 2. o INT1IE – Habilitación de interrupción externa 1. o INT2IF – Bandera de interrupción externa 2 (Debe ser limpiada mediante software). o INT1IF – Bandera de interrupción externa 1 (Debe ser limpiada mediante software). o
REGISTROS USADOS EN EL PROCESO DE INTERRUPCIÓN o
Registros para la habilitación de interrupciones por periféricos:
PSPIE – Habilitación de interrupción por escritura/lectura de puerto paralelo esclavo. o ADIE – Habilitación de interrupción por el convertidor analógico – digital (ADC). o RCIE – Habilitación de interrupción por recepción en USART. o TXIE – Habilitación de interrupción por transmisión en USART. o SSPIE – Habilitación de interrupción por el puerto serial síncrono maestro (MSSP). o CCP1IE – Habilitación de interrupción por el modulo CCP1. o TMR2IE – Habilitación de interrupción por comparación del TIMER 2 con el registro PR2. Habilitación de interrupción por desbordamiento del TIMER 1. o TMR1IE o
REGISTROS USADOS EN EL PROCESO DE INTERRUPCIÓN o
Registros para la habilitación de interrupciones por periféricos:
OSCFIE – Habilitación de interrupción por falla en el oscilador. o CMIE – Habilitación de interrupción por el comparador. o EEIE – Habitación de interrupción por operación de escritura de datos en memoria EEPROM/Flash. o BCLIE – Habilitación de interrupción por colisión en BUS del MSSP. o HLVDIE – Habilitación de interrupción por detección de voltaje alto/bajo. o TMR3IE – Habilitación de interrupción por desbordamiento del TIMER 3. o CCP2IE – Habilitación de interrupción por el modulo CCP2. o
REGISTROS USADOS EN EL PROCESO DE INTERRUPCIÓN o
Registros de solicitud de interrupciones:
PSPIF – Bandera de interrupción por escritura/lectura de puerto paralelo esclavo (Debe ser limpiada mediante software). o ADIF – Bandera de interrupción por el convertidor analógico – digital (ADC) (Debe ser limpiada mediante software). o RCIF – Bandera de interrupción por recepción en USART (Debe ser limpiada mediante software). o TXIF – Bandera de interrupción por transmisión en USART (Debe ser limpiada mediante software). o SSPIF – Bandera de interrupción por el puerto serial síncrono maestro (MSSP) (Debe ser limpiada mediante software). o CCP1IF – Bandera de interrupción por el modulo CCP1 (Debe ser limpiada mediante software). o TMR2IF – Bandera de interrupción por comparación del TIMER 2 con el registro PR2 (Debe ser limpiada mediante software). TMR1IF rdamiento del TIMER 1 (Debe ser limpiada mediante software). o
REGISTROS USADOS EN EL PROCESO DE INTERRUPCIÓN o
Registros de solicitud de interrupciones:
OSCIF – Bandera de interrupción por falla en el oscilador (Debe ser limpiada mediante software). o CMIF – Bandera de interrupción por el comparador (Debe ser limpiada mediante software). o EEIF – Bandera de interrupción por operación de escritura de datos en memoria EEPROM/Flash (Debe ser limpiada mediante software). o BCLIF – Bandera de interrupción por colisión en BUS del MSSP (Debe ser limpiada mediante software). o HLVDIF – Bandera de interrupción por detección de voltaje alto/bajo (Debe ser limpiada mediante software). o TMR3IF – Bandera de interrupción por desbordamiento del TIMER 3 (Debe ser limpiada mediante software). o CCP2IF – Bandera de interrupción por el modulo CCP2 (Debe ser limpiada mediante software). o
REGISTROS USADOS EN EL PROCESO DE INTERRUPCIÓN o
Registros de nivel de prioridad de interrupciones:
HABILITANDO UNA INTERRUPCIÓN. o
Interrupciones primarias:
Cinco fuentes de interrupción tienen sus bits de habilitación localizados en los r egistros INTCON. o Estas fuentes de interrupción son referidas como “interrupciones primarias”. o Para habilitar estas interrupciones solo es necesario poner a ‘1’ el bit GIE/GIEH del registro INTCON. o
HABILITANDO UNA INTERRUPCIÓN. o
Interrupciones primarias: Limpiar una bandera de interrupción antes de habilitar las interrupciones, previene de activar solicitudes de interrupción pendientes y que esto desencadene una interrupción de forma inmediata.
o
HABILITANDO UNA INTERRUPCIÓN. o
Interrupciones de periféricos:
El PIC 18F4520 es capaz de generar solicitudes de interrupción para cada una de sus banderas de interrupción localizadas en los registros PIE. o Para habilitar una interrupción por periférico además de habilitar el GIE/GIEH se debe poner a ‘1’ también el bit PEIE/GIEL ambos en el registros INTCON. o
ATENDIENDO UNA INTERRUPCIÓN. Rutina de servicio de interrupción (ISR).
o
La ISR es un programa generado por el usuario el cual realiza las tareas necesarias cuando la interrupción ocurre. o El usuario es el responsable de programar la ISR y colocarla en el vector de interrupción (0008h o 0018h). o La ultima instrucción ejecutada debe ser RETFIE (Return From Interrupt). o Las ISRs pueden ser escritas en lenguaje ensamblador o o
La dirección del vector de interrupción corresponde a un PIC 16f1xxx.
ATENDIENDO UNA INTERRUPCIÓN. o
Verificando la fuente de la interrupción.
Hay uno o dos ISR (depende si se programan prioridades) que atienden a todas las fuentes de interrupción de la aplicación. o Debido a lo anterior la ISR o las ISR’s deben ser capaz de identificar la fuente (bandera) de interrupción que solicito la ISR. o
o
Limpiando las banderas de interrupción. Las banderas de solicitud de interrupción son “latcheadas” cuando son puestas a ‘1’.
o
Deben ser limpiadas dentro de la ISR. o De no hacerlo estas generaran de nuevo una interrupción justo después de salir de la ISR. o
INTERRUPCIONES EN EL COMPILADOR XC8. En MPLAB XC8 una función puede ser escrita para actuar como una ISR usando el calificador de interrupción (“interrupt”).
o
Se declara la función con el calificador “interrupt” y el compilador automáticamente colocara la función en la dirección del vector de interrupción.
o
o
Además el compilador se encarga de respaldar y restaurar los registros usados.
o
Las interrupciones deben declararse como “void” ya que no pueden tener parámetros.
En el caso de los PIC 18 para crear una ISR de las interrupciones de bajo nivel se debe declarar como “low_priority”.
o
INTERRUPCIONES EN EL COMPILADOR XC8 (SIN PRIORIDADES EN INTERRUPCIÓN).
INTERRUPCIONES EN EL COMPILADOR XC8 (CON PRIORIDADES EN INTERRUPCIÓN).
INTERRUPCIONES EN EL COMPILADOR XC8 (CON PRIORIDADES EN INTERRUPCIÓN).