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.
Que es una interrupcion
Sección titulada «Que es una interrupcion»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.
Paso 1 — Polling vs interrupcion
Sección titulada «Paso 1 — Polling vs interrupcion»| Enfoque | Como funciona | Cuando usarlo |
|---|---|---|
| Polling | BTFSS TMR0IF / PORTB en bucle infinito | Retardos simples, un solo boton |
| Interrupcion | Hardware salta a ISR cuando la bandera se activa | Teclado, 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.
Paso 2 — Tres capas de habilitacion
Sección titulada «Paso 2 — Tres capas de habilitacion»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 → TMR1IFTimer0 es especial: TMR0IE y TMR0IF estan en INTCON (no en PIE1). Para Timer0 necesitas GIE + TMR0IE; PEIE no aplica a Timer0 en el PIC18.
Paso 3 — Bandera, vector e ISR
Sección titulada «Paso 3 — Bandera, vector e ISR»- El evento pone una bandera (
TMR0IF,RBIF,ADIF…) en 1. - Si la fuente esta habilitada y GIE = 1, el CPU salta al vector de interrupcion.
- Tu codigo en la ISR atiende el evento, limpia la bandera y ejecuta RETFIE.
| Prioridad | Direccion | Notacion en ensamblador |
|---|---|---|
| Alta | 0x0008 | ORG 0x0008 o ORG 08H |
| Baja | 0x0018 | ORG 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.
Paso 4 — Guardar contexto
Sección titulada «Paso 4 — Guardar contexto»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.
Vectores en el .ASM — estilo sandwich
Sección titulada «Vectores en el .ASM — estilo sandwich»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 ENDEn laboratorio muchas practicas usan solo prioridad alta (ORG 0x0008 / ORG 08H) con todas las fuentes en isr_alta.
Registros clave
Sección titulada «Registros clave»| Registro | Funcion |
|---|---|
INTCON.GIE | Habilitacion global — sin GIE no hay interrupciones |
INTCON.PEIE | Habilita interrupciones perifericas (Timer1/2/3, UART, ADC…) |
INTCON.TMR0IE / TMR0IF | Habilitacion y bandera de Timer0 |
INTCON.RBIE / RBIF | Interrupcion por cambio en RB4–RB7 |
PIE1, PIE2 | Habilita cada fuente periferica (TMR1IE, ADIE…) |
PIR1, PIR2 | Banderas de evento periferico |
IPR1, IPR2 | Prioridad 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 timerCadena — Timer1 (periferico):
BCF PIR1, TMR1IF BSF PIE1, TMR1IE BSF INTCON, PEIE BSF INTCON, GIEFuentes principales del PIC18F4550
Sección titulada «Fuentes principales del PIC18F4550»| Fuente | Pin / modulo | Bandera tipica | Uso en el curso |
|---|---|---|---|
| INT0–INT2 | RB0, RB1, RB2 | INT0IF… | Pulsador externo |
| RB puerto | RB4–RB7 | RBIF | Teclado matricial — Practica 2 |
| Timer0 | Interno / RA4 | TMR0IF | Retardo, parpadeo — Timer 0 |
| Timer1/2/3 | Interno | TMR1IF, TMR2IF… | Frecuencimetro, PWM |
| CCP | RC2, etc. | CCP1IF | Captura, comparacion, PWM |
| ADC | Canales ANx | ADIF | Lectura analogica |
| USART | RC6/RC7 | RCIF, TXIF | Serial |
| USB | Modulo USB | varias | Proyectos avanzados |
ISR minima — Timer0 con contexto
Sección titulada «ISR minima — Timer0 con contexto»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 restaurarapagar_led: BCF LATB, 0
restaurar: SWAPF temp_status, W MOVWF STATUS MOVF temp_w, Wfin_isr: RETFIE ; retorna e re-habilita GIEConfiguracion 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, GIEEn la ISR: escanear filas/columnas, antirrebote, y limpiar RBIF leyendo PORTB (requerimiento del hardware PIC18).
Errores comunes
Sección titulada «Errores comunes»| Error | Consecuencia |
|---|---|
| Olvidar GIE | La ISR nunca se ejecuta |
| No limpiar TMR0IF / RBIF | Reentrada infinita a la ISR |
RETFIE sin restaurar WREG/STATUS | Programa principal corrupto |
| ISR demasiado larga | Pierde eventos, jitter en timers |
| Confundir polling con interrupcion | CPU al 100% en bucle vacio |
Siguiente paso
Sección titulada «Siguiente paso»- Guia practica — Interrupciones — paso a paso con MPLAB/Proteus
- Timer 0 — formula, T0CON y retardo preciso
- Practica 5 — Timers e interrupciones — laboratorio integrado
Preguntas estilo parcial
Sección titulada «Preguntas estilo parcial»¿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?
Interrupciones
Basado en: Clase Tema 6. Interrupciones.pdf
0 de 0 respondidas
Inicia sesion en CALETAS para sincronizar este resultado entre dispositivos.
Iniciar sesion en CALETAS