TEMA 5. INTERRUPCIONES Prof. Luis Zurita Microcontroladores IUT Cumaná
INTERRUPCIONES “ Las interrupciones son desviaciones del flujo de control del programa originadas asíncronamente, por diversos sucesos que no se hallan bajo la supervisión de las instrucciones. Dichos sucesos pueden ser externos al sistema, como la generación de un flanco o nivel activo en una patilla del microcontrolador, o bien, internos, como el desbordamiento de un contador. Su comportamiento es similar al de la instrucción “call” de llamado a subrutina. Se detiene la ejecución del programa en curso, se salva la dirección actual del contador de programa (PC) en la pila (STACK) y se carga el PC con una dirección, que en el caso de una interrupción es una dirección reservada de la memoria de código, llamada vector de interrupción”. Parejo. Microcontroladores PIC. Pág. 117. 2da Edición. En el PIC 16F84, este vector de interrupción está ubicado en la posición 04H, en donde comenzará la rutina de servicio de la interrupción. Ejemplo: org 00H ; Vector de origen del programa goto INICIO ; salto a la rutina de programa principal org 04H ; Vector de interrupción goto INTERR ; salto a la rutina de interrupción. La idea de colocar una instrucción de salto incondicional, es la de trasladar el flujo del programa a la zona de memoria de código que contiene a la rutina de interrupción. Prof. Luis Zurita IUT Cumaná
DIAGRAMA DE FLUJO DURANTE UNA INTERRUPCIÓN Prof. Luis Zurita Programa normal Instrucción 1 Instrucción 2 Instrucción 3 … … … Instrucción 24 Instrucción 25 … … Instrucción N Fin de programa Rutina de Servicio de Interrupción Instrucción 1 Instrucción 2 … … … RETFIE Nota:  Una Rutina de Servicio de Interrupción puede ser igual de  extensa e incluso más que el mismo programa principal. IUT Cumaná
DIAGRAMA DE FLUJO RSI IUT Cumaná
CAUSAS DE INTERRUPCIÓN Activación del pin RB0/INT Desbordamiento del TMR0 Cambio de estado de una de los 4 pines de más peso (RB7:RB4) del puerto B Finalización de la escritura en la EEPROM de datos REGISTRO INTCON Este registro se encuentra ubicado en la posición 0BH del banco 0 de los registros de funciones especiales (SFR). A continuación se describirán cada uno de sus bits: Prof. Luis Zurita IUT Cumaná
GIE: (Global Interrupt Enable), Permiso Global de Interrupciones 1: Habilita todas las interrupciones, cuyos bits de permiso individuales también las permitan 0: Deshabilita todas las interrupciones EEIE: (EEPROM Interrupt Enable), Permiso de Interrupción por fin de escritura en la EEPROM 1: Habilita la interrupción cuando termina la escritura de la EEPROM de datos 0: Deshabilita esta interrupción TOIE: (TMR0 Overflow Interrupt Enable), Permiso de interrupción por desborde del TMR0 1: Habilita una interrupción por desborde del TMR0 0: Deshabilita esta interrupción INTE: (Interrupt Enable RB0/INT), Permiso de interrupción por activación del pin RB0/INT 1: Habilita la interrupción al activarse RB0/INT 0: Deshabilita esta interrupción INTCON Prof. Luis Zurita IUT Cumaná
INTCON RBIE: (RB Port Change Interrupt Enable), Permiso de interrupción por cambio de estado en RB7:RB4 1: Habilita esta interrupción 0: Deshabilita esta interrupción TOIF: (TMR0 Overflow Interrupt Flag), Señalizador de desborde del TMR0 1: Ha ocurrido un desborde del TMR0 0: No se ha desbordado el TMR0 INTF: (RB0/INT Interrupt Flag), Señalizador de activación del pin RB0/INT 1: Se ha activado RB0/INT 0: No se ha activado RB0/INT RBIF: (RB Port Change Interrupt Flag), Señalizador de cambio de estado en RB7:RB4 1: Pasa a 1 cuando cambia el estado de alguna de estas 4 líneas 0: No ha cambiado el estado de RB7: RB4 Prof. Luis Zurita IUT Cumaná
SALVANDO EL ENTORNO Salvar el entorno, se refiere a mantener el valor exacto que tienen los registros de trabajo STATUS y W, y cualquier otro de importancia, que no vaya a ser modificado dentro de la subrutina de servicio de interrupción. Para salvar el entorno cuando ocurre una interrupción se recomienda seguir los siguientes pasos: Salvar a w y a STATUS. Almacenar a w en un registro general llamado W_TEMP  Almacenar a STATUS en un registro general llamado STATUS_TEMP Se ejecuta la rutina de interrupción (queda expresada para efectos del ejemplo siguiente) Restauramos a STATUS Restauramos a w NOTA : Los registros generales W_TEMP, STATUS_TEMP, deben ser declarados al inicio del programa, para no generar errores. Prof. Luis Zurita IUT Cumaná
SALVANDO EL ENTORNO ; **** Rutina para salvar el entorno **** PUSH movwf W_TEMP ; Copiamos w a este registro temporal swapf STATUS,0 ; Intercambiamos STATUS y lo guardamos en w movwf STATUS_TEMP ; Salvamos STATUS en STATUS_TEMP RUT_INT ;Aquí estará la rutina de  servicio de interrupción ; POP swapf STATUS_TEMP,0 ; Intercambiamos nibbles en el registro  ; STATUS_TEMP movf STATUS ; Movemos w al registro STATUS, retornando el  ; valor original swapf W_TEMP,1 ; Intercambiamos nibbles y lo mantenemos en ; este registro swapf W_TEMP,0  ; Intercambiamos nibbles y  lo trasladamos a w  ; retornando el valor original que tenía antes de ; entrar a la rutina de interrupción Prof. Luis Zurita Microcontroladores IUT Cumaná
Ejemplo.  Realicemos un programa completo que contenga varias interrupciones. Si la causa ha sido la activación del pin RB0, se debe mostrar un dos en binario en el puerto A, si ha sido un cambio de nivel en RB4:RB7, se debe mostrar el uno en binario en el puerto A y si se ha desbordado el TMR0, se debe mostrar el cuatro en binario en el puerto A. Programa Principal RSI
¿CUANDO UTILIZAR UNA INTERRUPCIÓN? Una interrupción es muy importante cuando deseamos realizar una tarea que no dependa de una exploración constante del programa sobre la misma. También cuando deseamos que nuestro programa responda de forma inmediata y automática a determinados eventos. Ejemplo del uso de Interrupción: En los sistemas de control, cuando se necesita un pulsador de parada de emergencia (PARE). En un diseño, cuando se requiere que nuestro circuito cumpla con determinadas tareas, al pulsarse una tecla (LAMP TEST). En el manejo de teclados, se recomienda su uso, ya que se puede meter al microcontrolador en un estado de reposo, ahorrando energía y esperando a que se pulse una tecla para iniciar una rutina de servicio (CLAVE). Cuando almacenamos información en la EEPROM y deseamos ser advertidos de que ésta se ha terminado (ALMACENAMIENTO). Etc... Prof. Luis Zurita IUT Cumaná

