You are on page 1of 11

UNIDAD EDUCATIVA TECNICO SALESIANO

SISTEMAS MICROCONTROLADOS
INTERRUPCIONES

Al aparecer una peticin de interrupcin lo primero que hace el microcontrolador es ejecutar la


instruccin actual despus de que se detiene el proceso de ejecucin de programa. Como resultado, la
direccin de memoria de programa actual se apila automticamente y la dire-ccin por defecto
(predefinida por el fabricante) se escribe en el contador de programa. La localidad en la que el programa
contina con la ejecucin se le denomina vector de interrupcin. En el caso del microcontrolador
PIC16F887 esta direccin es 0x0004h. Como se muestra en la siguiente figura la localidad que contiene el
vector de interrupcin se omite durante la ejecucin de programa regular.

Una parte de programa que se ejecutar al hacer una peticin de interrupcin se le denomina rutina de
interrupcin. Su primera instruccin se encuentra en el vector de interrupcin. Cunto tiempo tardar en
ejecutar esta subrutina y cmo ser depende de la destreza del programador as como de la fuente de
interrupcin. Algunos microcontroladores tienen ms de un vector de interrupcin (cada peticin de
interrupcin tiene su vector), pero en este caso slo hay uno. En consecuencia, la primera parte da la
rutina de interrupcin consiste en detectar la fuente de interrupcin.
Por fin, al reconocer la fuente de interrupcin y al terminar de ejecutar la rutina de inte-rrupcin el
microcontrolador alcanza la instruccin RETFIE, toma la direccin de la pila y contina con la ejecucin de
programa desde donde se interrumpi.

MikroBasic reconoce una rutina de interrupcin que se ejecutar por medio de la palabra
clave interrupt. La rutina de interrupcin, debe ser escrita por el usuario.

sub procedure interrupt ' Rutina de interrupcin


cnt = cnt + 1 ; ' Interrupcin causa el incremento de la variable cnt por 1
end sub

Ing. Felipe Pea UETS Mecatrnica


REGISTROS ASOCIADOS AL CICLO DE INTERRUPCIN

Al llegar la peticin de interrupcin, no significa que una interrupcin ocurrir automticamente,


puesto que debe ser habilitada por el usuario (por el programa) tambin. Por esta razn, hay bits
especiales utilizados para habilitar o deshabilitar interrupciones. Es fcil de reconocerlos por las
letras IE contenidas en sus nombres (Interrupt Enable - Interrupcin habilitada). Adems, cada
interrupcin se asocia con otro bit denominado bandera que indica que una peticin de
interrupcin ha llegado sin verificar si est habilitada. Asimismo, se reconocen con facilidad por
las dos ltimas letras contenidas en sus nombres - IF (Interrupt Flag - Bandera de interrupcin).

Como hemos visto, toda la idea es muy simple y eficiente. Al llegar la peticin de interrupcin,
primero el bit de bandera se pone a uno. Si el bit IE apropiado est a cero (0), esta condicin ser
ignorada completamente. De lo contrario, ocurre una interrupcin. Si varias fuentes de
interrupcin estn habilitadas, es necesario detectar la activa antes de que la rutina de interrupcin
se ponga a ejecutar. La deteccin de la fuente se realiza al comprobar los bits de las banderas.

Cabe destacar que los bits de cada bandera no se ponen a cero automticamente, sino por el
software, mientras que la ejecucin de la rutina de interrupcin contina ejecutndose. Si no
hacemos caso a este detalle, ocurrir otra interrupcin inmediatamente despus de volver al
programa principal, aunque no hay ms peticiones de ejecucin. Simplemente, la bandera, as
como el bit IE, se quedan en uno.

Todas las fuentes de interrupcin tpicas para el microcontrolador PIC16F887 se muestran en la


siguiente pgina. Fjese en lo siguiente:

El bit GIE habilita/deshabilita simultneamente las interrupciones no enmascaradas.


El PEIE habilita/deshabilita las interrupciones no enmascaradas de perifricos. Esto no se refiere
al temporizador Timer0 y a las fuentes de interrupcin del puerto PORTB.
Para habilitar una interrupcin causada por el cambio del estado lgico en el puerto PORTB, es
necesario habilitarla para cada bit por separado. En este caso, los bits del registro IOCB se
comportan como los bits IE de control.

Ing. Felipe Pea UETS Mecatrnica


Registro INTCON

