Está en la página 1de 13

1.

Sistema de Interrupciones
Una interrupción consiste en que la CPU deja de ejecutar el programa principal y pasa a
ejecutar la rutina de servicio de interrupción (ISR)
La ISR comienza en la dirección 0X0004 y termina en la instrucción de retorno de
interrupción (RETFIE).

Llamado y Retorno de una Interrupción

Programa Principal ISR


300 Dirección de 004 GOTO
301 la ISR 005
302 …
EVENTO 303 080
304 081
Dirección 305 082
306 083
de Retorno 307 084
085
086
Fuentes de interrupción: RETFIE

Habilitador
Fuente Evento Bandera
Local
Timer 0 Desbordamiento del Timer 0 INTCON,5(T0IE) INTCON,2(T0IF)
RB0 Flanco en RB0 INTCON,4(INTE) INTCON,1(INTF)
RB7-RB4 Cambio en el nibble alto del puerto B INTCON,3(RBIE) INTCON,0(RBIF)
Transmisor
Buffer de transmisión vacío PIE1,4(TXIE) PIR1,4(TXIF)
del USART
Receptor
Buffer del receptor lleno PIE1,5(RCIE) PIR1,5(RCIF)
del USART

(GIE) es la máscara de interrupción global INTCON,7 bloquea todas las solicitudes de


interrupción cuando GIE=0.
(PEIE) es el habilitador de interrupción de periféricos INTCON,6.
Lógica de interrupción

Reconocimiento de una interrupción


Condiciones
1. (GIE=1), (PEIE=1 para algunas solicitudes)
2. Ocurre el evento que activa la bandera de interrupción
3. Está activado el habilitador local correspondiente a la bandera activada.

Proceso
1. La CPU termina la ejecución de la instrucción actual.
2. Se desactiva el bit GIE (GIE=0)
3. Se hace el llamado a la ISR:
a. La dirección de retorno se guarda en la pila.
b. Se ejecuta el salto a la dirección 0x0004 que se denomina vector de interrupción
y es el inicio de la ISR.
c. En algunos casos es necesario que se salve el contexto: Registro STATUS, registro
W, registro PCLATH (en caso de usar las páginas 1, 2 o 3)
d. En la ISR se determina la fuente de interrupción consultando las banderas de
interrupción.
e. En la ISR se borra la bandera que solicitó la interrupción para evitar que se repita
la interrupción.
4. Se realiza el retorno de la ISR mediante la instrucción RETFIE:
a. Se activa el bit GIE (GIE=1)
b. Se recupera de la pila la dirección de retorno para regresar al programa
principal.
Interrupción Externa RB0/INT
La interrupción externa RB0/INT se dispara por flanco:

Si INTEDG = 1 por flanco ascendente


Si INTEDG = 0 por flanco descendente

El habilitador local es el bit INTE.


La bandera de interrupción es INTF.

Interrupción Externa RB4-RB7


La interrupción externa RB4-RB7 se dispara por cambio del nivel de por lo menos una de
las entradas RB4-RB7:

El habilitador local es el bit RBIE.


La bandera de interrupción es RBIF.
Por hardware las entradas RB7:RB4 se comparan con el valor cargado por la última
operación de lectura de PORTB.
En la ISR se borra la solicitud de interrupción con una operación de lectura o escritura en
PORTB y borrando la bandera RBIF.

Gestión de Tecla por Interrupción


Curso: Microcontroladores y Microprogramación – Clases Prácticas

#INCLUDE "P16F877A.INC" CALL RETARDO20ms GOTO REPIT


CONTADOR EQU 0X21 BANKSEL PORTB RETURN
N EQU 0xA5 BTFSC PORTB,0 INITB
CONT_RET EQU 0x20 RETFIE BANKSEL PORTB
ORG 0X0 BANKSEL 0 CLRF PORTB
GOTO PROG INCF CONTADOR BANKSEL TRISB
ORG 0X0004 MOVFW CONTADOR MOVLW 0xFF
GOTO ISR SUBLW .10 MOVWF TRISB
PROG BTFSC STATUS,Z BANKSEL OPTION_REG
CALL INITB CLRF CONTADOR BCF OPTION_REG,7
CALL INITD MOVFW CONTADOR RETURN
CALL INITINT CALL HEX7SEG INITD
BANKSEL 0 BANKSEL PORTD MOVLW 0x00
MOVLW .0 MOVWF PORTD BANKSEL TRISD
MOVWF CONTADOR SIGUE_PRES MOVWF TRISD
CALL HEX7SEG BANKSEL PORTB MOVLW 0x00
MOVWF PORTD BTFSS PORTB,0 BANKSEL PORTD
BUCLE GOTO SIGUE_PRES MOVWF PORTD
GOTO BUCLE CALL RETARDO20ms RETURN
HEX7SEG RETFIE INITINT
ADDWF PCL RETARDO20ms BANKSEL OPTION_REG
DT 0x3F,0x06,0x5B,0x4F BANKSEL 0 BCF OPTION_REG,6
DT 0x66,0x6D,0x7D,0x07 MOVLW N BANKSEL INTCON
DT 0x7F,0x6F MOVWF CONT_RET BSF INTCON,4
ISR REPIT BSF INTCON,7
BCF INTCON,1 DECFSZ CONT_RET RETURN

