Gute Lösung für mehr Interrupts auf einem Arduino?

Ich baue eine Schaltung mit einem Arduino Mega und einfachen IC-Chips (z. B. 7432), aber ich muss viele Leitungen auf Unterbrechungsbedingungen überwachen und nicht genügend Pins auf dem Atmel, also suche ich nach einer Möglichkeit, dies zu erweitern. Es ergeben sich Probleme, weil ich in der Lage sein muss, die Triggerbedingung für einige Leitungen basierend auf Bedingungen von steigender Flanke auf fallende Flanke umzuschalten, und einige Leitungen nach der Wartung hoch bleiben, sodass ein Prioritätscodierer unter der Bedingung leiden würde, dass eine höhere Priorität vorliegt Interrupt würde einen mit niedrigerer Priorität maskieren. Für das letztere Problem denke ich darüber nach, ein Register und einige Gatter zu verwenden, um das Deaktivieren einiger Interrupts zu ermöglichen, aber ich habe keine gute Lösung für das erstere. Hat jemand irgendwelche Vorschläge? Ich bekomme bei Bedarf neue Chips, daher wären Lösungen mit zusätzlichen ICs der 7400-Serie oder ähnlichem wünschenswert.

Ein einfaches CPLD wie ein XC9536XL ist ziemlich günstig, aber es gibt eine Lernkurve.

Antworten (4)

Ein Arduino Mega hat „nur“ 24 Pinwechsel-Interrupts für seine 80 Pins. Für das Originalplakat mag das aber ausreichen, und er war sich dieser Möglichkeit möglicherweise nicht bewusst, da die „INT“-Pins in der Arduino-Umgebung API-Unterstützung haben, während die Pin-Wechsel-Interrupts dies nicht tun.

Hier ist ein ziemlich ausgefeilter Code, der an Pin-Änderungs-Interrupts angehängt werden kann

Sie könnten einen programmierbaren Interrupt-Controller (PIC) wie den 82C59A verwenden . Es wird kaskadiert, wenn Sie mehr als die acht bereitgestellten Interrupts benötigen. Es ist ein bisschen altmodisch, aber ich denke, es wird alle Ihre Anforderungen erfüllen. Aus diesen Vorlesungsfolien :

Blockdiagramm von 82C59A

  • Es wird vom Host-Prozessor als Peripheriegerät behandelt.
  • Es wird vom Host-Prozessor konfiguriert, um Funktionen auszuwählen.
  • Chip Select wird wieder verwendet, um den 82C59A bei Bedarf zu adressieren.
    • A0 Adresse wählt verschiedene Befehlswörter innerhalb des 8259 aus
  • INT und ich N T EIN ¯ werden als Handshaking-Schnittstelle verwendet.
    • INT Ausgang verbindet sich mit dem INTR Pin vom Master und ist mit einem Master-IR-Pin auf einem Slave verbunden
    • In einem System mit Master und Slaves nur der Master ich N T EIN ¯ Signal angeschlossen ist.
  • Eingänge unterbrechen IR 0 zu IR 7 können entweder als pegelsensitive oder flankengesteuerte Eingänge konfiguriert werden. Flankengetriggerte Eingänge werden bei Übergängen von 0 nach 1 aktiv.
  • Kaskadenschnittstelle CAS 0 - CAS 2 und S P ¯ / E N ¯ :
    • Kaskadenschnittstelle CAS 0 - CAS 2 tragen die Adresse des zu bedienenden Slaves.
    • S P ¯ / E N ¯ :=1 wählt den Chip als Master im Kaskadenmodus aus.

Derzeit von Intersil produziert und bei Digikey auf Lager .

Ich würde einen E/A-Expander wie den MCP23008 oder den MCP23017 verwenden . Beide haben SPI- und I 2 C-Versionen; Interrupts können für jeden Eingang konfiguriert werden (flankensensitiv, pegelsensitiv).

Die I/O-Expander von Semtech sind auch preisgünstig und flexibel, obwohl sie nur QFN-Gehäuse haben, sodass MCP-Chips einfacher zu stecken sind.

Ich weiß, dass diese Antwort etwas spät ist, aber ich beantworte sie für alle späten Leser dieser Frage.

Die Softwareversion zum Hinzufügen weiterer Interrupts wäre ein "Pin Change Interrupt" . Dafür gibt es Bibliotheken, die es ermöglichen, dass jeder Pin einen Interrupt auslösen kann, da der ATMega mit einer etwas cleveren Codierung in der Lage ist.

Dies könnte als Antwort tatsächlich nützlich sein, wenn es einen Erklärungs- / Beispielcode zur Implementierung von Pin-Change-Interrupts und zur Verwendung für den Zweck in der Frage enthält.
Während der AVR Pin-Wechsel-Interrupts für alle Pins hat, heißt es in der ursprünglichen Frage, dass "nicht genügend Pins auf dem Atmel" vorhanden sind. Das bedeutet, entweder einen anderen Controller oder einen I/O-Expander zu besorgen.