Ir al contenido

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.

  1. Reemplaza el RETFIE solo de isr_alta por el bloque resaltado.
  2. Deja isr_baja con solo RETFIE (no la usamos en este ejercicio).
  3. Compila y carga el HEX en Proteus.
  4. El programa corre pero el LED sigue fijo — normal en este paso.
						        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
					
						isr_alta:
        BTFSS   INTCON, TMR0IF
        GOTO    fin_isr
        BCF     INTCON, TMR0IF
fin_isr:
        RETFIE
					
  • isr_alta comprueba TMR0IF antes de actuar.
  • Limpio TMR0IF antes de RETFIE.
  • Compila sin errores.