Vous êtes sur la page 1sur 19

Semana 5 Las interrupciones del PIC18F

Mag. Ing. Sergio Salas A.

Las interrupciones
En el mundo de los microcontroladores, es muy comn implementar programas multitarea que se encuentran pendientes de mltiples procesos: lectura de un dato proveniente del ADC, recepcin de un byte por el puerto serie UART, pulsacin de una tecla del teclado matricial, un flanco de bajada de un sensor digital, el desbordamiento de un Timer, un evento de Reset, etc. Muchos de estos eventos son procesos no predecibles que pueden ocurrir en cualquier instante de tiempo. Si el procesador se encuentra siempre pendiente de que cualquiera de estos eventos ocurra pueden suceder ciertos problemas: 1. El consumo de energa aumenta. 2. El procesador puede perder un evento por no registrarlo a tiempo. 3. Si dos eventos ocurren en simultneo el procesador puede ignorar uno de ellos. 4. El procesador puede verse limitado en su capacidad de procesamiento al tener que sostener tantos procesos a la vez. Para evitar todos estos inconvenientes, los microcontroladores cuentan con un sistema de interrupciones que permite detectar eventos externos al procesador en los momentos que ocurren y solo ocupan al procesador con tareas en el instante que dicho evento ha sido generado. Mag. Ing. Sergio Salas A.

El concepto de una interrupcin

Telfono con la bocina malograda

Timbre malogrado

Hombre trabajando en la programacin de un microcontrolador PIC18F4550.

Mag. Ing. Sergio Salas A.

Posibles causas de interrupcin en el PIC18F4550


Interrupciones de perifricos
Interrupcin del temporizador Timer 1 Interrupcin del temporizador Timer 2

Interrupciones generales Interrupcin del temporizador TIMER 0 Interrupcin por cambio de estado del Puerto B Interrupcin externa 0 Interrupcin externa 1 Interrupcin externa 2

Interrupcin del temporizador Timer 3


Interrupcin del mdulo de comparacin y captura CCP1

Interrupcin del mdulo de comparacin y captura CCP2


Interrupcin del convertidor analgico digital Interrupcin de transmisin del EUSART Interrupcin por recepcin del EUSART Interrupcin del mdulo MSSP Interrupcin por colisin del mdulo MSSP Interrupcin del mdulo comparador Interrupcin por el USB Interrupcin por falla del oscilador Interrupcin por el evento de escritura de la memoria FLASH o EEPROM Interrupcin por bajo nivel de voltaje de alimentacin del PIC18F Interrupcin del SPP (StreamingParallel Port)

Mag. Ing. Sergio Salas A.

Configuracin de una interrupcin


La configuracin de una interrupcin se inicia con los siguientes pasos: 1. Definir con el bit IPEN del registro RCON si se va a trabajar con un nico nivel de prioridad o no. (Si IPEN = 0, se trabaja con una nica prioridad. Si IPEN = 1, se trabaja con interrupciones de alta y baja prioridad). 2. Habilitar el bit xxxIE (Interrupt Enable) de la interrupcin con la que se quiere trabajar . 3. Si IPEN = 1, definir si la interrupcin ser de alta o baja prioridad con el bit xxxIP (Interrupt Priority) de la interrupcin especfica con la cual se va a trabajar. 4. Poner el bit PEIE (Peripheral Interrupt Enable) del registro INTCON a 1 lgico si la interrupcin pertenece al conjunto de perifricos. 5. Poner el bit GIE (Global Interrupt Enable) del registro INTCON a 1 lgico para habilitar todas las interrupciones. 6. Definir en las direcciones 0x08 y 0x18 de la memoria de programa el salto a las rutinas de servicio de interrupcin. 7. Verificar cul es la bandera de interrupcin que se encuentra activa. 8. Borrar las banderas de interrupcin al salir de la rutina de servicio de interrupcin y retornar con la instruccin retfie. Mag. Ing. Sergio Salas A.

Qu ocurre en el PIC18F4550 durante una Interrupcin?


