Você está na página 1de 15

INTERRUPCIONES

Una interrupcin se define como un pedido de alta prioridad que un dispositivo exterior o un evento de programacin solicita a la CPU para ejecutar otro programa. El uC 18F4550 posee 21 fuentes de interrupciones. Se distinguen dos grupos de interrupciones: 1. Grupo general de interrupciones: Interrupcin del Temporizador 0. Interrupcin por cambio de estado en PORTB: Puertos B.4, B.5, B.6, B.7. En este caso cualquier cambio produce la misma interrupcin. Interrupcin externa 0: Puerto B.0 Interrupcin externa 1: Puerto B.1 Interrupcin externa 2: Puerto B.2 Interrupcin del SPP Interrupcin del A/D Interrupcin de recepcin de la EUSART Interrupcin de transmisin de la EUSART Interrupcin del MSSP Interrupcin del CCP1 Interrupcin del Temporizador 2 Interrupcin del Temporizador 1 Interrupcin de fallo del oscilador Interrupcin del comparador Interrupcin del USB Interrupcin de de escritura en FLASH/EEPROM Interrupcin de colisin del Bus (MSSP) Interrupcin de deteccin de anomalas en VDD Interrupcin del Temporizador 3 Interrupcin del CCP2 INCONT Preparado por: Sixto Reinoso V.

2. Grupo de interrupciones de perifricos:

El grupo de registros que controlan las interrupciones son:

INCONT2 INCONT3 RCON

REGISTRO INTCON

GIE/GIEH: Bit de habilitacin global de las interrupciones. Su funcin depende del valor de IPEN: IPEN=0: o GIE=0: Interrupciones deshabilitadas a nivel global o GIE=1: Interrupciones habilitadas a nivel global IPEN=1: o GIEH=0: Interrupciones de alta prioridad deshabilitadas a nivel global o GIEH=1: Interrupciones de alta prioridad habilitadas a nivel global PEIE/GIEL: Bit de habilitacin global de las interrupciones de perifricos. Su funcin depende del valor de IPEN: IPEN=0: o PEIE=0: Interrupciones de perifricos deshabilitadas a nivel global o PEIE=1: Interrupciones de perifricos habilitadas a nivel global IPEN=1: o GIEL=0: Interrupciones de baja prioridad deshabilitadas a nivel global o GIEL=1: Interrupciones de baja prioridad habilitadas a nivel global TMR0IE: Bit de habilitacin de la interrupcin de desbordamiento del Temporizador 0 o TMR0IE=0: Interrupcin de desbordamiento del Temporizador 0 deshabilitada o TMR0IE=1: Interrupcin de desbordamiento del Temporizador 0 habilitada INT0IE: Bit de habilitacin de la interrupcin externa 0 o INT0IE=0: Interrupcin externa 0 deshabilitada o INT0IE=1: Interrupcin externa 0 habilitada RBIE: Bit de habilitacin de la interrupcin por cambio en el Puerto B o RBIE=0: Interrupcin por cambio en el Puerto B deshabilitada o RBIE=1: Interrupcin por cambio en el Puerto B habilitada TMR0IF: Flag de la interrupcin de desbordamiento del Temporizador 0 o TMR0IF=0: No se ha producido desbordamiento del Temporizador 0 o TMR0IF=1: Se ha producido desbordamiento del Temporizador 0 Preparado por: Sixto Reinoso V.

INT0IF: Flag de la interrupcin externa 0 o INT0IF=0: No se ha producido un flanco en la lnea RB0/INT0 o INT0IF=1: Se ha producido un flanco en la lnea RB0/INT0 RBIF: Flag de la interrupcin por cambio en el Puerto B o RBIF=0: No se ha producido ningn cambio en ninguna de las lneas RB7..RB4 o RBIF=1: Se ha producido ningn cambio en ninguna de las lneas RB7..RB4 REGISTRO INTCON2

