Ir al contenido

Paso 9 de 11

ISR completa: toggle LED y recargar Timer0

Objetivo

Completar la ISR: recargar TMR0H/L, hacer toggle del LED en RB0 y ver el parpadeo en Proteus.

Entre guardar contexto y restaurarlo: 1. Pausa el timer (BCF T0CON, TMR0ON) 2. Limpia TMR0IF y recarga TMR0H/L con los mismos valores del paso 4 3. Rearranca el timer (BSF T0CON, TMR0ON) 4. Toggle del LED con BTFSC LATB,0 / BSF o BCF

El bucle principal sigue en GOTO bucle — demuestra que no hace falta polling.

  1. Completa isr_alta con el archivo final de abajo (o agrega toggle + recarga al esqueleto del paso 7).
  2. Compila, genera .HEX y cargalo en Proteus (LED en RB0, 20 MHz).
  3. Pulsa Play y espera ~2 s: el LED debe alternar encendido/apagado.
  4. Si no parpadea: revisa GIE, TMR0IE, vector 0x0008 y que limpiaste TMR0IF.
						        LIST    P=18F4550
        #include <P18F4550.INC>

        CONFIG  FOSC = HS
        CONFIG  WDT = OFF
        CONFIG  LVP = OFF
        CONFIG  PBADEN = OFF

        ORG     0x0000
        GOTO    inicio

        ORG     0x0008            ; alta prioridad (08H)
        GOTO    isr_alta

        ORG     0x0018            ; baja prioridad (18H)
        GOTO    isr_baja

        CBLOCK  0x20
temp_w
temp_status
        ENDC

init_gpio:
        BCF     TRISB, 0      ; RB0 salida (LED)
        BCF     LATB, 0
        RETURN

init_timer0:
        MOVLW   B'00000111'    ; 16 bit, interno, PS 1:256
        MOVWF   T0CON
        MOVLW   B'01100111'
        MOVWF   TMR0H
        MOVLW   B'01101010'
        MOVWF   TMR0L
        RETURN

isr_alta:
        BTFSS   INTCON, TMR0IF
        GOTO    fin_isr

        ; guardar contexto minimo
        MOVWF   temp_w
        SWAPF   STATUS, W
        MOVWF   temp_status

        BCF     T0CON, TMR0ON
        BCF     INTCON, TMR0IF
        MOVLW   B'01100111'    ; recarga Timer0 (~2 s)
        MOVWF   TMR0H
        MOVLW   B'01101010'
        MOVWF   TMR0L
        BSF     T0CON, TMR0ON

        ; toggle LED en RB0
        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

isr_baja:
        RETFIE

inicio:
        CALL    init_gpio
        CALL    init_timer0
        BCF     INTCON, TMR0IF
        BSF     INTCON, TMR0IE
        BSF     INTCON, GIE
        BSF     T0CON, TMR0ON
bucle:
        GOTO    bucle

        END
					
  • La ISR recarga Timer0 y hace toggle del LED.
  • **Vi el LED parpadear** en Proteus o placa (~2 s por cambio).
  • El bucle principal no lee TMR0IF — confirma que es interrupcion, no polling.