El registro OPTION_REG contiene varios bits de control para configurar el pre - escalador del
Timer0/WDT, el temporizador Timer0, la interrupcin externa y las resistencias pull-up en el
puerto PORTB.

Leyenda: R/W - Bit de lectura/escritura, (0) Despus del reinicio, el bit se pone a cero, (X) -
Despus del reinicio, el estado de bit es desconocido

GIE - Global Interrupt Enable bit (bit de habilitacin de interrupciones globales)


controla simultneamente todas las fuentes de interrupciones posibles.

1 - Habilita las interrupciones no enmascaradas.


0 - Deshabilita las interrupciones no enmascaradas.

Ing. Felipe Pea UETS Mecatrnica


PEIE - Peripheral Interrupt Enable bit (bit de habilitacin de interrupciones perifricas)
es similar al bit GIE, sin embargo controla interrupciones habilitadas por los perifricos.
Eso significa que no influye en interrupciones causadas por el temporizador Timer0 o por
el cambio del estado en el puerto PORTB o por el cambio en el pin RB0/INT.

1 -Habilita las interrupciones perifricas no enmascaradas.


0 -Deshabilita las interrupciones perifricas no enmascaradas

T0IE - TMR0 Overflow Interrupt Enable bit (bit de habilitacin de interrupciones por
el desbordamiento del registro Timer0) controla interrupciones causadas por el
desbordamiento del Timer0.

1 - Habilita interrupciones por Timer0


0 - Deshabilita interrupciones por Timer0
INTE - RB0/INT External Interrupt Enable bit (bit de habilitacin de la interrupcin
externa en RB0) controla interrupciones causadas por el cambio del estado lgico en el pin
de entrada RB0/INT (interrupcin externa).

1 - Habilita interrupciones externas INT


0 - Deshabilita interrupciones externas INT

RBIE - RB Port Change Interrupt Enable bit. (bit de habilitacin de interrupciones por
cambios en el puerto PORTB). Cuando se configuran como entradas, los pines en el puerto
PORTB pueden causar una interrupcin al cambiar el estado lgico (no importa si se
produce bajada o subida de tensin, lo que importa es que se produce un cambio). Este bit
determina si una interrupcin va a ocurrir.

1 - Habilita interrupciones por cambio en el puerto PORTB


0 - Deshabilita interrupciones por cambio en el puerto PORTB

T0IF - TMR0 Overflow Interrupt Flag bit (bit de bandera de interrupcin por el
desbordamiento del Timer0) detecta el desbordamiento en el registro del temporizador
Timer0, o sea el contador se pone a cero.

1 - En el registro TMR0 ha ocurrido desbordamiento (esta bandera debe volverse a


0 por software)
0 - En el registro TMR0 no ha ocurrido desbordamiento

INTF - RB0/INT External Interrupt Flag bit (bit de bandera de interrupcin externa en
INT) detecta el cambio en el estado lgico en el pin INT.

1 - Ha ocurrido una interrupcin externa por INT (esta bandera debe volverse a 0
por software)
0 - No ha ocurrido una interrupcin externa por INT

RBIF - RB Port Change Interrupt Flag bit (bit de bandera de interrupcin por cambio
en el puerto RB) detecta cualquier cambio del estado lgico de alguno de los pines de
entrada en el puerto PORTB.
1 - Al menos uno de los pines de E/S de propsito general en el puerto PORTB ha
cambido de valor. Despus de leer el puerto PORTB, el bit RBIFdebe volverse a 0
por software)
0 - Ninguno de los pines de E/S de propsito general en el puerto PORTB ha
cambiado de valor.

Ing. Felipe Pea UETS Mecatrnica


Vamos a hacerlo en mikroBasic...
' El pin PORTB.4 se configura como una entrada sensible al cambio del estado
lgico.
ANSEL, ANSELH = 0 ' Todos los pines de E/S se configuran como digitales
PORTB = 0 ' Todos los pines del puerto PORTB se ponen a cero
TRISB = %00010000 ' Todos los pines del puerto PORTB menos PORTB.4
' se configuran como salidas
INTCON.RBIE = 1 ' Se habilitan las interrupciones por el cambio en el puerto
PORTB
IOCB.IOCB4 = 1 ' Se habilita la interrupcin por el cambio en el pin 4 en el
puerto PORTB
INTCON.GIE = 1 ' Se habilita la interrupcin global
...
...
'Desde este punto, se produce una interrupcin con cualquier cambio del estado
lgico en el pin
'PORTB.