RBPU: Bit de habilitacin de las resistencias de pull-up del Puerto B: RBPU=0: Las resistencias de pull-up del Puerto B estn activadas RBPU=1: Las resistencias de pull-up del Puerto B estn desactivadas INTEDG0: Bit de seleccin de flanco de la interrupcin externa 0: INTEDG0=0: La interrupcin externa 0 se dispara por flanco de bajada INTEDG0=1: La interrupcin externa 0 se dispara por flanco de subida INTEDG1: Bit de seleccin de flanco de la interrupcin externa 1: INTEDG1=0: La interrupcin externa 1 se dispara por flanco de bajada INTEDG1=1: La interrupcin externa 1 se dispara por flanco de subida INTEDG2: Bit de seleccin de flanco de la interrupcin externa 2: INTEDG2=0: La interrupcin externa 2 se dispara por flanco de bajada INTEDG2=1: La interrupcin externa 2 se dispara por flanco de subida TMR0IP: Bit de seleccin de prioridad de la interrupcin del Temporizador 0 TMR0IP=0: Prioridad baja para la interrupcin del Temporizador 0 TMR0IP=1: Prioridad alta para la interrupcin del Temporizador 0 RBIP: Bit de seleccin de prioridad de la interrupcin por cambio en el Puerto B RBIP=0: Prioridad baja para la interrupcin por cambio en el Puerto B RBIP=1: Prioridad alta para la interrupcin por cambio en el Puerto B REGISTRO INTCON3

INT2IP: Bit de seleccin de prioridad de la interrupcin externa 2 INT2IP=0: Prioridad baja para la interrupcin externa 2 INT2IP=1: Prioridad alta para la interrupcin externa 2 INT1IP: Bit de seleccin de prioridad de la interrupcin externa 1 INT1IP=0: Prioridad baja para la interrupcin externa 1 INT1IP=1: Prioridad alta para la interrupcin externa 1 INT2IE: Bit de habilitacin de la interrupcin externa 2 INT2IE=0: Interrupcin externa 2 deshabilitada INT2IE=1: Interrupcin externa 2 habilitada Preparado por: Sixto Reinoso V.

INT1IE: Bit de habilitacin de la interrupcin externa 1 INT1IE=0: Interrupcin externa 1 deshabilitada INT1IE=1: Interrupcin externa 1 habilitada INT2IF: Flag de la interrupcin externa 2 INT2IF=0: No se ha producido flanco en la lnea RB2/INT2 INT2IF=1: Se ha producido flanco en la lnea RB2/INT2 INT1IF: Flag de la interrupcin externa 1 INT1IF=0: No se ha producido flanco en la lnea RB1/INT1 INT1IF=1: Se ha producido flanco en la lnea RB1/INT1

INSTRUCCIONES PBP PARA INTERRUPCIONES


ON INTERRUPT GOTO handler; Activa la interrupcin y salta a ejecutar el programa de la interrupcin handler. Se puede dar cualquier nombre de etiqueta a este programa. Seguido de esta instruccin se debe definir la fuente de interrupcin mediante el registro INTCON. INTCON = %10010000; habilita la interrupcin por el puerto B.0 en flanco positivo. INTCON = %10001000; habilita la interrupcin por el puerto B.4---B.7 en flanco positivo. Por defecto, la bandera INTDEG es 1 del registro INTCON2 por lo que el cambio ser detectado en flanco de subida. Para cambiar a flanco de bajada se debe cambiar la bandera INTDEG a 0, de la siguiente forma: INTCON2.6 = 0; censa en flanco de bajada. INTCON2.6 = 1; censa en flanco de subida.

DISABLE; deshabilita la interrupcin, o sea, indica hasta que punto el programa atiende la interrupcin. RESUME; Retorna a la lnea del programa en donde ocurri la interrupcin. RESUME etiqueta; El programa continua en la subrutina o handler indicado por el nombre de la etiqueta. ENABLE; Habilita la interrupcin. Preparado por: Sixto Reinoso V.

Ejemplo:
DEFINE OSC 12 LED1 VAR PORTD.0 LED2 VAR PORTD.1 ON INTERRUPT GOTO HandlerLuz Activa las interrupciones INTCON = %10010000 'Habilita la interrupcin por RB0 INICIO: HIGH LED1 PAUSE 200 LOW LED1 PAUSE 200 GOTO INICIO DISABLE

' Desabilita la interrupcin

