Was ist der Unterschied zwischen Interrupt on Change und External Interrupt on PICs?

Was ist der Funktionsunterschied zwischen IOC und EXT Interrupt auf einem PIC? Ich verwende derzeit einen PIC12F1822, und abgesehen von der zusätzlichen Überprüfungsebene, die Sie mit IOC (dh welcher Pin den Interrupt verursacht hat) zu tun haben, sind die beiden identisch.

Was ist der praktische Unterschied, wenn überhaupt? Wann würden Sie das eine oder das andere verwenden?

Antworten (5)

Sehen Sie sich dieses Dokument an, in dem es heißt:

Interrupt-on-change
Diese Funktion ähnelt der externen Interrupt -Funktion, mit der Ausnahme, dass ein Portwechsel-Interrupt durch jede Änderung (nicht nur eine Art von Übergang) an einem der Pins ausgelöst wird, für die es aktiviert ist. Dies macht es flexibler (auf mehr Pins verfügbar), aber auch schwieriger, richtig damit umzugehen.

Dies geschieht wahrscheinlich, um die Interrupt-Architektur des Chips zu vereinfachen, indem weniger Einträge in der Interrupt-Vektortabelle vorhanden sind. Interrupt on change kann ausgelöst werden, wenn sich ein Portregister ändert, und kann für so etwas wie eine Tastaturmatrix nützlich sein, bei der Sie nicht für jeden einzelnen Pin eine Interrupt Service Routine (ISR) schreiben möchten. Sie können nur einen schreiben, der den Wert des gesamten Ports überprüfen kann, was Sie je nach Anwendung wirklich interessieren könnte.

Die drei größten Unterschiede zwischen Interrupt-on-Change und externen Interrupt-Pins:

  1. Über die externen Interrupt-Pins kann die Software angeben, ob der Interrupt durch eine steigende Flanke oder durch eine fallende Flanke ausgelöst werden soll; wenn z. B. ein Pin niedrig ist und man nur an fallenden Flanken interessiert ist, wird ein Interrupt nicht ausgelöst, bis der Pin steigt und anschließend fällt. Unter Verwendung von Interrupt-on-Change müsste man bei beiden Ereignissen aufwachen.
  2. Die externen Interrupt-Pins haben individuelle selbsthaltende Statusbits. Selbst wenn ein Eingangsimpuls kommt und geht, bevor die Software darauf reagieren kann, kann die Software immer noch herausfinden, dass es passiert ist, und angemessen reagieren.
  3. Das Lesen eines E/A-Ports, der genau zu dem Zeitpunkt, an dem sich die Eingabe ändert, einen Pin-Change-Interrupt aktiviert hat, kann dazu führen, dass der Pin-Change-Interrupt nicht ausgelöst wird. Im Gegensatz dazu hat das Lesen des I/O-Ports, der mit einem externen Interrupt-Pin verbunden ist, keine Auswirkung auf den Interrupt.

Die externen Interrupts des PIC sind vielseitiger und zuverlässiger als die Allzweck-Pin-Change-Interrupts. Ich würde vorschlagen, ersteres zu verwenden, wenn dies praktikabel ist.

Grundsätzlich wird der externe Interrupt bei einer bestimmten (steigenden oder fallenden, benutzerdefinierten) Flanke ausgelöst, während Interrupt-on-Change bei jeder Flanke (sowohl steigend als auch fallend) ausgelöst wird.

Zumindest für den PIC12F1822 kann der erwähnte OP, IOC auch konfiguriert werden (benutzerdefiniert) zum Triggern bei steigender Flanke, fallender Flanke oder beidem (Abschnitt 13). Der einzige Unterschied scheint mir also zu sein, dass der externe Interrupt nur so konfiguriert werden kann, dass er auf eine der beiden Flankenerkennungen auslöst.

Der Interrupt bei Änderung gilt im Allgemeinen für ein halbes E/A-Byte, während die externen Interrupts im Allgemeinen für einzelne Bits gelten. Wie Sie bereits sagten, müssen Sie im IOC ISR herausfinden, welches Bit (oder welche Bits) sich geändert haben.

Das IOC ist auch etwas schwieriger zu bedienen, auch darüber hinaus. Es ist unbedingt erforderlich, den Port kurz vor der Aktivierung des Interrupts zu lesen, und noch wichtiger, DEN PORT in der ISR ZU LESEN! Wenn Sie ein sich langsam änderndes Signal haben und glauben, Sie könnten ein Flag innerhalb der ISR setzen und später außerhalb der ISR lesen, denken Sie noch einmal darüber nach! Das Lesen des Ports (oder eines beliebigen Bits am Port, wenn ich mich richtig erinnere) setzt den Latch am Komparator zurück, der den Interrupt auslöst. Wenn Sie es nicht innerhalb des ISR löschen, wird es sofort erneut ausgelöst, wenn Sie das ISR verlassen. Wenn Sie sich daran erinnern, ist alles gut, aber wenn Sie es vergessen und denken, Sie könnten den Port lesen, wenn Sie dazu kommen, werden Sie ein bisschen frustriert, bis Sie sich daran erinnern, das Lesen in der ISR durchzuführen.