¿Cómo afecta la escritura en los pines de salida en PORTB a la interrupción RBIF en PIC16F877?

Tengo un PIC16f877 con PORTB configurado de la siguiente manera:

RB0 Output
RB1 Output
RB2 Output
RB3 Output
RB4 Input
RB5 Input
RB6 Output
RB7 Output

RB4..5 se usa para detectar 2 interruptores de botón simples, y quiero usar el indicador de interrupción RBIF para manejar el evento de presionar un botón, en lugar de sondear.

Mirando la hoja de datos en la página 31, dice esto:

El usuario, en la Rutina de Servicio de Interrupción, puede despejar la interrupción de la siguiente manera:

a) Cualquier lectura o escritura de PORTB. Esto pondrá fin a la condición de desajuste.

b) Borrar bit de bandera RBIF.

Una condición de discrepancia seguirá activando el bit indicador RBIF. La lectura de PORTB finalizará la condición de discrepancia y permitirá que se borre el bit indicador RBIF.

Mi preocupación es que dice específicamente "Cualquier ESCRITURA de portb". Los otros pines en PORTB que están configurados para salida se usan para LED atenuados PWM y, por lo tanto, se escriben con mucha frecuencia. No quiero que se produzca un cambio de entrada en RB4 o RB5 algunos ciclos antes de una escritura PORTB para borrar una condición de discrepancia y no disparar la interrupción.

Sin embargo, la hoja de datos se contradice en el párrafo anterior:

Solo los pines configurados como entradas pueden causar que ocurra esta interrupción (es decir, cualquier pin RB7:RB4 configurado como salida se excluye de la comparación de cambio de interrupción).

Lo que significaría que estaré bien y no tendré que preocuparme de que las escrituras en PORTB afecten la interrupción.

¿Es esto algo de lo que debo preocuparme? No puedo mover las salidas a otro puerto porque no tengo suficientes pines de repuesto en el chip.

Mi lectura es que, como dice, cualquier escritura en el puerto B puede desactivar la interrupción. Pero solo los pines RB4: RB7, y luego solo cuando las entradas pueden encenderlo. Si las interrupciones se toman inmediatamente, debería estar bien. ¡Pero no escriba RB3:0 con las interrupciones deshabilitadas! Alternativamente, verifique explícitamente RB4,5 después de escribir PortB: ¡no tiene que esperar una interrupción!

Respuestas (1)

La condición de discrepancia establecerá el indicador de interrupción y la lectura del puerto eliminará la discrepancia, pero al hacerlo no se borrará el indicador, aún debe borrarlo manualmente dentro del isr.

Desde el circuito del puerto B que se muestra en la hoja de datos (Figura 3-4), puede decir que no hay forma de que WR (afirmado durante las escrituras del puerto) pueda eliminar la falta de coincidencia cuando el pin está configurado como una entrada (el bit TRIS es 1), porque la señal WR no afecta nada más que el "Latch de datos", y la salida del latch de datos no va a ninguna parte porque el búfer de tres estados está en alta impedancia cuando el bit TRIS es 1.

La información que falta aquí es que una escritura de puerto también activa la lectura de puerto, porque todas las escrituras son realmente operaciones de lectura, modificación y escritura . La hoja de datos dice esto explícitamente sobre el puerto A, pero sospecho que funciona de la misma manera en el puerto B. Esto significa que cuando escribe en el puerto, también se realiza una lectura, por lo que se afirma RD, eliminando la falta de coincidencia.

Sin embargo, la falta de coincidencia que se elimina cuando escribe en el puerto no afecta el hecho de que se llama a la interrupción, porque el indicador aún está establecido, que es lo único de lo que debe preocuparse. Su código no cambia, aún realizaría una lectura y luego borraría la bandera cuando ingrese el isr.

Es posible que se pregunte si una operación de lectura o de lectura-modificación-escritura ocurre exactamente al mismo tiempo que el cambio de entrada puede hacer que se pierda una condición de desajuste. No es así, la bandera aún debe estar configurada. Esto se debe al latch de entrada controlado por una señal Q1 (que no se menciona en el texto). Básicamente, mantiene el valor de entrada para la comparación de discrepancias durante la parte del ciclo de lectura en la que se afirma el RD, de modo que aún se detecta la discrepancia.

Esa es una gran explicación de lo que está pasando, ¡gracias!