HandlerLuz: HIGH LED2 PAUSE 2000 LOW LED2 INTCON = %10010000 'Habilita la interrupcin por RB0 RESUME 'Retorna a la siguiente instruccin del programa desde donde fue llamada la interrupcin ENABLE 'Habilita nuevamente a la interrupcin END

Interrupciones sucesivas
DEFINE OSC 12 LED1 VAR PORTD.0 LED2 VAR PORTD.1 ON INTERRUPT GOTO LUZ INTCON= %10010000 INICIO: HIGH LED1 PAUSE 500 LOW LED1 PAUSE 500 GOTO INICIO DISABLE LUZ: HIGH LED2 PAUSE 5000 LOW LED2 INTCON = %10010000 ON INTERRUPT GOTO FIN RESUME LUZ2 ENABLE LUZ2: HIGH LED2 PAUSE 500 LOW LED2 PAUSE 500 GOTO LUZ2 DISABLE

Preparado por: Sixto Reinoso V.

FIN: HIGH LED1: HIGH LED2 PAUSE 5000 LOW LED1: LOW LED2 INTCON = %10010000 RESUME INICIO ENABLE END

GRAFICO PARA COMPROBAR PROGRAMAS

TAREAS: 1. Modifique el programa para que detecte el flanco de bajada. 2. Escribir un programa para utilizar la interrupcin externa por el puerto RB1. 3. Escribir un programa para utilizar la interrupcin externa por el puerto RB2. EL TEMPORIZADOR 0 El temporizador 0, es configurable como contador/temporizador de 8 / 16 bits. Pre-escalar de 8 bits programable y la interrupcin se ejecuta por desbordamiento. Registro T0CON Asociado al temporizador 0 se tiene el registro T0CON.

Preparado por: Sixto Reinoso V.

TMR0ON: Bit de puesta en marcha del Temporizador 0 T08BIT: Bit de configuracin del modo 8-bit/16-bit: T08BIT=0: Modo 16-bit T08BIT=1: Modo 8-bit T0CS: Bit de configuracin del modo contador/temporizador T0CS=0: Modo temporizador (TMR0 se incrementa en cada ciclo de instruccin FOSC/4) T0CS=1: Modo contador (TMR0 se incrementa en cada transicin de la lnea RA4/T0CKI) T0SE: Bit de seleccin de flanco en modo contador T0SE=0: TMR0 se incrementa en los flancos de subida de la lnea RA4/T0CKI T0SE=1: TMR0 se incrementa en los flancos de bajada de la lnea RA4/T0CKI PSA: Bit de activacin del pre-escalar PSA=0: Pre-escalar activado PSA=1: Pre-escalar no activado T0PS2..T0PS0: Bits de seleccin del pre-escalar del Temporizador 0: T0PS2 0 0 0 0 1 1 1 1 T0PS1 0 0 1 1 0 0 1 1 T0PS0 0 1 0 1 0 1 0 1 Valor del Pre - escalar 1:2 1:4 1:8 1:16 1:32 1:64 1:128 1:256

Temporizador 0 en modo de 8 bits.

Preparado por: Sixto Reinoso V.

Temporizador 0 en modo de 16 bits. La parte alta del TMR0 no es accesible directamente. Se accede a ella a travs de TMR0H para que funcione como buffer. Cuando se lee el valor de TMR0L, el valor de la parte alta de TMR0 pasa al TMR0H. Por tanto para leer el valor de TMR0 primero leemos TMR0L y luego leemos TMR0H. Cuando se escribe en TMR0L, el valor del registro TMR0H pasa a la parte alta de TMR0. Por tanto para escribir en TMR0 primero escribimos el valor de la parte alta en TMR0H y luego escribimos el valor de la parte baja en TMR0L.

