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

11

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 zu tun haben (dh welcher Pin den Interrupt verursacht hat), sind die beiden identisch.

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

Tsiflana
quelle

Antworten:

8

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

Interrupt-on-Change
Diese Funktion ähnelt der Funktion für externe Interrupts , 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 er aktiviert ist. Dies macht es flexibler (verfügbar auf mehr Stiften), aber auch schwieriger, richtig damit umzugehen.

Perilbrain
quelle
5

Dies wird wahrscheinlich gemacht, um die Interrupt-Architektur des Chips zu vereinfachen, indem weniger Einträge in der Interrupt-Vektortabelle vorhanden sind. Interrupt on Change kann so eingestellt werden, dass es ausgelöst wird, wenn sich ein Portregister ändert, und kann für eine Tastaturmatrix nützlich sein, in 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üft. Je nach Anwendung ist dies möglicherweise das, woran Sie wirklich interessiert sind.

Jon L.
quelle
5

Die drei größten Unterschiede zwischen Interrupt-On-Wechsel und externen Interrupt-Pins:

  1. Über die externen Interrupt-Pins kann die Software festlegen, ob der Interrupt durch eine steigende oder eine fallende Flanke ausgelöst werden soll. Wenn beispielsweise 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. Bei Verwendung von Interrupt-on-Change müsste man bei beiden Ereignissen aufwachen.
  2. Die externen Interrupt-Pins haben einzelne Verriegelungsstatusbits. Selbst wenn ein Eingangsimpuls kommt und geht, bevor die Software darauf reagieren kann, kann die Software dennoch feststellen, dass dies geschehen ist, und angemessen reagieren.
  3. Das Lesen eines E / A-Ports, an dem ein Pinwechselwechsel genau zu dem Zeitpunkt aktiviert ist, zu dem sich der Eingang ändert, kann dazu führen, dass der Pinwechselinterrupt nicht ausgelöst wird. Im Gegensatz dazu hat das Lesen des an einen externen Interrupt-Pin angeschlossenen E / A-Ports keine Auswirkung auf den Interrupt.

Die externen Interrupts des PIC sind vielseitiger und zuverlässiger als die universellen Pin-Change-Interrupts. Ich würde vorschlagen, das erstere zu verwenden, wenn es praktisch ist.

Superkatze
quelle
3

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

Bruno Ferreira
quelle
Zumindest für den erwähnten PIC12F1822 OP kann das IOC auch so konfiguriert (benutzerdefiniert) werden, dass es bei steigender Flanke, fallender Flanke oder beidem ausgelöst wird (Abschnitt 13). Der einzige Unterschied scheint mir zu sein, dass ein externer Interrupt nur so konfiguriert werden kann, dass er bei einer der beiden Flankenerkennungen ausgelöst wird.
PetPaulsen
2

Der Interrupt bei Änderung gilt im Allgemeinen für ein halbes Byte E / A, wobei 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 hat.

Das IOC ist auch darüber hinaus etwas schwieriger zu bedienen. Es ist unbedingt erforderlich, den Port kurz vor dem Aktivieren des Interrupts zu lesen, und noch wichtiger, den Port innerhalb des ISR zu lesen! Wenn Sie ein sich langsam änderndes Signal haben und glauben, Sie könnten ein Flag innerhalb des ISR setzen und später außerhalb des 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 neu ausgelöst, wenn Sie den ISR verlassen. Wenn Sie daran denken, dies zu tun, ist alles gut, aber wenn Sie vergessen und glauben, dass Sie den Port lesen können, wenn Sie dazu kommen, werden Sie ein bisschen frustriert, bis Sie daran denken, das Lesen im ISR durchzuführen.

Scott Seidman
quelle