Auflösen von Interrupt-on-Change-Mismatch-Bedingungen in einem PIC16F877

Ich verwende pic16f887, um den Encoder schnell zu simulieren, um ihn später in einem größeren Projekt zu verwenden. Lesesignale von A- und B-Encoder mit Interrupt bei Änderung für portb und das Programm war:

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

und als ich es geändert habe:

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

und dies Dies beendet Mismatch-Bedingungen!! Meine Frage ist, was die Mismatch-Bedingungen sind und warum das Laden von w mit portb das beendet?

Vielen Dank im Voraus

Ich weiß, dass es nicht empfohlen wird, Verzögerungen im Interrupt zu verwenden, aber das war nur zum Debuggen.

Antworten (1)

Dies ist das beabsichtigte Verhalten dieses Mikrocontrollers. Bitte beachten Sie das Datenblatt , Seite 47:

Für aktivierte Interrupt-on-Change-Pins wird der aktuelle Wert mit dem alten Wert verglichen, der beim letzten Lesen von PORTB zwischengespeichert wurde, um zu bestimmen, welche Bits sich geändert haben oder nicht mit dem alten Wert übereinstimmen. Die "Nichtübereinstimmungs"-Ausgänge des letzten Lesens werden miteinander ODER-verknüpft, um das PORTB-Änderungs-Interrupt-Flag-Bit (RBIF) im INTCON-Register zu setzen.

Auch:

Eine Nichtübereinstimmungsbedingung setzt weiterhin das Flag-Bit RBIF. Das Lesen oder Schreiben von PORTB beendet die Nichtübereinstimmungsbedingung und ermöglicht, dass das Flag-Bit RBIF gelöscht wird.

Danke. Können Sie mir sagen, ob Sie das Bit bekommen können, das nicht übereinstimmt?
@Catch.Me Nicht, dass ich wüsste. Sie könnten den PORTB-Wert während jedes Interrupt-Dienstes kopieren und manuell mit dem vorherigen Wert vergleichen. Übrigens, gute Arbeit, die Lösung experimentell herauszufinden!
und in diesem T asm entfernt. Linie
@Catch.Me Großartig! Ich bin froh, dass es klappt.
BESTE GRÜSSE MANN