Registro OPTION_REG

Leyenda: R/W - Bit de lectura/escritura, (1) Despus del reinicio, el bit se pone a uno

El registro OPTION_REG contiene varios bits de control para configurar el pre - escalador del
Timer0/WDT, el temporizador Timer0, la interrupcin externa y las resistencias pull-up en el
puerto PORTB.

RBPU - Port B Pull up Enable bit (resistencia Pull Up Puerto B)


o 1 - Desactivadas
o 0 - Activadas

INTEDG - Interrupt Edge Select bit (bit selector de flanco activo de la interrupcin externa)
o 1 - Interrupcin por flanco ascendente en el RB0/INT

Ing. Felipe Pea UETS Mecatrnica


o 0 - Interrupcin por flanco descendente en el RB0/INT

T0CS - TMR0 Clock Source Select bit (bit selector de tipo de reloj para el Timer0)
o 1 - Pulsos introducidos a travs del TOCKI (contador)
o 0 - Pulsos de reloj internos Fosc/4 (temporizador)

T0SE - TMR0 Source Edge Select bit (bit selector de tipo de flanco en TOCKI) selecciona el flanco
(ascendente o descendente) contado por el temporizador Timer0 por el pin RA4/T0CKI.
o 1 - Incrementa en flanco descendente en el pin TOCKI.
o 0 - Incrementa en flanco ascendente en el pin TOCKI.

PSA - Prescaler Assignment bit asigna el pre-escalador (hay slo uno) al temporizador o al WDT.
o 1 - Pre - escalador se le asigna al WDT
o 0 - Pre - escalador se le asigna al temporizador Timer0.

PS2, PS1, PS0 Prescaler Rate Select bits (bit selector del valor del divisor de frecuencia)

El valor del divisor de frecuencia se selecciona al combinar estos tres bits. Como se muestra en la
siguiente tabla, el valor del divisor de frecuencia se le asigna al temporizador Timer0 o al
temporizador perro guardin (WDT).

PS2 PS1 PS0 TMR0 WDT

0 0 0 1:2 1:1

Ing. Felipe Pea UETS Mecatrnica


0 0 1 1:4 1:2

0 1 0 1:8 1:4

0 1 1 1:16 1:8

1 0 1 1:64 1:32

1 1 0 1:128 1:64

1 1 1 1:256 1:128

Para conseguir el valor del divisor de frecuencia 1:1 cuando el temporizador Timer0 cuenta
pulsos, el pre-escalador debe ser asignado al WDT. En consecuencia, el temporizador Timer0 no
utiliza el pre-escalador, sino que cuenta directamente los pulsos generados por el oscilador, lo que
era el objetivo.

Vamos a hacerlo en mikroBasic...

' Si el comando CLRWDT no se ejecuta, el WDT va a reiniciar al microcontrolador


cada 32.768
' uS (f=4 MHz)
OPTION_REG = %00001111 ' Pre-escalador est asignado al WDT (1:128)
asm
CLRWDT ' Comando en ensamblador para reiniciar al WDT
end asm
... ' El tiempo entre estos dos comandos CLRWDT no debe exceder 32.768
microsegundos (128x256)
CLRWDT ' Comando en ensamblador para reiniciar al WDT
...
... ' El tiempo entre estos dos comandos CLRWDT no debe exceder 32.768
microsegundos (128x256)
CLRWDT ' Comando en ensamblador para reiniciar al WDT
...

Interrupcin RB0
La interrupcin causada por el pin de entrada RB0 es causada por un cambio lgico para ello debemos
realizar la configuracin del registro OPTION_REG y el registro INTCON.

Registro OPTION_REG

Leyenda: R/W - Bit de lectura/escritura, (1) Despus del reinicio, el bit se pone a uno

INTEDG - Interrupt Edge Select bit (bit selector de flanco activo de la interrupcin externa)

1 - Interrupcin por flanco ascendente en el RB0/INT

Ing. Felipe Pea UETS Mecatrnica


0 - Interrupcin por flanco descendente en el RB0/INT

Registro INTCON

El registro OPTION_REG contiene varios bits de control para configurar el pre - escalador del
Timer0/WDT, el temporizador Timer0, la interrupcin externa y las resistencias pull-up en el
puerto PORTB.

Leyenda: R/W - Bit de lectura/escritura, (0) Despus del reinicio, el bit se pone a cero, (X) -
Despus del reinicio, el estado de bit es desconocido