2. El Timer 0
Características
1. Temporizador/contador de 8 bits
2. Permite lectura y escritura
3. Pre-escalador programable de 8 bits
4. Fuente de reloj seleccionable externa o interna
5. Puede producir interrupción por desbordamiento (Cambio de FFh a 00h)
6. Flanco seleccionable para el reloj externo

Esquema Descriptivo

4
Curso: Microcontroladores y Microprogramación – Clases Prácticas

Registro OPTION_REG

T0CS – Selección de la señal de reloj del timer 0


1 – Los pulsos para el timer 0 ingresan por el pin RA4.
0 - Reloj interno (Fosc/4).
T0SE – Selección del flanco de la señal en el pin
1 – Flanco de bajada en el pin
0 - Flanco de subida en el pin
PSA – Bit de asignación de pre-escalador
1 – El pre-escalador se asigna al wathdog
0 - El pre-escalador se asigna al timer 0
PS2, PS1, PS0 – Selección del factor de pre-escalamiento

Generación de señal periódica con Timer 0 por consulta


#INCLUDE P16F877A.INC INITC
CALL INITC BANKSEL TRISC
CALL INIT_TMR0 CLRF TRISC
BUCLE BANKSEL PORTC
CLRF TMR0 CLRF PORTC
ESPERAR_DESBORDE RETURN
BANKSEL INTCON INIT_TMR0
BTFSS INTCON, T0IF BANKSEL TMR0
GOTO ESPERAR_DESBORDE CLRF TMR0
MOVLW 0XFF CLRF INTCON
XORWF PORTC BANKSEL OPTION_REG
BCF INTCON, T0IF MOVLW 0xC0 ; Reloj interno con pre-escalador 1:2
GOTO BUCLE MOVWF OPTION_REG
RETURN
END
El intervalo generado IG se halla con la fórmula
IG = N*M*(4/Fosc)
N – Número de incrementos del Timer 0
1/M – Valor del pre-escalador
Fosc - Frecuencia de reloj del microcontrolador.
El valor inicial del timer 0 es: VI = 256 – N.

5
Curso: Microcontroladores y Microprogramación – Clases Prácticas

Generación de señal periódica con Timer 0 por interrupción

#INCLUDE P16F877A.INC INITC


GOTO PROGRAMA BANKSEL TRISC
ORG 0X0004 CLRF TRISC
GOTO INTERRUPCION BANKSEL PORTC
PROGRAMA CLRF PORTC
CALL INITC RETURN
CALL INIT_TMR0 INIT_TMR0
CALL INIT_INT BANKSEL TMR0
BUCLE CLRF TMR0
GOTO BUCLE CLRF INTCON
INTERRUPCION BANKSEL OPTION_REG
BANKSEL TMR0 MOVLW 0xC0 ; Reloj interno con pre-escalador 1:2
CLRF TMR0 MOVWF OPTION_REG
MOVLW 0XFF RETURN
BANKSEL PORTC INIT_INT
XORWF PORTC BANKSEL INTCON
BANKSEL INTCON BSF INTCON, T0IE
BCF INTCON, T0IF BSF INTCON, GIE
RETFIE RETURN
END

3. El Timer 1
Características
1. Temporizador/contador de 16 bits
2. Permite lectura y escritura
3. Fuente de reloj seleccionable externa o interna
4. Puede producir interrupción por desbordamiento (Cambio de FFFFh a 0000h)
5. Se puede reinicializar desde los módulos CCP

Registro contador de 16 bits

Modos de operación
• Con reloj interno
• Con reloj externo
• Con reloj externo y circuito oscilador

6
Curso: Microcontroladores y Microprogramación – Clases Prácticas

Esquema Descriptivo

Registro T1CON

T1CKPS1, T1CKPS0 – Bits de selección del factor de pre-escalamiento del timer 1.

T1OSCEN – Bit de habilitación del oscilador del timer 1