1. Primero, se supone que el PC se encuentra apuntando a una direccin especfica dentro de una tarea que se est ejecutando de manera continua. 2. Cuando ocurre una interrupcin, la bandera de dicho evento se pone a 1 lgico, lo cual hace que el valor del PC se guarde en la pila y este registro se cargue con el valor 0x008 o 0x0018 si la interrupcin es de alta o baja prioridad respectivamente. 3. En dichas direcciones se encuentra la instruccin de salto a la rutina de servicio de interrupcin (goto RUTINA_SERVICIO_INT). 4. En la rutina de servicio se debe analizar la fuente de la interrupcin, validando cul de las banderas de interrupcin se encuentran en nivel 1 lgico. 5. Dependiendo de esto se ejecuta una rutina especfica para cada fuente de interrupcin. 6. Antes de retornar de la interrupcin se debe PONER LA BANDERA DE INTERRUPCIN a nivel 0 lgico. 7. Se retorna de la interrupcin con la instruccin retfie, con lo cual el PC toma el ltimo valor almacenado en la pila y de esta manera retorna al programa principal a ejecutar la instruccin que corresponda antes del evento de interrupcin. Mag. Ing. Sergio Salas A.

El registro INTCON
TMR0IF: Bit de bandera de interrupcin de desbordamiento del Timer 0. Este bit da aviso que ha ocurrido dicho evento. INT0IF: Bit de bandera de interrupcin del evento de flanco de subida/bajada en el pin RB0 RBIF: Bit de bandera de interrupcin del Evento de cambio de estado de los pines RB7-RB4

GIE/GIEH: Bit habilitador global de las interrupciones. Si IPEN = 1, este bit se transforma en GIEH y funciona como habilitador de las interrupciones de alta prioridad. PEIE/GIEL: Bit habilitador de las interrupciones de los perifricos. Si IPEN = 1, este bit se transforma en GIEL y funciona como habilitador de las interrupciones de baja prioridad. TMR0IE: Bit habilitador de la interrupcin por desbordamiento del TMR0. INT0IE: Bit habilitador de la interrupcin externa 0 (Pin RB0) RBIE: Bit habilitador de la interrupcin por cambio de estado del Puerto B.

Mag. Ing. Sergio Salas A.

Ejemplo de una interrupcin


org 0x00 goto MAIN org 0x0008 ;Direccin del vector de interrupcin de alta prioridad goto RUT_INT ;Salto a la rutina de servicio de interrupcin org 0x0018 ;Direccin del vector de interrupcin de baja prioridad retfie ;Instruccin de retorno de la interrupcin org 0x0020 ;Direccin de inicio del programa MAIN: bsf INTCON,TMR0IE ;Se activa la interrupcin por desbordamiento del TMR0 bsf INTCON,RBIE :Se activa la interrupcin por cambio de estado del Puerto B bsf INTCON,GIE ;Se habilita la mscara global de interrupciones INICIO: call TAREA1 ;Se ejecuta la rutina TAREA1 de manera constante goto INICIO RUT_INT: ;Si ocurre un evento de interrupcin ya sea por el cambio de estado del Puerto B o por btfsc INTCON,TMR0IF ;desbordamiento del TMR0 el PC toma el valor 0x0008 y salta a la etiqueta RUT_INT goto TAREA2 ;Si el bit TMR0IF = 1 entonces el TMR0 fue la causa de la interrupcin y se salta a la btfsc INTCON,RBIF ;rutina TAREA 2. En caso sea el bit RBIF el que est en estado 1 lgico, entonces el goto TAREA3 ;cambio de estado del Puerto B es el causante de la interrupcin y se salta a la rutina bcf INTCON,TMR0IF;La bandera de interrupcin del TIMER 0 debe ser 0 antes de salir bcf INTCON,RBIF ;La bandera de interrupcin del Cambio de estado del Puerto B debe ser 0 al salir. retfie ;TAREA 3. En caso contrario, la fuente de la interrupcin fue otra no conocida y ;simplemente se retorna de la interrupcin

Mag. Ing. Sergio Salas A.

Los vectores de interrupcin