Modo temporizador de 8 bits: T08BIT (T0CON)=1/T0CS (T0CON)=0 Dos opciones: Sin pre-escalar PSA (T0CON)=0: el registro TMR0L se incrementa con cada ciclo de instruccin (FOSC/4). Con pre-escalar PSA (T0CON)=1: el contador de pre-escalar se incrementa en cada ciclo de instruccin (FOSC/4). Cuando el preescalar alcanza el valor programado en los bits PS2..PS0 (T0CON) produce un pulso que incrementa el registro TMR0L. Cuando se produce desbordamiento de TMR0L se pone a 1 el flag TMR0IF Modo contador de 8 bits: T08BIT (T0CON)=1/T0CS (T0CON)=1 Dos opciones: Sin pre-escalar PSA (T0CON)=0: el registro TMR0L se incrementa con cada flanco de subida (T0SE=0) o de bajada (T0SE=0) de la lnea T0CKI (RA4). Con pre-escalar PSA (T0CON)=1: el contador de pre-escalar se incrementa con cada flanco de subida (T0SE=0) o de bajada (T0SE=0) Preparado por: Sixto Reinoso V.

de la lnea T0CKI (RA4). Cuando el pre-escalar alcanza el valor programado en los bits PS2..PS0 (T0CON) se produce un pulso que incrementa el registro TMR0L. Cuando se produce desbordamiento de TMR0L se pone a 1 el flag TMR0IF Modo temporizador de 16 bits: Dos opciones: Sin pre-escalar PSA (T0CON)=0: el registro TMR0 (16 bits) se incrementa con cada ciclo de instruccin (FOSC/4). Con pre-escalar PSA (T0CON)=1: el contador de pre-escalar se incrementa en cada ciclo de instruccin (FOSC/4). Cuando el preescalar alcanza el valor programado en los bits PS2..PS0 (T0CON) produce un pulso que incrementa el registro TMR0. Cuando se produce desbordamiento de TMR0 se pone a 1 el flag TMR0IF. Modo contador de 16 bits: T08BIT (T0CON)=1/T0CS (T0CON)=1 Dos opciones: Sin pre-escalar PSA (T0CON)=0: el registro TMR0 se incrementa con cada flanco de subida (T0SE=0) o de bajada (T0SE=0) de la lnea T0CKI (RA4). Con pre-escalar PSA (T0CON)=1: el contador de pre-escalar se incrementa con cada flanco de subida (T0SE=0) o de bajada (T0SE=0) de la lnea T0CKI (RA4). Cuando el pre-escalar alcanza el valor programado en los bits PS2..PS0 (T0CON) se produce un pulso que incrementa el registro TMR0. Cuando se produce desbordamiento de TMR0 se pone a 1 el flag TMR0IF. Interrupcin del Temporizador 0: Flag de interrupcin: bit TMR0IF (INTCON) Bit de habilitacin: bit TMR0IE (INTCON) Prioridad: bit TMR0IP (INTCON2): 0->pr. baja/1->pr. alta.

Si se produce el desbordamiento del Temporizador 0 se pone a 1 el flag TMR0IF. Si el bit de habilitacin TMR0IE est a 1 y las interrupciones estn habilitadas a nivel global se genera una interrupcin y el uC pasa a ejecutar el cdigo situado a partir de la posicin 0008H o 0018H (segn el nivel de prioridad establecido). En modo Temporizador: El TMR0 se incrementa con cada Ciclo de Instruccin (Fosc/4) y cuando el registro se desborde provocar una interrupcin. Preparado por: Sixto Reinoso V.

En modo Contador: El TMR0 se incrementar con cada pulso que ingrese por el pin RA4/T0CKI, y por supuesto, cuando se desborde producir la interrupcin. T0SE es el Bit4 del Registro T0CON, en l se selecciona el flanco con el cual se incrementar el TMR0 cuando haya un pulso por RA4. Adems, el micro dispone de dos temporizadores, el TMR0 y WDT (Watchdog). El primero es el que estamos tratando en esta seccin, el segundo es el perro guardin, lo que hace es vigilar cada cierto tiempo que el micro no se quede colgado, por ejemplo cuando se queda detenido en un bucle infinito o en una larga espera de un acontecimiento que no se produce, entonces acta reseteando al micro. El Prescalar es un predivisor de frecuencia que se utiliza comnmente para programar tiempos largos y se puede aplicarlo al TMR0 o al WDT, esto se configura en PSA Bit3 del registro T0CON.

Temporizacin con el registro TMR0L


