Está en la página 1de 39

INTERRUPCIONES

• Una Interrupción detiene la ejecución de un programa y pasan a la rutina de


servicio del evento que provoca la interrupción.

•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.
LÓGICA DE INTERRUPCIONES
TIEMPO DE LATENCIA
Es el tiempo que transcurre desde que se produce un evento de
interrupción hasta que se ejecuta la instrucción de la dirección 04H.
• Interrupciones síncronas (normalmente internas) tiempo de
latencia= 3 Tcy.
• Interrupciones asíncronas (normalmente externas) tiempo de
latencia= 3-3,75 Tcy.
Respuesta a un evento en el pin INT.

(1) El flag INTF se muestrea cada Q1.


(2) El tiempo de latencia comprendido entre 3 y 3,75 Tcy.
(3) CLKOUT disponible solo si el oscilador es RC.
(4) Anchura mínima de pulso requerida en función de la MCU (20ns. APROX.)
(5) INTF debe ponerse a cero por Sw.
Fases en la gestión de interrupciones:

1. PC->Pila y GIE=0
2. PC=0004H
3. Se salvan los registros cuyo contenido se desee conservar
(W, STATUS, etc.) ≡ PUSH
4. Se determina la fuente de interrupción (interrogando los
flags correspondientes)
5. Se ejecuta la rutina de servicio a la interrupción
6. Se borra el flag relacionado con la interrupción atendida.
7. Se restauran los registros ≡ POP
8. Se ejecuta RETFIE
9. Pila->PC y GIE=1
Salvaguarda de W y el registro STATUS, en un rutina de servicio
a una interrupción:
Salvaguarda de W y el registro STATUS, y PCLATH en un rutina
de servicio a una interrupción:
MOVWF W_TEMP ;Copy W to TEMP register
SWAPF STATUS,W ;Swap status to be saved into W
CLRF STATUS ;bank 0, regardless of current bank, Clears
IRP,RP1,RP0
MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register
MOVF PCLATH, W ;Only required if using pages 1, 2 and/or 3
MOVWF PCLATH_TEMP ;Save PCLATH into W
CLRF PCLATH ;Page zero, regardless of current page
:
:(ISR) ;(Insert user code here)
:
MOVF PCLATH_TEMP, ;Restore PCLATH
W
MOVWF PCLATH ;Move W into PCLATH
SWAPF STATUS_TEMP,W ;Swap STATUS_TEMP register into W
;(sets bank to original state)
MOVWF STATUS ;Move W into STATUS register
SWAPF W_TEMP,F ;Swap W_TEMP
SWAPF W_TEMP,W ;Swap W_TEMP into W
REGISTRO INTCON

