You are on page 1of 14

INTERRUPCIONES DEL PIC 16F877A La familia Pic16F877A tiene 13 fuentes de interrupciones los de 28 pines y 14 los de 40 pines.

Al aceptarse una interrupcin se salva el valor del PC contador de porgrama en la pila y se carga aquel con el valor 0004h, que es el Vector de Interrupcion. La mayora de los recursos o perifricos de que disponen los Pic16F87x son capaces de ocacionar una interrupcin, si se programan adecuadamente los bits de los registros que pasamos a describir a continuacin. 1. 2. 3. 4. Desbordamiento del TMR0 Activacin de la patita de interrupcin RB0/INT Cambio de estado de una de las cuatro patitas de mas peso del puerto B Finalizacin de la escritura de un byte en la EEPROM

Registro de Control de Interrupciones (INTCON) Es un registro que podemos leer o escribir y lo lo encontramos en cualquiera de los cuatro bancos, ocupando las direcciones 0x0Bh, 0x8Bh, 0x10Bh, 0x18Bh, respectivamente. Tiene la mision de controlar las interrupciones provocadas por el TMR0, cambio de estado en las cuatro lneas de mas peso de la puerta B y activacin de la patita RB0/INT. El bit PEIE actua como una segunda llave parcial de permiso o prohibicin de las causas de interrupcin que nos estan contenidas en INTCON y que las provocan los restantes perifricos del microcontrolador. GIE es el bit de permiso global de todas las interrupciones. INTCON REGISTER (ADDRESS 0Bh, 8Bh, 10Bh, 18Bh)

bit 7 GIE: Bit de permiso global de interrupciones 1 = Enables all unmasked interrupts 0 = Disables all interrupts bit 6 PEIE: Bit de permiso de los perifericos que no se controlan con INTCON 1 = Enables all unmasked peripheral interrupts 0 = Disables all peripheral interrupts bit 5 TMR0IE: Bit de permiso de interrucin del TMR0 1 = Enables the TMR0 interrupt 0 = Disables the TMR0 interrupt bit 4 INTE : Bit de permiso de la interrucin externa por RB0/INT 1 = Enables the RB0/INT external interrupt 0 = Disables the RB0/INT external interrupt bit 3 RBIE: Bit de permiso de interrucin por cambio en RB4-RB7 1 = Enables the RB port change interrupt 0 = Disables the RB port change interrupt bit 2 TMR0IF: Sealizador de desbordamiento en TMR0

1 = TMR0 register has overflowed (must be cleared in software) 0 = TMR0 register did not overflow bit 1 INTF: Sealizador de activacin de la patita RB0/INT 1 = The RB0/INT external interrupt occurred (must be cleared in software) 0 = The RB0/INT external interrupt did not occur bit 0 RBIF: Sealizador de cambio en RB4 - RB7 1 = At least one of the RB7:RB4 pins changed state; a mismatch condition will continue to set the bit. Reading PORTB will end the mismatch condition and allow the bit to be cleared (must be cleared in software). 0 = None of the RB7:RB4 pins have changed state

Registro de permiso de interrupciones 1 (PIE1) Contiene los bits que permiten (1) o prohiben (0) las interrupciones provocadas por los perifricos internos del microcontrolador y que no estaban contempladas en INTCON. Ocupa la direccin 8Ch y para que cumplan su funcin los bits de PIE1 es necesario que PEIE=1 en INTCON <6>. El bit PSPIE solo es valido en los modelos de 40 pines, mantenindose a 0 en los que tienen 28 pines. PIE1 REGISTER (ADDRESS 8Ch)

