Está en la página 1de 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. Desbordamiento del TMR0


2. Activacin de la patita de interrupcin RB0/INT
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

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 de las 12 variables necesarias para la conexin
//del mdulo LCD.
sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;


sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;
// Fin de declaracin de variables de conexin.

char contador=0,texto[4], respaldo;

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(); //Inicializa el LCD.


Lcd_Cmd(_LCD_CLEAR); //Borra el display.
Lcd_Cmd(_LCD_CURSOR_OFF); //Apaga el cursor.
Lcd_Out(1,6,"Conteo:");
ByteToStr(contador,texto);
Lcd_Out(2,6,texto);

respaldo=TRISB; //Guardar el estado de TRISB.


TRISB0_bit=1; //RB0 como entrada.
INTE_bit=1; //Interrupcin INT habilitada.
while (1)
{
asm SLEEP //Entra en modo SLEEP.
asm NOP //Se despierta por INT, ejecuta NOP y
//salta a "interrupt".
ByteToStr(contador,texto); //Retorna de "interrupt" y contina.
TRISB=respaldo; //Restaurar TRISB.
Lcd_Out(2,6,texto);
respaldo=TRISB; //Guardar el estado de TRISB.
TRISB0_bit=1; //RB0 como entrada.
}
}

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;
}
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.

También podría gustarte