1 – Oscilador habilitado.
0 – Oscilador Inhabilitado.
/T1SYNC – Bit de selección de sincronización de la señal de reloj externa del Timer 1.
Cuando TMR1CS = 1:
1 – No sincronizar.
0 - Sincronizar.
Cuando TMR1CS=0, este bit es ignorado.
TMR1CS – Bit de selección de la fuente de la señal de reloj del Timer 1.
1 – Cuenta los pulsos en el pin T1CKI (en el flanco de subida)
0 – Cuenta los pulsos del reloj interno del microcontrolador.
TMR1ON – Bit de arranque del Timer1.
1 – Arranca el Timer 1.
0 – Detiene al Timer 1.

7
Curso: Microcontroladores y Microprogramación – Clases Prácticas

Ejemplo de Aplicación del Timer1 como Temporizador


#INCLUDE P16F877A.INC INITC INVERTIR_SALIDA
CALL INITC BANKSEL TRISC MOVLW 0XFF
CALL INIT_TMR1 CLRF TRISC BANKSEL PORTC
BUCLE BANKSEL PORTC XORWF PORTC
CALL BORRAR_TIMER CLRF PORTC RETURN
ESPERAR_DESBORDE RETURN BORRAR_TIMER
BANKSEL PIR1 INIT_TMR1 BANKSEL TMR1H
BTFSS PIR1, TMR1IF BANKSEL TMR1H CLRF TMR1H
GOTO ESPERAR_DESBORDE CLRF TMR1H CLRF TMR1L
CALL INVERTIR_SALIDA CLRF TMR1L RETURN
CALL BORRAR_BANDERA MOVLW 0x30 ; Reloj interno BORRAR_BANDERA
GOTO BUCLE BANKSEL T1CON ;Pre-escalador BANKSEL PIR1
MOVWF T1CON ; 1:8 BCF PIR1, TMR1IF
BSF T1CON,TMR1ON;Arranque RETURN
RETURN END

El intervalo generado IG se halla con la fórmula


IG = N*M*(4/Fosc)
N – Número de incrementos del Timer 1
1/M – Valor del pre-escalador
Fosc - Frecuencia de reloj del microcontrolador.
El valor inicial del timer 0 es: VI = 65536 – N.

4. El Timer 2
El Timer 2 es de 8 bits con pre-escalador, post-escalador y un registro de periodo.
Cuando en el pre-escalador y post-escalador se colocan los valores máximos, el
intervalo de tiempo generado es el mismo que el de un timer de 16 bits.

8
Curso: Microcontroladores y Microprogramación – Clases Prácticas

TOUTPS3 - TOUTPS0 – Bits de selección del factor del post-escalamiento del Timer2

TMR2ON – Bit de arranque del Timer2.


1 – Timer 2 arrancado.
0 - Timer 2 parado.
T2CKPS1, T2CKPS0 - Bits de selección del factor del pre-escalamiento del Timer2

5. El Módulo CCP1
CCPR1H CCPR1L - Registro de 16 bits
6. Registro de 16 bits de captura
7. Registro de 16 bits de comparación
8. Registro de ciclo de trabajo de señal PWM

9
Curso: Microcontroladores y Microprogramación – Clases Prácticas

CCP1CON Register

DC1B1, DC1B0 – Bits menos significativos del ciclo de trabajo (número de 10 bits).
CCP1M3 - CCP1M0 – Bits de selección del modo del módulo CCP1.
CCP1M3 - CCP1M0 Modo
0000 Módulo CCPx inhabilitado (Resetea al módulo)
0100 Modo captura, cada flanco de bajada
0101 Modo captura, cada flanco de subida
0110 Modo captura, cada 4to flanco de subida
0111 Modo captura, cada 16avo flanco de subida
Modo comparación, inicializa el pin CCP en nivel bajo, en la
1000
igualdad de la comparación setea el pin CCP (CCPIF es seteado)
Modo comparación, inicializa el pin CCP en nivel alto, en la igualdad
1001
de la comparación resetea el pin CCP (CCPIF es seteado)
Modo comparación, Genera interrupción en la igualdad de la
1010
comparación (CCPIF es seteado, el pin CCP no es afectado)
Modo comparación, Disparador de Evento Especial (CCPIF es
1011
seteado)
11xx Modo PWM

Modo Captura

Modo Comparación

10
Curso: Microcontroladores y Microprogramación – Clases Prácticas

Disparador de
Evento Especial

Modo PWM

No se puede usar el post-escalador del timer 2.

11
Curso: Microcontroladores y Microprogramación – Clases Prácticas