bit 7 PSPIE: Parallel Slave Port Read/Write Interrupt Enable bit(1) 1 = Enables the PSP read/write interrupt 0 = Disables the PSP read/write interrupt Note 1: PSPIE is reserved on PIC16F873A/876A devices; always maintain this bit clear. bit 6 ADIE : A/D Converter Interrupt Enable bit 1 = Enables the A/D converter interrupt 0 = Disables the A/D converter interrupt bit 5 RCIE : USART Receive Interrupt Enable bit 1 = Enables the USART receive interrupt 0 = Disables the USART receive interrupt bit 4 TXIE : USART Transmit Interrupt Enable bit 1 = Enables the USART transmit interrupt 0 = Disables the USART transmit interrupt bit 3 SSPIE: Synchronous Serial Port Interrupt Enable bit 1 = Enables the SSP interrupt 0 = Disables the SSP interrupt bit 2 CCP1IE: CCP1 Interrupt Enable bit

1 = Enables the CCP1 interrupt 0 = Disables the CCP1 interrupt bit 1 TMR2IE: TMR2 to PR2 Match Interrupt Enable bit 1 = Enables the TMR2 to PR2 match interrupt 0 = Disables the TMR2 to PR2 match interrupt bit 0 TMR1IE: TMR1 Overflow Interrupt Enable bit 1 = Enables the TMR1 overflow interrupt 0 = Disables the TMR1 overflow interrupt

Registro de permiso de interrupciones 2 (PIE2) Contiene los bits de permiso de interrupcin de las tres causas que no figuran en PIE1. La de fin de escritura en la EEPROM, colisin de bus en el modo SSP y produccin de una captura o una comparacin en el mdulo CCP2. PIE2 REGISTER (ADDRESS 8Dh)

bit 7 Unimplemented: Read as '0' bit 6 CMIE: Comparator Interrupt Enable bit 1 = Enables the Comparator interrupt 0 = Disable the Comparator interrupt bit 5 Unimplemented: Read as '0' bit 4 EEIE: EEPROM Write Operation Interrupt Enable bit 1 = Enable EEPROM write interrupt 0 = Disable EEPROM write interrupt bit 3 BCLIE: Bus Collision Interrupt Enable bit 1 = Enable bus collision interrupt 0 = Disable bus collision interrupt bit 2-1 Unimplemented: Read as '0' bit 0 CCP2IE : CCP2 Interrupt Enable bit 1 = Enables the CCP2 interrupt 0 = Disables the CCP2 interrupt

Registros de los sealizadores de interrupciones 1 y 2 (PIR1 y PIR2) En correspondencia con los bits de permiso/prohibicin de las causas de interrupcin recogidas en los registros PIE1 y PIE2, existen otros dos registros, PIR1 y PIR2, cuyos bits actuan de sealizadores del momento en el que se origina la causa que provoca la interrupcin, independientemente de si est permitida o prohibida. Ocupan las direcciones 0Ch y 0Dh, respectivamente.

PIR1 REGISTER (ADDRESS 0Ch)

bit 7 PSPIF: Parallel Slave Port Read/Write Interrupt Flag bit(1) 1 = A read or a write operation has taken place (must be cleared in software) 0 = No read or write has occurred Note 1: PSPIF is reserved on PIC16F873A/876A devices; always maintain this bit clear. bit 6 ADIF : A/D Converter Interrupt Flag bit 1 = An A/D conversion completed 0 = The A/D conversion is not complete bit 5 RCIF : USART Receive Interrupt Flag bit 1 = The USART receive buffer is full 0 = The USART receive buffer is empty bit 4 TXIF : USART Transmit Interrupt Flag bit 1 = The USART transmit buffer is empty 0 = The USART transmit buffer is full bit 3 SSPIF: Synchronous Serial Port (SSP) Interrupt Flag bit 1 = The SSP interrupt condition has occurred, and must be cleared in software before returning from the Interrupt Service Routine. The conditions that will set this bit are: SPI - A transmission/reception has taken place. I2C Slave - A transmission/reception has taken place. I2C Master - A transmission/reception has taken place. - The initiated START condition was completed by the SSP module. - The initiated STOP condition was completed by the SSP module. - The initiated Restart condition was completed by the SSP module. - The initiated Acknowledge condition was completed by the SSP module. - A START condition occurred while the SSP module was idle (Multi-Master system). - A STOP condition occurred while the SSP module was idle (Multi-Master system). 0 = No SSP interrupt condition has occurred bit 2 CCP1IF: CCP1 Interrupt Flag bit Capture mode: 1 = A TMR1 register capture occurred (must be cleared in software) 0 = No TMR1 register capture occurred Compare mode: 1 = A TMR1 register compare match occurred (must be cleared in software) 0 = No TMR1 register compare match occurred PWM mode: Unused in this mode bit 1 TMR2IF : TMR2 to PR2 Match Interrupt Flag bit 1 = TMR2 to PR2 match occurred (must be cleared in software)

