Resolución de condiciones de desajuste de interrupción por cambio en un PIC16F877

Estoy usando pic16f887 para simular rápidamente el codificador para luego usarlo en un proyecto más grande. leyendo señales del codificador A y B usando la interrupción en el cambio para el puerto b y el programa fue:

if(RBIF) 
{
  value++;
  UART_Write('b');
  __delay_ms(100);
  RBIF = 0;
}

y cuando lo cambié a:

if(RBIF) 
{
  asm(" MOVF _PORTB" );  
  value++;
  UART_Write('b');
  __delay_ms(100);
  RBIF = 0;
}

y esto Esto acaba con las condiciones de desajuste!! mi pregunta es ¿cuáles son las condiciones de desajuste y por qué cargar w con portb finaliza eso?

gracias de antemano

Sé que no se recomienda usar retrasos en la interrupción, pero eso fue solo para depurar.

Respuestas (1)

Este es el comportamiento previsto de este microcontrolador. Consulte la hoja de datos , página 47:

Para los pines de interrupción por cambio habilitados, el valor actual se compara con el valor anterior bloqueado en la última lectura de PORTB para determinar qué bits han cambiado o no coinciden con el valor anterior. Las salidas 'no coincidentes' de la última lectura se combinan con OR para establecer el bit indicador de interrupción de cambio de PORTB (RBIF) en el registro INTCON.

También:

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

Gracias. ¿Podría decirme si puede obtener el bit que no coincide con esto?
@Catch.Me No que yo sepa. Puede copiar el valor de PORTB durante cada servicio de interrupción y compararlo manualmente con el valor anterior. Por cierto, ¡buen trabajo descubriendo la solución experimentalmente!
y en este T eliminado asm. línea
@Catch.Me ¡Genial! Me alegro de que esté funcionando.
SALUDO HOMBRE