Tutorial — Práctica 5: Timers e interrupciones
Lo que vas a construir
Usar Timer0 e interrupciones para retardos precisos sin bloquear el bucle principal.
-
1 Configura Timer0 para overflow periódico
Modo temporizador interno, prescaler según retardo deseado (ej. 1:256). Precarga TMR0H:TMR0L para que el overflow ocurra cada X ms. Calcula el valor con la fórmula del Tema 8.Consejo: Repaso: /timers/timer0/
-
2 Habilita interrupción del Timer0
Activa TMR0IE (INTCON), PEIE y GIE. En la ISR de Timer0: recarga TMR0, limpia TMR0IF y alterna un LED — así verificas que el retardo funciona sin bloquear el main.BSF INTCON, TMR0IE BSF INTCON, PEIE BSF INTCON, GIE -
3 Escribe la ISR con guardado de contexto
Al entrar: guarda WREG, STATUS (y BSR si usas bancos). Haz el trabajo (toggle LED, contador, etc.). Restaura en orden inverso y RETFIE. Nunca uses rutinas que pisen el contexto sin guardarlo.Consejo: Guía: /interrupciones/
-
4 Añade interrupción externa (pulsador)
Usa INT0 (RB0) o RBIE (RB4–RB7). En la ISR externa: debounce, cambia un estado (ej. sentido de parpadeo). El bucle principal no debe hacer polling del pulsador — solo tareas lentas o sleep. -
5 Bucle principal sin bloqueos
El main puede estar casi vacío (`GOTO $`) o hacer tareas de baja prioridad. Todo timing preciso va en ISRs. Verifica en Proteus que el LED parpadea a intervalo estable mientras respondes al pulsador.
Teoría de apoyo
Sección titulada «Teoría de apoyo»Repasa Timer 0, Timer 1 y 2 e Interrupciones antes de escribir la ISR.
Qué debes lograr en código
Sección titulada «Qué debes lograr en código»- Configurar Timer0 (o Timer1) para un retardo conocido.
- Habilitar GIE y la bandera de interrupción del timer.
- Escribir una ISR que guarde y restaure contexto (
WREG,STATUS, banco). - Responder a un pulsador con INT0 o RB4–RB7 sin polling en el bucle principal.