0 = No TMR2 to PR2 match occurred bit 0 TMR1IF: TMR1 Overflow Interrupt Flag bit 1 = TMR1 register overflowed (must be cleared in software) 0 = TMR1 register did not overflow

PIR2 REGISTER (ADDRESS 0Dh)

bit 7 Unimplemented: Read as '0' bit 6 CMIF: Comparator Interrupt Flag bit 1 = The Comparator input has changed (must be cleared in software) 0 = The Comparator input has not changed bit 5 Unimplemented: Read as '0' bit 4 EEIF: EEPROM Write Operation Interrupt Flag bit 1 = The write operation completed (must be cleared in software) 0 = The write operation is not complete or has not been started bit 3 BCLIF: Bus Collision Interrupt Flag bit 1 = A bus collision has occurred in the SSP, when configured for I2C Master mode 0 = No bus collision has occurred bit 2-1 Unimplemented: Read as '0' bit 0 CCP2IF: CCP2 Interrupt Flag bit Capture mode: 1 = A TMR1 register capture occurred (must be cleared in software) 0 = No TMR1 register capture occurred Compare mode: 1 = A TMR1 register compare match occurred (must be cleared in software) 0 = No TMR1 register compare match occurred PWM mode: Unused Lgica de Interrupciones:

Simular un programa que trabaja la interrupcin RB0/INT para ir acumulando los flancos de subida que vayan ingresando por el pin RB0.

Diagrama de flujo El diagrama de flujo comienza con la configuracin del microcontrolador, ingreso al banco 1, all se configuran los registros INTCON, TRISB y el bit INTEDG del OPTION a fin de detectar pulsos de entrada en RB0/INT por flanco de subida. La rutina de interrupcin incrementa la variable CONTADOR en una unidad, y adems resetea el flag INTF.

Los valores para los bits del registro INTCON son: GIE EEIE T0IE INTE RBIE T01F INTF RBIF 1 0 0 1 0 0 0 0 = 0x 90 Cdigo del programa list p=16f877 include "p16f877.inc" CONTADOR EQU 0x20 ;POSMEM en la que usaremos una variable ORG 0 ;Vector de RESET nop nop goto INICIO ;Alta a la direccion donde se inicia el programa ORG 4 ;Vector de INTERRUPCION incf CONTADOR,1 ;Contador++ bcf INTCON,INTF ;Resetea el flag de la interrupcion RB0/INT retfie ;Fin rutina de interupcion INICIO bcf STATUS,RP0 ;Ir banco 1 bcf STATUS,RP1

clrf TRISA ;PORTA salida clrf TRISB ;PORTB salida clrf TRISC ;PORTC salida clrf TRISD ;PORTD salida clrf TRISE ;PORTD salida bsf TRISB,0 ;RB0 como entrada movlw 0x90 movwf INTCON ;Configura INTCON bsf STATUS,INTEDG ;Detecta flancos de subida que llegan a RB0/INT bcf STATUS,RP0 ;Ir banco 0 bcf STATUS,RP1 clrf CONTADOR ;Contador=0 BUCLE nop ;No operacion nop goto BUCLE ;Ir a BUCLE END