El tiempo empleado en una temporizacin se puede calcular a partir de un ciclo de instruccin (es decir 1 instruccin por cada microsegundo, al trabajar con un oscilador de 4 Mhz), tambin se necesita el valor del Divisor de Frecuencia y finalmente con el complemento del valor cargado en TMR0 (es decir 256-TMR0, si se trabaja en modo de 8 bits), la ecuacin que permite realizar el clculo es la que sigue...
Tiempo = 4 * Toscilador * (256 - TMR0) * Rango Divisor de Frecuencia

De donde el 4 indica que el micro ejecuta una instruccin normal en 4 ciclos de reloj. Ejemplo: Se desea una temporizacin de 10 ms, trabajando con un oscilador de 4 Mhz. El primer paso, es seleccionar el prescalar, es decir, PS2, PS1, PS0 = 1, 1, 1. Por tanto, el Rango del divisor de frecuencia es 256. El siguiente paso es calcular el valor que se debe cargar en TMR0...??? 256 - TMR0= Tiempo / (4*Toscilador * Rango Divisor de Frecuencia). 256 - TMR0 = 10000 us / (4 * 0.25 us * 256) = 39,0625 ciclos =~ 39 ciclos. Eso significa que en TMR0 se debe cargar 256-39=217 y a partir de all el TMR0 contar los 39 ciclos que faltan para desbordarse y producir la interrupcin, y el tiempo que tardar en hacerlo es aproximadamente 10000 us, o sea 10 ms. Ejercicio 1. Calcula la mayor temporizacin que se puede obtener haciendo uso del registro TMR0L. (Resp. 0,065536 segundos, ser...???). Preparado por: Sixto Reinoso V.

Ejercicio 2. Calcula los valores para tener una temporizacin de 500 ms? Use un pre - escalar de 64. PROGRAMA TEMPORIZADOR CON TMR0L Utilizando el registro TMR0L, escribir un programa para activar y desactivar un diodo led cada segundo. Como se requiere un tiempo de 1 s y trabajando con un oscilador de 4 MHZ, no se puede temporizar un tiempo tan alto, es necesario reducirlo a un menor y para luego mediante programacin utilizando un contador completar el tiempo. Para esto, se procede. El Periodo del oscilador Toscilador = 1/ 4 Mhz = 0.25 us. Tiempo = 4 * Toscilador * (256-TMR0) * Rango Divisor de Frecuencia Carguemos TMR0 = 12 (A partir de aqu el temporizador deber contar 244 ciclos) Divisor de frecuencia 256 (PS2, PS1, PS0 = 1 1 1). Con estos datos se tiene un tiempo de: Tiempo = 4 * 0.25 * (256 12) * 256 = 62 464 us. Para completar 1 segundo se debe repetir 16 veces (62 464 us. * 16 = 999 424 us ~ 1 segundo). Escribamos el cdigo.
DEFINE OSC 4 Led1 VAR PORTA.0 CMCON = 7 TRISA = 0 M VAR BYTE K VAR BYTE Contador VAR BYTE Contador = 0 M=0 K=0 T0CON = %10000111 INTCON = %10100000 ON INTERRUPT GOTO Tiempo LazoPrincipal: IF M = 0 THEN LOW Led1 IF M = 1 THEN HIGH Led1 GOTO LazoPrincipal DISABLE Tiempo: Contador = Contador +1 TMR0L= 12 INTCON = %10100000 IF Contador > 16 then

Preparado por: Sixto Reinoso V.

K=K+1 IF K = 1 THEN M = 1 IF K= 2 THEN M = 0 : K = 0 Contador = 0 ENDIF RESUME ENABLE END

TRABAJO DE LABORATORIO: Analiza detenidamente el cdigo del programa, comenta la finalidad de las variables M, K y contador. Escribe claramente los comentarios en cada instruccin. Comprueba que los valores de los registros INTCON y T0C0N sean los correctos para que mdulo TMR0L acte como temporizador. Simula en Proteus y mide los valores del tiempo de encendido y apagado del LED. Repite grabando el programa con el PIC. Cambia el pre - escalar a 64. Mide los tiempos para este caso. Presenta informe de la prctica. TAREA: Realiza con tus propias ideas un programa para obtener un tiempo de encendido y apagado del LED de 0.5 segundos respectivamente.

