Activar interrupciones RB0 y RB7<>RB4 a la vez

Básicamente el primer problema que he realizado tiene interrupciones habilitadas por RB0 y TMR0, ahora debo añadirle las interrupciones por RB4:7, por lo que habilito la interrupción correspondiente en el registro INTCON.

El problema es que tan solo con modificar INTCON y darle el valor correspondiente (10111000) ya el problema anterior no funciona, y al añadir las comprobaciones pertinentes para los nuevos pines que van a generar interrupciones, el programa ya no muestra salida alguna por el display.

¿A alguien se le ocurre por qué al activar las interrupciones y no cambiar absolutamente nada más además de asignar a TRISB dos nuevos pines de entrada, no funciona? Si quito otra vez el 1 que activa las interrupciones de RB4:7 el programa vuelve a funcionar.

¡Gracias! ...
 
¿Y el código? quizá solo lo atoraste por algo en la rutina.

No puse el código porque era más una pregunta de si necesito activar algo más aparte de la interrupción correspondiente a los pines RB4:7, pero lo pongo aquí.
PHP:
list p=16f876a
    include "p16f876a.inc"
    __CONFIG _XT_OSC &_WDT_OFF &_LVP_OFF

CICLO20                EQU        0x20
SEGUNDOS            EQU        0x21
repeticiones_50        EQU        0x22
NUEVE                EQU        0X26
OCHO                EQU        0X27
SIETE                EQU        0X28
SEIS                EQU        0X29
CINCO                EQU        0X2A
CUATRO                EQU        0X2B
TRES                EQU        0X2C
DOS                    EQU        0X2D
UNO                    EQU        0X2E
CERO                EQU        0X2F

    ORG    0
    goto    inicio
    ORG    4
    GOTO    ISR
    ORG    5

inicio

    bcf        STATUS,RP1
    bsf        STATUS,RP0        ;configuramos banco1
    
    movlw    b'01000111'        ;prescaler, reloj interno
    movwf    OPTION_REG
    clrf    TRISC    
    movlw    b'11000001'
    movwf    TRISB
    movlw    b'10111000'
    movwf    INTCON

    bcf        STATUS,RP0        ;configuramos banco0
    movlw    .178
    movwf    TMR0
    movlw    b'01100111'
    movwf    NUEVE
    movlw    b'01111111'
    movwf    OCHO
    movlw    b'00000111'
    movwf    SIETE
    movlw    b'01111100'
    movwf    SEIS
    movlw    b'01101101'
    movwf    CINCO
    movlw    b'01100110'
    movwf    CUATRO
    movlw    b'01001111'
    movwf    TRES
    movlw    b'01011011'
    movwf    DOS
    movlw    b'00000110'
    movwf    UNO
    movlw    b'00111111'
    movwf    CERO    
    movlw    .50
    movwf    repeticiones_50



main
    goto    main

ISR
        btfsc INTCON,0
        goto reseteo
    btfsc    INTCON,1
    bcf        INTCON,4
    btfsc    INTCON,2
    goto    rutina_espera

CUENTA
    bcf        INTCON,1
    movlw     .178
    movwf    TMR0
    movlw    0x25
    movwf    FSR    

    retfie


rutina_espera    

    bcf        INTCON,2
    movlw    .178
    movwf    TMR0
    decfsz    repeticiones_50
    retfie
    goto    recargar
recargar
    
    movlw    .50
    movwf    repeticiones_50
    goto    siguiente

siguiente
    movfw    INDF
    INCF    FSR
    btfss    FSR,4
    goto    mover
    goto    reseteo
mover
    
    movfw    INDF
    movwf    PORTC
    retfie    

reseteo
    
    clrf    PORTC
    bsf        INTCON,4
    bcf        INTCON,1
    bcf        INTCON,0
    retfie

    end
 
Última edición por un moderador:
Si activas las resistencias pull-up del puerto B, (Bit 7 del registro OPTION_REG = 0) no se podrá salir del servicio de interrupción.
Usa resistencias pull-up/down externas y define el flanco de interrupción de RB0 en el bit 6 de OPTION_REG
 
Hola ubico, lo que pasa es que en cuanto activas los pull-up el puerto B cambia de estado y por eso cuando activas las interrupciones inmediatamente se dispara la interrupción de cambio de estado del puerto B.
Para el caso particular de la interrupción de cambio de estado del puerto B, antes de borrar el bit INTCON.RBIF se debe leer previamente el puerto B (puedes usar: movf PORTB,F) solo así se podrá borrar dicho bit.

Por otro lado no sé si tu programa esta bien, cuando se cambia de estado uno de los bits (4 al 7) del puerto B el display se borra por un breve momento y luego continúa su cuenta regresiva.
 
Lo que pasa es que en cuanto activas los pull-up el puerto B cambia de estado y por eso cuando activas las interrupciones inmediatamente se dispara la interrupción de cambio de estado del puerto B.
Para el caso particular de la interrupción de cambio de estado del puerto B, antes de borrar el bit INTCON.RBIF se debe leer previamente el puerto B (puedes usar: movf PORTB,F) solo así se podrá borrar dicho bit.
Últimamente me he vuelto menos explícito al exponer los motivos, y ésto es debido a que los títulos difieren, aunque prácticamente se refieren a temas ya tratados, y que ya han sido resueltos en temas similares.

Aún así, siempre se debe recordar y tener en cuenta que tenemos a la mano la hoja de datos, que nos ayuda a comprender muchas cosas.
Cuesta mucho tiempo leerla y comprenderla, pero a final de cuentas es nuestra mejor ayuda.

Se deja abierto el tema por motivos de búsqueda con términos singulares.
 
Lo idela es configuarar las interrupciones especificas y por ultimo si de forma global asi evitas esas fallas, ademas no veo la rutina de atencion a las INTS, chaooooo
 
Perdón por la tardanza en contestar, gracias por las respuestas y la próxima vez intentaré utilizar el buscador algo mejor para no poner preguntas repetidas. No conocía lo de las pull-ups y tampoco supe buscar mejor sobre eso, pero siempre se aprende algo. Gracias de nuevo por las respuestas.
 
Atrás
Arriba