Introduccin
Una interrupcin, como el nombre lo sugiere, es un evento que hace que el microcontrolador deje de realizar lo que est haciendo y pase a ejecutar otra tarea. Al finalizar retorna a su actividad inicial. El PIC16F88 tiene hasta 12 fuentes de interrupciones PIC, el PIC16F628A tiene 10 y el PIC16F877A tiene 15. El registro INTCON (figuras 7.1.1 y 7.1.2) contiene las banderas de interrupciones generadas por diferentes eventos. Tambin contiene los bits de habilitacin global y particular de las distintas fuentes de interrupcin (observar las diferencias en algunos bits de este registro a lo largo de los siguientes temas).

Las banderas de interrupciones PIC se activan independientemente del estado de sus bits de habilitacin o del bit de habilitacin global GIE. El bit GIE del registro INTCON permite habilitar o deshabilitar la generacin de interrupciones. Cuando estn habilitadas (GIE=1) y el bit de habilitacin particular y la bandera correspondiente se activan, se produce un salto al vector de interrupcin (direccin 0x0004). Las interrupciones individuales pueden habilitarse/deshabilitarse a travs de sus bits de habilitacin en diferentes registros. El bit GIE se borra al producirse un reset, por lo tanto la generacin de interrupciones est deshabilitada normalmente. La instruccin RETFIE se emplea para salir de la rutina de servicio a la interrupcin (ISR), as como rehabilitar la generacin de interrupciones. Las banderas de las interrupciones INT, RB y del Timer0 se encuentran en el registro INTCON. Las banderas de interrupcin de los perifricos estn

contenidas en los registros PIR1 y PIR2 (16F877A), mientras que los bits de habilitacin correspondientes se encuentran en los registros PIE1 y PIE2 (16F877A). El bit de habilitacin de interrupciones de perifricos (PEIE) est en el registro INTCON. Cuando se brinda atencin a una interrupcin, el bit GIE es borrado para deshabilitar cualquier interrupcin adicional, la direccin de retorno es guardada (pushed) en la pila (stack) y el contador de programa (PC) es cargado con el valor 0x0004. Una vez dentro de la ISR, la fuente de la interrupcin se puede determinar analizando las banderas de interrupcin. Las banderas tienen que ser borradas por software antes de rehabilitar las interrupciones, para evitar interrupciones repetitivas. Las interrupciones externas INT o RB4 RB7 pueden generarse cada cierto tiempo como mnimo, que va desde los tres a cuatro ciclos de instruccin, esto depende del instante en que se genera la interrupcin. Las banderas de interrupcin se activan independientemente del bit de habilitacin particular, del bit PEIE o del bit GIE.

Interrupcin INT
La interrupcin externa en el pin RB0/INT se activa por flanco ascendente o descendente, dependiendo del bit INTEDG del registro OPTION_REG. Cuando aparece una transicin vlida en el pin RB0/INT, la bandera INT0IF del registro INTCON toma un valor de 1. Esta interrupcin puede ser habilitada/deshabilitada con el bit INT0IE del registro INTCON. La bandera INT0IF tiene que ser borrada por software dentro de la ISR antes de rehabilitar esta interrupcin. La interrupcin INT puede despertar al PIC, si el bit INT0IE se program en 1 antes de ingresar al modo Sleep. El estado del bit GIE determina si se produce o no el salto al vector de interrupcin despus del despertar (los detalles aparecen en las secciones 6.11 MODO DE BAJO CONSUMO (Sleep) PIC16F88 o 6.19 MODO DE BAJO CONSUMO (Sleep) PIC16F628A y PIC16F877A del libro).

Interrupcin del Timer 0


El desbordamiento del registro TMR0 (desde 0xFF a 0x00) genera una interrupcin, lo cual hace que el bit TMR0IF del registro INTCON sea igual a 1. La generacin de esta interrupcin se puede habilitar/deshabilitar con el bit TMR0IE del registro INTCON. El bit TMR0IF tiene que ser borrado por software dentro de la ISR antes de rehabilitar esta interrupcin. Esta interrupcin