Periodo PWM
TPWM = [(PR2) + 1] • 4 • TOSC • M
(PR2) – Valor del registro de periodo
TOSC – Periodo de la señal de reloj del microcontrolador
1/M - Valor del pre-escalador de TMR2

Ciclo de Trabajo PWM


CTPWM = CT•TOSC•M
CT - (CCPR1L:CCP1CON<5:4>) – Contenido de CCPR1L y los bits 5 y 4 de CCP1CON
TOSC – Periodo de la señal de reloj del microcontrolador

Ejemplo de generación de las señales de la tabla para fosc=4MHz


Pin Periodo Ciclo de Trabajo Timer a usar Pre-escalador Con Interrupción
17 3.6 mS 25% Timer 2 y módulo CCP 1/16 No
20 80 mS 50% Timer 0 1/256 Si
30 100 mS 50% Timer 1 1/1 Si

Para el periodo de la señal PWM: Para el ancho de pulso de la señal PWM:

𝑇𝑃𝑊𝑀 𝐶𝑇𝑃𝑊𝑀
𝑃𝑅2 = − 1 = 224 𝐶𝑇 = = 225 = 11100001
4 ∙ 𝑇𝑜𝑠𝑐 ∙ 𝑀 𝑇𝑜𝑠𝑐 ∙ 𝑀

El valor inicial decimal calculado para PR2 El valor inicial decimal calculado para
es: 224 CCPR1L es: 56
Los dos bits menos significativos son: 01
Para el Timer 0: Para el Timer 1:
𝑇 ∙ 𝐹𝑜𝑠𝑐 𝑇 ∙ 𝐹𝑜𝑠𝑐
𝑁= = 156.25 ≈ 157 𝑁= = 50000
4∙𝑀 4∙𝑀

VI=256-157=99 VI=65536-50000=15536
El valor inicial decimal calculado es: 99 El valor inicial decimal calculado es: 15536

12
Curso: Microcontroladores y Microprogramación – Clases Prácticas

#INCLUDE <P16F877.INC> BANKSEL PORTC RETURN


GOTO PRINCIPAL CLRF PORTC BORRAR_T0IF
ORG 4 BANKSEL TRISC BANKSEL INTCON
GOTO ISR CLRF TRISC BCF INTCON,T0IF
PRINCIPAL RETURN RETURN
CALL INIC_D INIC_D BORRAR_TMR1IF
CALL INIC_C BANKSEL TRISD BANKSEL PIR1
CALL INIC_T0 CLRF TRISD BCF PIR1,TMR1IF
CALL INIC_T1 BANKSEL PORTD RETURN
CALL INIC_T2_CCP1 CLRF PORTD INVERTIR_RD7
CALL INIC_INT RETURN MOVLW B'10000000'
CALL T0_40MS INIC_T0 BANKSEL PORTD
CALL T1_50MS BANKSEL OPTION_REG XORWF PORTD
BUCLE GOTO BUCLE MOVLW B'00000111' RETURN
ISR ;PE 1:256 INVERTIR_RD1
BTFSS INTCON,T0IF MOVWF OPTION_REG MOVLW B'00000010'
GOTO T0IF_ES_CERO RETURN BANKSEL PORTD
T0IF_ES_UNO INIC_T1 XORWF PORTD
CALL BORRAR_T0IF BANKSEL T1CON RETURN
CALL INVERTIR_RD1 MOVLW B'00000100';PE 1:1 T0_40MS
CALL T0_40MS MOVWF T1CON BANKSEL TMR0
RETFIE RETURN MOVLW D'99'
T0IF_ES_CERO INIC_T2_CCP1 MOVWF TMR0
CALL BORRAR_TMR1IF BANKSEL PR2 RETURN
CALL INVERTIR_RD7 MOVLW D'224' T1_50MS
CALL T1_50MS MOVWF PR2 BANKSEL TMR1H
RETFIE BANKSEL CCPR1L MOVLW HIGH(D'15536')
INIC_INT MOVLW D'56' MOVWF TMR1H
BANKSEL INTCON MOVWF CCPR1L BANKSEL TMR1L
BSF INTCON,GIE BANKSEL T2CON MOVLW LOW(D'15536')
BSF INTCON,T0IE MOVLW B'01111111';PE 1:16 MOVWF TMR1L
BSF INTCON,PEIE MOVWF T2CON BANKSEL T1CON
BANKSEL PIE1 BANKSEL CCP1CON BSF T1CON,TMR1ON
BSF PIE1,TMR1IE MOVLW B'00011100' RETURN
RETURN ;Modo PWM END
INIC_C MOVWF CCP1CON

13

También podría gustarte