Contador con el registro TMR0L


Para utilizar el TMR0 como contador recuerde que se debe seleccionar los bits TOSE y TOCS del registro T0CON.

Preparado por: Sixto Reinoso V.

PROGRAMA:
DEFINE OSC 4 LED1 VAR PORTA.0 CMCON= 7 TRISA = 0 M VAR BYTE K VAR BYTE CONTADOR VAR BYTE CONTADOR = 0 M=0 K=0 T0CON = %11110111 INTCON = %10100000 ON INTERRUPT GOTO TIEMPO LazoPrincipal: IF M = 0 THEN LOW LED1 IF M = 1 THEN HIGH LED1 GOTO LazoPrincipal DISABLE TIEMPO: CONTADOR = CONTADOR + 1 TMR0L= 12 INTCON = %10100000; IF CONTADOR > 16 THEN K=K+1 IF K = 1 THEN M = 1 IF K = 2 THEN M = 0: K = 0 CONTADOR = 0 ENDIF RESUME ENABLE END

Preparado por: Sixto Reinoso V.

TRABAJO DE LABORATORIO Escriba el programa, compile y simule en el circuito de la figura. El generador de frecuencia externo coloca en 1MHZ. Mide los tiempos de activacin del LED. Repite para una seal de 2MHZ. Comenta los resultados obtenidos. USO DEL TMR0 EN MODO TEMPORIZADOR PARA 16 BITS Como se indic anteriormente el TMR0 se puede usar en modo temporizador de 16 bits. En este caso el temporizador contar 216 = 65536 ciclos de la Fosc/4. Veamos como trabaja con un ejemplo. Por el puerto RA0 se requiere sacar una seal cuadrada de 2 s (1s en alto y 1s en bajo). Utilizando la ecuacin determinamos el valor a cargar el temporizador TMR0.
65536 - TMR0 = Tiempo / 4 * Toscilador * Rango Divisor de Frecuencia

Tiempo 1s = 1000000 us Rango Divisor de frecuencia (pre-escalar) = 256 Toscilador= 1/4MHZ = 0.25us 65536 - TMR0= 1000000/(4*0.25us*256) = ~ 3906 TMR0 = 65536 - 3906 = 61630 = $F0BE. Por tanto, TRM0H se carga con $F0 y TRM0 con $BE. Recuerde que primero se debe cargar TMR0H y luego TMR0L
DEFINE OSC 4 LED1 VAR PORTA.0 CMCON = 7 TRISA = 0 M VAR BYTE K VAR BYTE M=0 K=0 T0CON = %10000111 TMR0H= $F0 TMR0L= $BE INTCON = %10100000 ON INTERRUPT GOTO TIEMPO LAZOPRINCIPAL: IF M = 0 THEN LOW LED1 IF M = 1 THEN HIGH LED1 GOTO LAZOPRINCIPAL DISABLE TIEMPO: TMR0H= $F0 TMR0L= $BE INTCON = %10100000 K=K+1 IF K = 1 THEN M = 1 IF K= 2 THEN M = 0: K = 0 RESUME ENABLE END

Preparado por: Sixto Reinoso V.

TRABAJO PREPATORIO Justifique por qu los valores de los registros INTCON y T0CON. Calcule los valores de TMR0H Y TMER0L, con un pre - escalar de 8 TRABAJO DE LABORATORIO Escriba el programa, compile y simule en el circuito de la figura.

Grabe el programa en el PIC. Mida los tiempos. Estn de acuerdo a lo requerido. Modifique el programa para tener una seal cuadrada de 2 HZ.

TAREAS: Utilizando el manual del PIC18F4550 de Microchip, estudie el funcionamiento de los temporizadores T1 y T2. 1. Escriba un programa para generar una seal de 1000 Hz utilizando el temporizador T1. 2. Escriba un programa para generar una seal de 500 Hz utilizando el temporizador T2. BIBLIOGRAFIA: La informacin del PIC18F4550, fue tomada de: Manual del PIC18F4550 datasheet de Microchip Microcontrolador PIC18F4550 Universidad Politcnica de Valencia Espaa

Preparado por: Sixto Reinoso V.