no puede despertar al PIC, ya que el temporizador est apagado durante el modo Sleep.

Interrupciones RB4 RB7


Un cambio de estado en cualquiera de los pines RB<7:4> genera una interrupcin y hace que la bandera RBIF del registro INTCON tome un valor de 1. Esta interrupcin puede habilitarse/deshabilitarse con el bit RBIE del registro INTCON. nicamente los pines configurados como entradas pueden producir esta interrupcin. Los pines de entrada RB<7:4> se comparan con el estado anterior que tenan en la ltima lectura del puerto B. Si no hay coincidencia en todos los pines, se genera la interrupcin. Esta interrupcin puede despertar al PIC. El usuario, dentro de la ISR, puede borrar la bandera de interrupcin con cualquiera de los mtodos siguientes:

Lectura o escritura del registro PORTB. Esto concluye la condicin de falta de coincidencia. Borrar la bandera RBIF.

Esta interrupcin se recomienda para despertar al PIC en caso de presionar una tecla o en el caso de que el puerto B se emplee nicamente para las interrupciones RB4 RB7. La lectura continua (Polling) del puerto B no se recomienda mientras se usa la funcin de interrupcin RB.

Manejo de interrupciones en mikroC


Las interrupciones PIC pueden manipularse fcilmente por medio de la palabra reservada interrupt. En mikroC se ha declarado de manera implcita la funcin interrupt, la cual no puede ser redeclarada. Su prototipo es: void interrupt(void);

Lo nico que el usuario tiene que hacer es escribir la definicin de esta funcin (rutina de servicio a la interrupcin ISR) para manejar interrupciones en la aplicacin que est desarrollando. mikroC se encarga de salvar y recuperar de la pila (stack) los registros W, STATUS, FSR y PCLATH. Se pueden realizar llamadas a funciones desde la funcin interrupt. El compilador

toma en cuenta los registros que se estn empleando tanto en la funcin interrupt como en la funcin main, y salva nicamente los registros que se emplean en ambas funciones. En caso de que haya mltiples interrupciones habilitadas, se debe detectar la fuente de la interrupcin por medio de las banderas de interrupcin (flags) y proceder a la ejecucin del cdigo apropiado.

Ejemplos de programacin de las interrupciones PIC


Estos ejemplos corresponden al PIC16F88. El cdigo fuente para los PICs 16F628A y 16F877A se encuentra en las carpetas correspondientes que acompaan a este libro. El siguiente ejemplo fue resuelto en el Captulo III (LCD1.c) empleando la tcnica de lectura continua (Polling) de la entrada RA4; ahora se resolver con la interrupcin INT. Ntese el uso del pin RB0/INT para cumplir dos funciones: como salida de datos hacia el LCD y como entrada para la interrupcin INT. El programa se encarga de mantener el valor original del registro TRISB. Ejemplo-INT1.c: Cada vez que presiona el pulsador conectado en RB0 se incrementa un contador que se visualiza en el centro de la segunda lnea de la pantalla (figuras 7.2.1 y 7.2.2). Si la cuenta supera 100, el conteo se reinicia desde 0. En el centro de la primera lnea se muestra la palabra Conteo:

Figura 7.2.1 Circuito del problema INT1.c (PIC16F88 y 16F628A)


//INT1.c //Declaracin //del sbit sbit sbit sbit sbit sbit sbit sbit sbit sbit sbit sbit de las 12 variables necesarias mdulo at at at at at at at at at at at at para la conexin LCD. RB4_bit; RB5_bit; RB0_bit; RB1_bit; RB2_bit; RB3_bit;

LCD_RS LCD_EN LCD_D4 LCD_D5 LCD_D6 LCD_D7