GIE - Global Interrupt Enable bit (bit de habilitacin de interrupciones globales)


controla simultneamente todas las fuentes de interrupciones posibles.

1 - Habilita las interrupciones no enmascaradas.


0 - Deshabilita las interrupciones no enmascaradas.

INTE - RB0/INT External Interrupt Enable bit (bit de habilitacin de la interrupcin


externa en RB0) controla interrupciones causadas por el cambio del estado lgico en el pin
de entrada RB0/INT (interrupcin externa).

1 - Habilita interrupciones externas INT


0 - Deshabilita interrupciones externas INT

INTF - RB0/INT External Interrupt Flag bit (bit de bandera de interrupcin externa en
INT) detecta el cambio en el estado lgico en el pin INT.

1 - Ha ocurrido una interrupcin externa por INT (esta bandera debe volverse a 0
por software)
0 - No ha ocurrido una interrupcin externa por INT

Ing. Felipe Pea UETS Mecatrnica


EJEMPLO
Program Interrupciones
programa de interrupciones RBO
'Tecnico Salesiano
'Autor: Ing. Felipe Pea
' Declarations section

dim LCD_RS as sbit at RB2_bit


LCD_EN as sbit at RB3_bit
LCD_D4 as sbit at RB4_bit
LCD_D5 as sbit at RB5_bit
LCD_D6 as sbit at RB6_bit
LCD_D7 as sbit at RB7_bit

LCD_RS_Direction as sbit at TRISB2_bit


LCD_EN_Direction as sbit at TRISB3_bit
LCD_D4_Direction as sbit at TRISB4_bit
LCD_D5_Direction as sbit at TRISB5_bit
LCD_D6_Direction as sbit at TRISB6_bit
LCD_D7_Direction as sbit at TRISB7_bit
' End Lcd module connections

dim txt1 as char[7]


txt2 as char[9]
txt3 as char[16]
txt4 as char[4]
i as byte ' Loop variable
bandera as byte

sub procedure interrupt


if intcon.intf=1 then
portb.1=1
bandera=1
Delay_ms(2000)
portb.1=0
ClearBit(INTCON,INTF) 'limpio bandera para salir de
OPTION_REG.INTEDG=0 'SELECCIONA FLANCO DE BAJADA PARA INTERRUPCIN
'INTCON.INTE=1
end if

end sub
sub procedure Move_Delay() ' Function used for text moving
Delay_ms(500) ' You can change the moving speed here
end sub

Ing. Felipe Pea UETS Mecatrnica


sub procedure Setup
OPTION_REG.INTEDG=0 'SELECCIONA FLANCO DE BAJADA PARA INTERRUPCIN
INTCON.GIE=1 'HABILITA INTERRUPCIONES GLOBALES
INTCON.INTE=1 'HABILITA INTERRUPCIN EXTERNA POR RB0, HABILITA BANDERA INTF
TRISB = %00000001
PORTB = 0xFF
TRISB = 0x00
ANSEL = 0 ' Configure AN pins as digital I/O
ANSELH = 0
Lcd_Init() ' Initialize Lcd
bandera =0
portb.1=0
end sub

sub procedure LCD_P1


txt1 = "Tecnico"
txt2 = "Salesiano"
txt3 = "Mecatronica UETS"
txt4 = "2013"

Lcd_Cmd(_LCD_CLEAR) ' Clear display


Lcd_Cmd(_LCD_CURSOR_OFF) ' Cursor off
Lcd_Out(1,1,txt3) ' Write text in first row
Lcd_Out(2,6,txt4) ' Write text in second row
Delay_ms(2000)
Lcd_Cmd(_LCD_CLEAR) ' Clear display

Lcd_Out(1,5,txt1) ' Write text in first row


Lcd_Out(2,4,txt2) ' Write text in second row
Delay_ms(500)
end sub

main:
Setup
LCD_P1
while TRUE ' Endless loop
if bandera=1 then
Lcd_Cmd(_LCD_CLEAR) ' a ocurrido una interrupcin por RB0
Lcd_Out(1,1,"Interrupcion RB0") ' Write text in first row
bytetostr(INTCON,txt4)
Lcd_Out(2,1,txt4)
Delay_ms(2000)
bandera=0
LCD_P1

end if
wend

Ing. Felipe Pea UETS Mecatrnica


end.

Ing. Felipe Pea UETS Mecatrnica

You might also like