Ir al contenido

Interrupciones

Ya dominas GPIO y botones con polling (BTFSS PORTB en bucle). Las interrupciones permiten que el PIC salte a una rutina de servicio (ISR) cuando ocurre un evento — Timer0, teclado, UART — sin revisar banderas todo el tiempo. Son obligatorias en Practica 2 (teclado), Practica 3 (frecuencimetro) y Practica 5 (timers + ISR).

Viste los registros base en Registros — interrupciones. Aquí cierras Tema 6: vectores, cadena de habilitacion, ISR correcta y enlace con Timer 0.

Diagrama de flujo de una interrupcion desde el evento hasta RETFIE
Secuencia completa: detectar evento, guardar contexto, ejecutar ISR, limpiar bandera y retornar con RETFIE. Vectores: alta **0x0008 (08H)**, baja **0x0018 (18H)**. — Tema 6 Interrupciones — UNEXPO · Ing. Mecatronica · Microcontroladores

Una interrupcion interrumpe temporalmente el programa principal para ejecutar codigo urgente. Al terminar, el PIC vuelve exactamente donde estaba gracias a la pila y la instruccion RETFIE.

EnfoqueComo funcionaCuando usarlo
PollingBTFSS TMR0IF / PORTB en bucle infinitoRetardos simples, un solo boton
InterrupcionHardware salta a ISR cuando la bandera se activaTeclado, timers precisos, UART, frecuencimetro

En Botones el antirrebote con CALL retardo_20ms es polling. En Practica 2 el teclado matricial usa RBIE para no bloquear la CPU escaneando columnas.

Para que una ISR de periferico se ejecute (ej. Timer1), enciendes tres interruptores:

GIE = 1 ; maestro global (INTCON)
PEIE = 1 ; perifericos (INTCON) — timers 1/2/3, UART, ADC…
TMR1IE = 1 ; fuente concreta (PIE1)
Periferico listo ; Timer1 corriendo, overflow → TMR1IF

Timer0 es especial: TMR0IE y TMR0IF estan en INTCON (no en PIE1). Para Timer0 necesitas GIE + TMR0IE; PEIE no aplica a Timer0 en el PIC18.

  1. El evento pone una bandera (TMR0IF, RBIF, ADIF…) en 1.
  2. Si la fuente esta habilitada y GIE = 1, el CPU salta al vector de interrupcion.
  3. Tu codigo en la ISR atiende el evento, limpia la bandera y ejecuta RETFIE.
PrioridadDireccionNotacion en ensamblador
Alta0x0008ORG 0x0008 o ORG 08H
Baja0x0018ORG 0x0018 o ORG 18H

En el curso y en el datasheet veras las dos formas: 0x0008 / 0x0018 (hex completo) y 08H / 18H (forma corta que usa MPASM en ORG). Ambas apuntan a la misma direccion de memoria de programa.

Si no limpias la bandera, el PIC reentra a la ISR inmediatamente.

La ISR puede usar WREG, STATUS y otros registros que el programa principal necesitaba. Minimo del curso: guardar WREG y STATUS al entrar y restaurarlos antes de RETFIE. Detalle en la guia practica — contexto.

Los vectores van arriba, despues de CONFIG y antes del codigo principal:

ORG 0x0000
GOTO programa ; reset → main
ORG 0x0008 ; alta prioridad (tambien: ORG 08H)
GOTO isr_alta ; salto → vector alta prioridad
ORG 0x0018 ; baja prioridad (tambien: ORG 18H)
GOTO isr_baja ; salto → vector baja prioridad
; ── Subrutinas e ISR ──────────────────────────────────
isr_alta:
; atender fuentes de alta prioridad
RETFIE
isr_baja:
; atender fuentes de baja prioridad
RETFIE
programa:
; codigo principal
END

En laboratorio muchas practicas usan solo prioridad alta (ORG 0x0008 / ORG 08H) con todas las fuentes en isr_alta.

RegistroFuncion
INTCON.GIEHabilitacion global — sin GIE no hay interrupciones
INTCON.PEIEHabilita interrupciones perifericas (Timer1/2/3, UART, ADC…)
INTCON.TMR0IE / TMR0IFHabilitacion y bandera de Timer0
INTCON.RBIE / RBIFInterrupcion por cambio en RB4–RB7
PIE1, PIE2Habilita cada fuente periferica (TMR1IE, ADIE…)
PIR1, PIR2Banderas de evento periferico
IPR1, IPR2Prioridad alta/baja de cada fuente

Cadena resumida — Timer0:

BCF INTCON, TMR0IF ; limpia bandera antes de arrancar
BSF INTCON, TMR0IE ; habilita interrupcion Timer0
BSF INTCON, GIE ; enciende maestro global
BSF T0CON, TMR0ON ; arranca el timer

Cadena — Timer1 (periferico):

BCF PIR1, TMR1IF
BSF PIE1, TMR1IE
BSF INTCON, PEIE
BSF INTCON, GIE
FuentePin / moduloBandera tipicaUso en el curso
INT0–INT2RB0, RB1, RB2INT0IFPulsador externo
RB puertoRB4–RB7RBIFTeclado matricial — Practica 2
Timer0Interno / RA4TMR0IFRetardo, parpadeo — Timer 0
Timer1/2/3InternoTMR1IF, TMR2IFFrecuencimetro, PWM
CCPRC2, etc.CCP1IFCaptura, comparacion, PWM
ADCCanales ANxADIFLectura analogica
USARTRC6/RC7RCIF, TXIFSerial
USBModulo USBvariasProyectos avanzados

Ejemplo integrado (vector + guardado minimo + recarga):

ORG 0x0008
GOTO isr_alta
isr_alta:
BTFSS INTCON, TMR0IF
GOTO fin_isr ; no era Timer0 → salir
; ── Guardar contexto (minimo) ──
MOVWF temp_w ; guarda WREG
SWAPF STATUS, W
MOVWF temp_status
BCF T0CON, TMR0ON ; pausa timer mientras recargas
BCF INTCON, TMR0IF ; limpia bandera
MOVLW B'01100111'
MOVWF TMR0H ; recarga valor precalculado
MOVLW B'01101010'
MOVWF TMR0L
BSF T0CON, TMR0ON
; ── Tarea: toggle LED ──
BTFSC LATB, 0
GOTO apagar_led
BSF LATB, 0
GOTO restaurar
apagar_led:
BCF LATB, 0
restaurar:
SWAPF temp_status, W
MOVWF STATUS
MOVF temp_w, W
fin_isr:
RETFIE ; retorna e re-habilita GIE

Configuracion previa del timer: ver Timer 0 — 2 segundos.

Interrupcion RB4–RB7 — vista previa teclado

Sección titulada «Interrupcion RB4–RB7 — vista previa teclado»

Para teclado matricial (guia RB interrupt):

BCF INTCON2, RBPU ; pull-ups internos PORTB (segun practica)
BSF INTCON, RBIE ; habilita cambio RB4-RB7
BSF INTCON, GIE

En la ISR: escanear filas/columnas, antirrebote, y limpiar RBIF leyendo PORTB (requerimiento del hardware PIC18).

ErrorConsecuencia
Olvidar GIELa ISR nunca se ejecuta
No limpiar TMR0IF / RBIFReentrada infinita a la ISR
RETFIE sin restaurar WREG/STATUSPrograma principal corrupto
ISR demasiado largaPierde eventos, jitter en timers
Confundir polling con interrupcionCPU al 100% en bucle vacio
  1. Guia practica — Interrupciones — paso a paso con MPLAB/Proteus
  2. Timer 0 — formula, T0CON y retardo preciso
  3. Practica 5 — Timers e interrupciones — laboratorio integrado

¿Para que sirve INTCON.GIE?

Habilita o deshabilita todas las interrupciones globalmente. Sin GIE = 1, ninguna ISR se ejecuta.

¿Por que limpiar TMR0IF antes de RETFIE?

Si la bandera sigue en 1, el hardware considera el evento pendiente y vuelve a entrar a la ISR.

¿Donde estan TMR0IE y TMR0IF?

En el registro INTCON, no en PIE1/PIR1.

¿Que hace RETFIE?

Retorna de la interrupcion, restaura el PC desde la pila y re-habilita GIE automaticamente.

Ejercicio · Parcial

Disena la cadena

Lista los registros que debes poner en 1 para que Timer1 genere interrupcion: ¿GIE? ¿PEIE? ¿TMR1IE? ¿TMR1ON?

Examen interactivo

Interrupciones

Basado en: Clase Tema 6. Interrupciones.pdf

0 de 0 respondidas

GIE en INTCON habilita...
Antes de salir de una ISR debes...
TMR0IE y TMR0IF estan en el registro...
Para interrupcion de Timer1 necesitas ademas de GIE...
RETFIE ademas de retornar...
El vector de alta prioridad en PIC18F4550 esta en...
RBIE habilita interrupcion por cambio en...
En una ISR debes guardar minimo...