Ir al contenido

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. 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. 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. 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. 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. 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.

Repasa Timer 0, Timer 1 y 2 e Interrupciones antes de escribir la ISR.

  1. Configurar Timer0 (o Timer1) para un retardo conocido.
  2. Habilitar GIE y la bandera de interrupción del timer.
  3. Escribir una ISR que guarde y restaure contexto (WREG, STATUS, banco).
  4. Responder a un pulsador con INT0 o RB4–RB7 sin polling en el bucle principal.

Panel de tutoriales · Ejercicios