Los vectores de interrupcin son dos:
La direccin 0x008 para interrupciones de alta prioridad La direccin 0x018 para interrupciones de baja prioridad En ambas direcciones solo puede estar la instruccin de salto a la rutina de servicio de interrupcin, o un retfie en caso no se fuera a utilizar dicho vector. Es por esta razn que se suele comenzar el programa principal (MAIN) en la direccin 0x20 de la memoria de programa.

Mag. Ing. Sergio Salas A.

La rutina de servicio de interrupcin


En general, una rutina de servicio de interrupcin debe ser lo ms corta posible, ya que mientras esta se ejecuta, el bit GIE se pone a 0 lgico, con lo cual las dems interrupciones quedan desactivadas. Por lo tanto, de ocurrir otro evento este no ser atendido hasta que se culmine la rutina de servicio en curso con la instruccin retfie.

TAREA2: Instruccin 1 Instruccin 2 Instruccin 3 . . . bcf INTCON,TMR0IF retfie

;Bandera de interrupcin del TMR0 desactivada ;Retorno de la interrupcin

Mag. Ing. Sergio Salas A.

Interrupciones de alta y baja prioridad


Si es necesario que una rutina de servicio de interrupcin pueda ser interrumpida por otra interrupcin, se deben asignar prioridades. Una interrupcin de alta prioridad puede interrumpir a una de baja prioridad. Una interrupcin de baja prioridad no puede interrumpir ni a una de alta ni a otra de baja prioridad. Una interrupcin de alta prioridad no puede interrumpir a otra de alta prioridad. La prioridad de la interrupcin se elige con el bit IPEN = 1 lgico. Luego, cada interrupcin posee su bit xxxIP que le permite definir su prioridad. Si xxxIP = 0 lgico la interrupcin es de baja prioridad. En caso contrario se configura como alta prioridad. El registro INTCON2, contiene los bits de prioridad del Timer 0 (TMR0IP) y del cambio de estado del Puerto B (RBIP)

Las interrupciones de alta prioridad generan un salto al vector 0x08. Las interrupciones de baja prioridad generan un salto al vector 0x018. Mag. Ing. Sergio Salas A.

Ejemplo de configuracin de prioridades


#include<P18F4550.INC> org 0x00 goto MAIN org 0x08 goto TAREA3 org 0x018 goto TAREA2 org 0x20 MAIN: bsf RCON,IPEN bcf INTCON2,TMR0IP bsf INTCON2,RBIP bsf INTCON,RBIE bsf INTCON,TMR0IE bsf INTCON,GIEL bsf INTCON,GIEH INICIO: movlw '0' movwf 0x30,0 addlw 0x04 movwf 0x30,0 incf 0x30,f,0 goto INICIO

;Se activan las prioridades de las interrupciones ;Prioridad baja para TMR0 ;Prioridad alta para el cambio de estado del Puerto B ;Se habilita la interrupcin por cambio de estado del Puerto B ;Se habilita la interrupcin por cambio de estado del TMR0 ;Se habilita la mscara de interrupciones de baja prioridad ;Se habilita la mscara de interrupciones de alta prioridad ;PC=0x2E ;PC=0x30 ;PC=0x32 ;PC=0x34 ;PC=0x36 ;PC=0x38

Mag. Ing. Sergio Salas A.

La latencia de una interrupcin


Una interrupcin no es un proceso inmediato. Cuando una bandera de interrupcin se activa, el PC toma el valor 0x08 o 0x018 dependiendo de la prioridad de la interrupcin. El salto genera un retardo de 2 ciclos de instruccin, adicionales al hecho de que el procesador guarda en la pila rpida el valor del registro W, STATUS y BSR. Esto genera un retardo de un ciclo de instruccin adicional. Luego, en el vector de interrupcin se deber colocar el salto a la rutina de servicio de interrupcin lo que genera 2 ciclos ms de interrupcin, sumado al tiempo de la rutina de servicio de interrupcin completa, que dependiendo de su complejidad puede tomar varios ciclos de instruccin. Finalmente, esta rutina deber terminar con el borrado de la bandera de interrupcin y con la instruccin retfie, lo cual agrega 3 ciclos de instruccin adicionales. En resumen, la latencia de una interrupcin corresponde a los retardos inherentes que no pueden ser obviados por el programador. El retardo mnimo est formado por 3 ciclos de instruccin en el acceso al vector, luego, 2 ciclos por el salto a la rutina de interrupcin y al menos tres ciclos de instruccin para borrar la bandera y salir de la rutina de servicio. Esto suma una latencia de 8 ciclos de instruccin. Mag. Ing. Sergio Salas A.