Curso Micro Tema 5

  • 1.
    TEMA 5. INTERRUPCIONESProf. Luis Zurita Microcontroladores IUT Cumaná
  • 2.
    INTERRUPCIONES “ Lasinterrupciones son desviaciones del flujo de control del programa originadas asíncronamente, por diversos sucesos que no se hallan bajo la supervisión de las instrucciones. Dichos sucesos pueden ser externos al sistema, como la generación de un flanco o nivel activo en una patilla del microcontrolador, o bien, internos, como el desbordamiento de un contador. Su comportamiento es similar al de la instrucción “call” de llamado a subrutina. Se detiene la ejecución del programa en curso, se salva la dirección actual del contador de programa (PC) en la pila (STACK) y se carga el PC con una dirección, que en el caso de una interrupción es una dirección reservada de la memoria de código, llamada vector de interrupción”. Parejo. Microcontroladores PIC. Pág. 117. 2da Edición. En el PIC 16F84, este vector de interrupción está ubicado en la posición 04H, en donde comenzará la rutina de servicio de la interrupción. Ejemplo: org 00H ; Vector de origen del programa goto INICIO ; salto a la rutina de programa principal org 04H ; Vector de interrupción goto INTERR ; salto a la rutina de interrupción. La idea de colocar una instrucción de salto incondicional, es la de trasladar el flujo del programa a la zona de memoria de código que contiene a la rutina de interrupción. Prof. Luis Zurita IUT Cumaná
  • 3.
    DIAGRAMA DE FLUJODURANTE UNA INTERRUPCIÓN Prof. Luis Zurita Programa normal Instrucción 1 Instrucción 2 Instrucción 3 … … … Instrucción 24 Instrucción 25 … … Instrucción N Fin de programa Rutina de Servicio de Interrupción Instrucción 1 Instrucción 2 … … … RETFIE Nota: Una Rutina de Servicio de Interrupción puede ser igual de extensa e incluso más que el mismo programa principal. IUT Cumaná
  • 4.
    DIAGRAMA DE FLUJORSI IUT Cumaná
  • 5.
    CAUSAS DE INTERRUPCIÓNActivación del pin RB0/INT Desbordamiento del TMR0 Cambio de estado de una de los 4 pines de más peso (RB7:RB4) del puerto B Finalización de la escritura en la EEPROM de datos REGISTRO INTCON Este registro se encuentra ubicado en la posición 0BH del banco 0 de los registros de funciones especiales (SFR). A continuación se describirán cada uno de sus bits: Prof. Luis Zurita IUT Cumaná
  • 6.
    GIE: (Global InterruptEnable), Permiso Global de Interrupciones 1: Habilita todas las interrupciones, cuyos bits de permiso individuales también las permitan 0: Deshabilita todas las interrupciones EEIE: (EEPROM Interrupt Enable), Permiso de Interrupción por fin de escritura en la EEPROM 1: Habilita la interrupción cuando termina la escritura de la EEPROM de datos 0: Deshabilita esta interrupción TOIE: (TMR0 Overflow Interrupt Enable), Permiso de interrupción por desborde del TMR0 1: Habilita una interrupción por desborde del TMR0 0: Deshabilita esta interrupción INTE: (Interrupt Enable RB0/INT), Permiso de interrupción por activación del pin RB0/INT 1: Habilita la interrupción al activarse RB0/INT 0: Deshabilita esta interrupción INTCON Prof. Luis Zurita IUT Cumaná
  • 7.
    INTCON RBIE: (RBPort Change Interrupt Enable), Permiso de interrupción por cambio de estado en RB7:RB4 1: Habilita esta interrupción 0: Deshabilita esta interrupción TOIF: (TMR0 Overflow Interrupt Flag), Señalizador de desborde del TMR0 1: Ha ocurrido un desborde del TMR0 0: No se ha desbordado el TMR0 INTF: (RB0/INT Interrupt Flag), Señalizador de activación del pin RB0/INT 1: Se ha activado RB0/INT 0: No se ha activado RB0/INT RBIF: (RB Port Change Interrupt Flag), Señalizador de cambio de estado en RB7:RB4 1: Pasa a 1 cuando cambia el estado de alguna de estas 4 líneas 0: No ha cambiado el estado de RB7: RB4 Prof. Luis Zurita IUT Cumaná
  • 8.
    SALVANDO EL ENTORNOSalvar el entorno, se refiere a mantener el valor exacto que tienen los registros de trabajo STATUS y W, y cualquier otro de importancia, que no vaya a ser modificado dentro de la subrutina de servicio de interrupción. Para salvar el entorno cuando ocurre una interrupción se recomienda seguir los siguientes pasos: Salvar a w y a STATUS. Almacenar a w en un registro general llamado W_TEMP Almacenar a STATUS en un registro general llamado STATUS_TEMP Se ejecuta la rutina de interrupción (queda expresada para efectos del ejemplo siguiente) Restauramos a STATUS Restauramos a w NOTA : Los registros generales W_TEMP, STATUS_TEMP, deben ser declarados al inicio del programa, para no generar errores. Prof. Luis Zurita IUT Cumaná
  • 9.
    SALVANDO EL ENTORNO; **** Rutina para salvar el entorno **** PUSH movwf W_TEMP ; Copiamos w a este registro temporal swapf STATUS,0 ; Intercambiamos STATUS y lo guardamos en w movwf STATUS_TEMP ; Salvamos STATUS en STATUS_TEMP RUT_INT ;Aquí estará la rutina de servicio de interrupción ; POP swapf STATUS_TEMP,0 ; Intercambiamos nibbles en el registro ; STATUS_TEMP movf STATUS ; Movemos w al registro STATUS, retornando el ; valor original swapf W_TEMP,1 ; Intercambiamos nibbles y lo mantenemos en ; este registro swapf W_TEMP,0 ; Intercambiamos nibbles y lo trasladamos a w ; retornando el valor original que tenía antes de ; entrar a la rutina de interrupción Prof. Luis Zurita Microcontroladores IUT Cumaná
  • 10.
    Ejemplo. Realicemosun programa completo que contenga varias interrupciones. Si la causa ha sido la activación del pin RB0, se debe mostrar un dos en binario en el puerto A, si ha sido un cambio de nivel en RB4:RB7, se debe mostrar el uno en binario en el puerto A y si se ha desbordado el TMR0, se debe mostrar el cuatro en binario en el puerto A. Programa Principal RSI
  • 11.
    ¿CUANDO UTILIZAR UNAINTERRUPCIÓN? Una interrupción es muy importante cuando deseamos realizar una tarea que no dependa de una exploración constante del programa sobre la misma. También cuando deseamos que nuestro programa responda de forma inmediata y automática a determinados eventos. Ejemplo del uso de Interrupción: En los sistemas de control, cuando se necesita un pulsador de parada de emergencia (PARE). En un diseño, cuando se requiere que nuestro circuito cumpla con determinadas tareas, al pulsarse una tecla (LAMP TEST). En el manejo de teclados, se recomienda su uso, ya que se puede meter al microcontrolador en un estado de reposo, ahorrando energía y esperando a que se pulse una tecla para iniciar una rutina de servicio (CLAVE). Cuando almacenamos información en la EEPROM y deseamos ser advertidos de que ésta se ha terminado (ALMACENAMIENTO). Etc... Prof. Luis Zurita IUT Cumaná