Bit 3 RBIE: (RB Port Change Interrupt Enable) bit de habilitación de interrupción con el cambio de
RB7:RB4
1 = Habilita la interrupción.
0 = Inhibe las interrupción.
(2) Algunas MCU no
disponen de esta
característica
(1) También se
puede encontrar
con el nombre
GPIE.
Bit 2 T0IF: (Timer 0 Overflow
Interrupt Flag).
1 = Interrupción producida por el desbordamiento del Timer 0 (debe ser puesto a cero por SW).
0 = El Timer 0 no se ha desbordado.
Bit 1 INTF: (INT External Interrupt Flag).
1 = Interrupción producida por INT (debe ser puesto a cero por SW).
0 = INT no ha interrumpido la MCU.
(2) Algunas MCU no disponen de esta característica
Bit 0 RBIF: (RB Port Change Interrupt Flag).
1 = Interrupción producida por el cambio en alguno de los bits RB7:RB4 (debe ser puesto a cero
REGISTRO INTCON

Bit 7 GIE: (Global Interrupt Enable) bit de habilitación global de


interrupciones 1 = Habilita las interrupciones.
0 = Inhibe todas las interrupciones.
Se pone a cero cuando se reconoce una interrupción (para evitar
interrupciones anidadas) y a 1 cuando se vuelve de su rutina de servicio.
Bit 6 PEIE: (Peripheral Interrupt Enable) bit de habilitación de interrupciones de
periféricos.
1 = Habilita las interrupciones desde los
periféricos. 0 = Inhibe las interrupciones desde los
periféricos.
(3) En MCU con un solo periférico puede
ser EEIE o ADIE

Bit 5 T0IE: (Timer 0 Overflow Interrupt Enable) bit de


habilitación del Timer 0.
1 = Habilita la interrupción con el desbordamiento del Timer
0 0 = Inhibe la interrupción con el desbordamiento del Timer
0.

Bit 4 INTE: (INT External Interrupt Enable) bit de habilitación de


interrupción desde el pin de entrada INT. 1 = Habilita la
INTERRUPCION RB0/INT
REGISTROS QUE INTERVIENE: INTCON Y OPTION_REG

EJEMPLO:
*
*
INICIO BSF STATUS,RP0 ; Configurando puertos
MOVLW 0x01 ; Carga W con 0000 0001
MOVWF TRISB ; RB0/INT es entrada
BCF OPTION_REG,6 ; Seleccionamos flanco descendente
BCF STATUS,RPO ;Habilitación de interrupciones–
BSF INTCON,GIE ; Habilitamos todas las interrupciones
BSF INTCON,INTE ; Que sean interrupciones externas
*
*
INTERRUPCION RB4…RB7
La interrupción por cambio del estado lógico en alguna de las 4 líneas de más peso
de la puerta B (RB7-RB4) del PIC. Para ello dichas líneas tienen que estar
Previamente configuradas como entradas. Este recurso hardware es muy utilizado
para el control de teclados.

El registro del PIC encargado de su configuración es INTCON:

GIE: Permiso global de interrupción.


1 – Permite todas las interrupciones cuyos bits particulares de permiso lo permitan.
0 – Prohíbe todas las interrupciones
 
RBI: Permiso de interrupción por cambio de estado en RB7:RB4
1 – Permite la interrupción
0 –Prohíbe está interrupción
 
RBIF: Señalización ó flag por cambio de estado de las patillas RB7:RB4.
1 – indica que la interrupción se ha producido.
0 – indica que no se ha activado.
El valor del registro INTCON según la secuencia del programa será la siguiente:
 
 Antes de producirse la interrupción:
 
GIE= 1 (Permitidas las interrupciones globales)
RBIE=1 (Permiso de interrupción por cambio de estado en RB7:RB4)
RBIF=0 (Señalización por cambio de estado de las patillas RB7:RB4 a nivel bajo)
 
Al producirse la interrupción:
 
GIE= 0 (No Permitidas las interrupciones globales)
RBIE=1 (Permiso de interrupción por cambio de estado en RB7:RB4, me da igual como
este porque la global está deshabilitada)
RBIF=1 (Señalización por cambio de estado de las patillas RB7:RB4 a nivel alto)
 
Al salir de la interrupción:
 
GIE= 1 (Permitidas las interrupciones globales)
RBIE=1 (Permiso de interrupción por cambio de estado en RB7:RB4)
RBIF=0 (Señalización por cambio de estado de las patillas RB7:RB4 a nivel bajo)
*
*
ORG 0X10
INICIO BANKSEL 0
BSF INTCON,7
;PERMITO LAS INTERRUPCIONES A NIVEL GLOBAL
BSF INTCON,4
;HABILITO LAS INTERRUPCIONES POR RB0/INT
BSF INTCON,3
;HABILITO LAS INTERRUPCIONES POR CAMBIO DE NIVEL EN RB4:RB7
BANKSEL OPTION_REG
BCF OPTION_REG,7
;ACTIVO LAS RESISTENCIAS PULL-UP
BSF OPTION_REG,6
;INTERRUPCION POR FLANCO ASCENDENTE
BANKSEL TRISB
MOVLW 0XF0
MOVWF TRISB ;RB4:RB7 COMO ENTRADAS MOVLW
0X00
MOVWF TRISD ;RD0:RD7 COMO SALIDAS
BANKSEL 0
*
*
ORG 0X04 ;CUANDO HAY UNA INTERRUPCION, EL
;CONTADOR DE PROGRAMA VIENE ACÁ CALL
RUT_INT ;SE QUIERE QUE ESCRIBAMOS LAS
;RUTINAS DE INTERRUPCION
BCF INTCON,RBIF
RETFIE

RUT_INT
BTFSS INTCON,RBIF ;SI, ENTONCES, INTERRUPCION POR
;RB4:RB7?
RETURN
*
*
*
*
*
*
*
RETURN
.
OPTION: los bits que están en color verde son los que están implicados en la
configuración del TIMER0

• PS0, PS1 y PS2: Configuración del preescaler. El preescaler es un divisor de pulsos


que está a la entrada del Timer-contador. El prescaler divide el número de pulsos que le
entran al timer-contador o al Wachtdog. El factor de división es el siguiente (según los
valores de PS2, PS1 y PS0 respectivamente
 

 
• PSA: Bit de asignación de prescaler. Si está a "1" el prescaler se asigna a WDT
(Wachtdog), si está a "0" se asigna al TMR0.

• TOSE: Bit de selección del tipo de flanco para el TMR0. A "1" se incrementa TMR0
Que significa cada uno de los bits que están implicados en
la interrupción por el TMR0

TOIF:

Solo se puede leer su valor, es un Flag o bandera que se pone a “1” cuando se
produce un desbordamiento  del TMR0, (este o no este configurado para
producir una interrupción). Cuando se trabaja en Ensamblador, este bit hay que
ponerlo a "0" por programa.

TOIE(Habilita la interrupción por desbordamiento de TMR0).

Si este bit esta a "1" la interrupción por desbordamiento de TMR0 es posible.

GIE (Habilita las interrupciones globalmente).

Este bit permite que cualquier interrupción sea posible. Para poder usar
cualquier interrupción hay que habilitarla globalmente e individualmente.
CBLOCK 0X20

ENDC
    ORG  0X00
    GOTO CONFIGURA
   
    ORG 0X04
GOTO INTERRUPCION

ORG 0X05
INTERRUPCION COMF PORTB,F
MOVLW .7
MOVWF TMR0
BCF INTCON,T0IF
RETFIE
 CONFIGURA *
*
BANKSEL  OPTION_REG
MOVLW B'00000000'
MOVWF OPTION_REG
MOVLW B'10100000'
MOVWF INTCON
*
*
El OPTION_REG:
BANKSEL  OPTION_REG
MOVLW B'00000000‘
MOVWF OPTION_REG

BIT 7 Pull up PORTB Disable


BTI 6 interrupción por flaco de subida en el INT Pin
BIT 5 fuente del clock para el TMR0, interna 1 ciclo de instrucción (1/Fosc)
BIT 4 Flanco de bajada para el incremento del TMR0
BIT 3  Prescaler asignado al TMR0
BIT 2-0 División del Prescaler 

El INTCON:
MOVLW B'10100000'
                 MOVWF OPTION_REG

BIT 7 Activamos las interrupciones Globales


BIT 6 interrupciones de otros periféricos desactivadas
BIT 5 Habilitamos la interrupción por desborde en el TMR0
BIT 4 deshabilitamos interrupción externa INT
BIT 3  deshabilitamos interrupción por cambio en el PORTB
BIT 2 bandera interrupción en TMR0
BIT 1 bandera interrupción en INT
BIT 0 bandera interrupción por cambio en PORTB
EJEMPLOS
EJEMPLO
Trabajando con un 16F877A, el Timer 1 en
modo contador, con un cristal de 32,768 kHz
entre las paticas RC0 y RC1...
LIST      P=16F877A
       INCLUDE   "P16F877A.INC"

       ORG        0X00               


       GOTO      PRINCIPAL     
       ORG         0X04         
       GOTO      INTERRUM     
       ORG        0X05             

;----------------PROGRAMA PRINCIPAL-----------------------------
PRINCIPAL
                    CLRF      PORTC             ; LIMPIO EL PUETO C
       CLRF      PORTB              ; LIMPIA LOS BITS DEL PUERTO B
          BSF       STATUS,RP0      ; SELECCIONA EL BANCO 1
          BSF    PIE1,TMR1IE     ; HABILITO LA INTERRUPCIÓN POR TIMER1
       MOVLW     0X00             ; PARA CONFIGURAR EL PUERTO B
       MOVWF     TRISB           ; CONFIGURA PUERTO B COMO SALIDA
       MOVLW     0XFF             ; PARA CONFIGURAR LOS PUERTOS
; COMO ENTRADAS
       MOVWF     TRISC          ; CONFIGURA EL PUERTO C COMO
;ENTRADA         
       CLRF      STATUS           ; REGRESA AL BANCO 0
 ;-------------------CONFIGURACIÓN DEL TIMER 1---------------------
       BSF        T1CON,0      ; HABILITAMOS EL TIMER 1 (TMR1ON=1)
       BSF        T1CON,1      ; SEÑAL DEL RELOJ DEL TIMER 1 EXTERNA
;(TMR1CS=1)
       BSF        T1CON,2      ; NO SE SINCRONIZA LA SEÑAL DE RELOJ DEL TMR1
;CON LA SEÑAL EXTERNA (T1SYNC=1)
       BCF        T1CON,3      ; NO HABILITA EL OSCILADOR DEL TIMER 1
;(T1OSCEN=0)
       BCF        T1CON,4      ; PRE DIVISOR DE FRECUENCIA EN 1 (T1CKPS0=0)
       BCF        T1CON,5      ; PRE DIVISOR DE FRECUENCIA EN 1 (T1CKPS1=0)
;-------------------HABILITACION DE INTERRUPCIONES----------------
BSF     INTCON, PEIE  ; Habilitamos interrupción por periféricos
BSF     INTCON,GIE    ; HABILITAMOS TODAS LAS INTERRUPCIONES
SUEÑO  NOP                                 
       GOTO     SUEÑO            ; A DORMIR!!!!
GOTO     SUEÑO            ; A DORMIR!!!!
              
;-------------------RUTINA DE SERVICIO DE INTERRUPCIÓN------------
INTERRUM   
          BTFSC   PORTB,1           ; PREGUNTO COMO ESTÁ EL LED, ENCENDIDO
;O APAGADO?
       GOTO   OFF_LED           ; ESTA PRENDIDO, VOY A APAGARLO
       BSF   PORTB,1           ; ESTA APAGADO, VOY Y LO ENCIENDO
      
BCF   PIR1,TMR1IF      ; BORRO LA BANDERA DE
;INTERRUPCIÓNPOR TMR1
       RETFIE                          ;REGRESO DE INTERRUPCION
OFF_LED   
       BCF    PORTB,1           ; APAGO EL LED
       BCF    PIR1,TMR1IF    ; BORRO LA BANDERA DE
;INTERRUPCIÓN POR TMR1
       RETFIE                          ; REGRESO DE
;INTERRUPCION

      END                                  ; FIN DE PROGRAMA

También podría gustarte