LCD_RS_Direction LCD_EN_Direction LCD_D4_Direction LCD_D5_Direction LCD_D6_Direction LCD_D7_Direction

TRISB4_bit; TRISB5_bit; TRISB0_bit; TRISB1_bit; TRISB2_bit; TRISB3_bit;

// char

Fin

de

declaracin

de

variables

de

conexin. respaldo;

contador=0,texto[4],

void main(){ OSCCON=0x40; //Oscilador interno a 1MHz. while (OSCCON.IOFS==0);//Esperar mientras el oscilador est inestable. ANSEL=0x00; //Bits AN6:AN0 como E/S digital. GIE_bit=1; //Interrupciones habilitadas. NOT_RBPU_bit=0; //Pull ups habilitados. INTEDG_bit=0; //INT por flanco descendente. Lcd_Init(); Lcd_Cmd(_LCD_CLEAR); Lcd_Cmd(_LCD_CURSOR_OFF); Lcd_Out(1,6,"Conteo:"); ByteToStr(contador,texto); Lcd_Out(2,6,texto); respaldo=TRISB; TRISB0_bit=1; INTE_bit=1; while { asm SLEEP asm NOP ByteToStr(contador,texto); TRISB=respaldo; Lcd_Out(2,6,texto); respaldo=TRISB; TRISB0_bit=1; } } void interrupt(void) { Delay_ms(20); if (RB0_bit==0) contador++; //Pulsador presionado. while (RB0_bit==0); //Esperar mientras siga presionado. if (contador >100) contador=0; INTF_bit=0; } //Inicializa //Borra //Apaga el el el LCD. display. cursor.

//Guardar el //RB0 //Interrupcin

estado como INT

de

TRISB. entrada. habilitada. (1)

//Entra en modo SLEEP. despierta por INT, ejecuta NOP y //salta a "interrupt". //Retorna de "interrupt" y contina. //Restaurar TRISB. //Se //Guardar //RB0 el estado como de TRISB. entrada.

Interrupciones PIC16F877A
INTERRUPCIONES PARA EL PIC 16F877A Una subrutina de interrupcin es aquella que se ejecuta cada vez que se solicita una interrupcin. El PIC 16F877A tiene la particularidad de manejar 13 fuentes de interrupcin diferentes, de las cuales haremos aplicaciones para dos de ellas: 1. Activacin de la patita de interrupcin RB0/INT 2. Desbordamiento del TMR0 3. Cambio de estado de una de las cuatro patitas de mas peso del puerto B 4. Finalizacin de la escritura de un byte en la EEPROM 5. Desbordamiento del Timer1 6. Desbordamiento del Timer2 7. Captura o comparacin en el mdulo CCP1 8. Captura o comparacin en el mdulo CCP2 9. Transferencia en la puerta serie Sncrona 10. Colisin de bus en la puerta serie Sncrona 11. Fin de la transmisin en el USART 12. Fin de la recepcin en el USART 13. Fin de la conversin en el convertidor A/D 14. Transferencia en la puerta paralela esclava Hasta la opcin 4 las tiene el PIC 16F84A, uno de los PICS de la familia 16FXX. Iniciaremos con la opcin 1: interrupcin por la terminal RB0. Al aceptarse una interrupcin se salva el valor del contador de programa PC en la pila y se carga el PC con el valor 0004h, que es el Vector de Interrupcin. Cuando se solicita la interrupcin, el programa se va a la direccin 0004h. REGISTRO DE CONTROL DE INTERRUPCIONES (INTCON) Es un registro de lectura y escritura que se encuentra en los cuatro bancos de memoria del PIC, ocupando las direcciones 0x0Bh, 0x8Bh, 0x10Bh, 0x18Bh. Tiene la misin de ser usado para controlar las interrupciones provocadas por el TMR0, cambio de estado en las cuatro lneas de ms peso del puerto B y activacin de la terminal RB0/INT. GIE es el bit de permiso global de todas las interrupciones.

You might also like