Ejemplo de una interrupcin externa INT0

Suponga que cada vez que se detecta un flanco de bajada se cambia el estado del pin RD2, el cual se conecta a un LED.

Mag. Ing. Sergio Salas A.

Programa de configuracin del INT0


goto MAIN org 0x008 goto INT_INT0 org 0x018 retfie org 0x020

MAIN:

INICIO:

setf TRISB bcf INTCON2,RBPU bcf TRISD,2 bcf INTCON2,INTEDG0 bsf INTCON,INT0IE bsf INTCON,GIE

;Pull UP del Puerto B en ON ;RD2 salida digital ;Se elige flanco de bajada para la INT0 ;INT0 ON ;Interrupciones globales activas ;Rutina de servicio de interrupcin INT0

goto INICIO INT_INT0: btg LATD,2 bcf INTCON,INT0IF retfie END

Mag. Ing. Sergio Salas A.

El Timer 0
El TMR0 es un registro de 8 bits (que puede operar en modo de 16 bits) que se encarga de contar automticamente de 0 hasta 255. Cuando la cuenta del TMR0 pasa de 255 a 0, ocurre un desbordamiento con lo cual el bit TMR0IF se pone a 1 lgico. El evento de desbordamiento puede producir una interrupcin. El TMR0 es un registro de lectura y escritura. La fuente de reloj para el conteo puede ser FOSC/4 o una seal externa. El TMR0 cuenta con un prescaler que permite reducir la velocidad de conteo en un factor potencia de 2.

Mag. Ing. Sergio Salas A.

El registro T0CON

TMR0ON: 1: Timer 0 ON 0: Timer 0 OFF T08BIT: 1: TMR0 es un contador de 8 bits 0: TMR0 es un contador de 16 bits TOCS: 1: Fuente de reloj pin T0CKI 0: Fuente de reloj FOSC/4 TOSE: 1: TMR0 se incrementa en el flanco de bajada de T0CKI 0: TMR0 se incrementa en el flanco de subida de T0CKI

PSA: 1: Timer 0 NO usa prescaler 0: Timer 0 SI usa prescaler TOPS2 TOPS1 TOPS0: prescaler 0 0 0 1/2 0 0 1 1/4 0 1 0 1/8 0 1 1 1/16 1 0 0 1/32 1 0 1 1/64 1 1 0 1/128 1 1 1 1/256

Mag. Ing. Sergio Salas A.

Clculo del tiempo de desbordamiento


Suponga que se utiliza un cristal de 4 MHz. Entonces, el tiempo de conteo para un prescaler de es: tiempo de conteo = 1seg x prescaler = 2seg El tiempo de desbordamiento ser: tiempo de desbordamiento = 2segx256 = 512 seg

Mag. Ing. Sergio Salas A.

Interrupcin del TMR0


Cuando se produce una interrupcin o un evento de desbordamiento del TMR0 es imprescindible que la bandera TMR0IF se ponga a nivel 0 lgico ya que de no hacerlo el TMR0 no continuar contando.

La generacin de eventos de interrupcin cada 1segx(1/prescaler) genera retardos de tiempo fijos, en los cuales si la rutina de servicio de interrupcin resulta de una duracin menor al tiempo de desbordamiento, entonces esta rutina podr ejecutarse de forma peridica con un lapso preciso. Este es el principio para poder generar retardos de tiempo exactos de 1 segundo Por ejemplo. Claro para esto se necesita otra fuente de reloj de conteo, por lo cual el Timer 0 queda descartado. Para este tipo de aplicaciones se usar ms adelante el Timer 1.

Mag. Ing. Sergio Salas A.

Vous aimerez peut-être aussi