Paso 7 de 11
ISR minima: comprobar bandera y limpiar
Objetivo
Escribir el esqueleto de isr_alta: si es Timer0, limpiar TMR0IF y volver con RETFIE.
Patron obligatorio en toda ISR:
1. Comprobar que la interrupcion es tuya (BTFSS TMR0IF)
2. Limpiar la bandera (BCF TMR0IF) — si no, reentra infinito
3. RETFIE al salir
Aun no guardamos WREG/STATUS ni movemos el LED — eso es el paso 7.
Sigue estos pasos
- Reemplaza el
RETFIEsolo deisr_altapor el bloque resaltado. - Deja
isr_bajacon solo RETFIE (no la usamos en este ejercicio). - Compila y carga el HEX en Proteus.
- El programa corre pero el LED sigue fijo — normal en este paso.
Tu archivo hasta ahora
LIST P=18F4550
#include <P18F4550.INC>
CONFIG FOSC = HS
CONFIG WDT = OFF
CONFIG LVP = OFF
CONFIG PBADEN = OFF
ORG 0x0000
GOTO inicio
ORG 0x0008
GOTO isr_alta
ORG 0x0018
GOTO isr_baja
CBLOCK 0x20
temp_w
temp_status
ENDC
init_gpio:
BCF TRISB, 0
BCF LATB, 0
RETURN
init_timer0:
MOVLW B'00000111'
MOVWF T0CON
MOVLW B'01100111'
MOVWF TMR0H
MOVLW B'01101010'
MOVWF TMR0L
RETURN
isr_alta:
BTFSS INTCON, TMR0IF
GOTO fin_isr
BCF INTCON, TMR0IF
fin_isr:
RETFIE
isr_baja:
RETFIE
inicio:
CALL init_gpio
CALL init_timer0
BCF INTCON, TMR0IF ; limpia bandera antes de habilitar
BSF INTCON, TMR0IE ; habilita interrupcion Timer0
BSF INTCON, GIE ; maestro global
BSF T0CON, TMR0ON ; arranca el timer
bucle:
GOTO bucle
END
Lo que agregas en este paso
isr_alta:
BTFSS INTCON, TMR0IF
GOTO fin_isr
BCF INTCON, TMR0IF
fin_isr:
RETFIE
Lista antes de continuar
- isr_alta comprueba TMR0IF antes de actuar.
- Limpio TMR0IF antes de RETFIE.
- Compila sin errores.