Ir al contenido

Paso 10 de 11

Vista previa: interrupcion RB4–RB7 (teclado)

Objetivo

Entender como se habilita RBIE para el teclado matricial — puente hacia Practica 2.

El mismo archivo ya funciona con Timer0. Para teclado matricial (Practica 2) agregaras otra fuente en la misma isr_alta:

- RBIE en INTCON — interrupcion por cambio en RB4–RB7 - Pull-ups en columnas (BCF INTCON2, RBPU si usas internos) - En la ISR: escanear filas, antirrebote, y limpiar RBIF leyendo PORTB (requerimiento del hardware)

No es obligatorio probarlo ahora; es la siguiente aplicacion de interrupciones en el curso.

  1. Lee el bloque de codigo RBIE de abajo — no hace falta integrarlo si tu LED ya parpadea.
  2. Compara con la seccion RB4–RB7 de la teoria.
  3. Guarda guia-interrupciones.asm como plantilla para practicas.
  4. Marca todos los pasos 0–8 en el rastreador.
						        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
					
						; --- Agregar en inicio (ademas de Timer0) para teclado ---
        BCF     INTCON2, RBPU    ; pull-ups PORTB (segun practica)
        BSF     INTCON, RBIE     ; cambio en RB4-RB7

; --- Dentro de isr_alta, despues de atender Timer0 ---
        BTFSS   INTCON, RBIF
        GOTO    fin_rb
        ; escanear teclado, antirrebote...
        MOVF    PORTB, W         ; limpia RBIF (obligatorio)
fin_rb:
					
  • Mi programa Timer0 + ISR funciona y esta guardado.
  • Entiendo para que sirve RBIE y por que hay que leer PORTB.
  • Se que Practica 2 y 5 usan estas ideas.