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.
Sigue estos pasos
- Completa
isr_altacon el archivo final de abajo (o agrega toggle + recarga al esqueleto del paso 7). - Compila, genera
.HEXy cargalo en Proteus (LED en RB0, 20 MHz). - Pulsa Play y espera ~2 s: el LED debe alternar encendido/apagado.
- Si no parpadea: revisa GIE, TMR0IE, vector 0x0008 y que limpiaste TMR0IF.
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 ; 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
Pruebalo
Opcional: cambia el valor de TMR0H/L para parpadeo mas rapido y calcula el nuevo tiempo con la formula de [Timer 0](/timers/timer0/).
Lista antes de continuar
- 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.