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


7

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


2
Eine einfache CPLD wie eine XC9536XL ist ziemlich kostengünstig, aber es gibt eine Lernkurve.
Chris Stratton

Antworten:



3

Sie können einen programmierbaren Interrupt-Controller (PIC) wie den 82C59A verwenden . Es wird kaskadiert, wenn Sie mehr als die acht Interrupts benötigen, die es bereitstellt. 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 so konfiguriert, dass Funktionen ausgewählt werden.
  • Chip Select wird bei Bedarf erneut verwendet, um den 82C59A zu adressieren.
    • A0 Adresse wählt verschiedene Befehlswörter innerhalb des 8259 aus
  • INT und INTA¯ werden als Handshake-Schnittstelle verwendet.
    • INT Ausgang verbindet sich mit dem INTR Pin vom Master und ist mit einem Master-IR-Pin eines Slaves verbunden
    • In einem System mit Master und Slaves nur der Master INTA¯ Signal ist angeschlossen.
  • Eingänge unterbrechen IR0 zu IR7kann entweder als pegelsensitive oder als flankengetriggerte Eingänge konfiguriert werden. Flankengetriggerte Eingänge werden bei Übergängen von 0 zu 1 aktiv.
  • Kaskadenschnittstelle CAS0 - - CAS2 und SP¯/.EN¯::
    • Kaskadenschnittstelle CAS0 - - CAS2 Tragen Sie die Adresse des zu wartenden Slaves.
    • SP¯/.EN¯ : = 1 wählt den Chip als Master im Kaskadenmodus aus.

Derzeit von Intersil produziert und bei Digikey auf Lager .


3

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


Die Semtech I / O-Expander sind außerdem preisgünstig und flexibel, obwohl sie nur QFN-Pakete enthalten, sodass MCP-Chips einfacher zu breadboarden sind.
Yann Vernier

0

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 besteht darin, einen "Pin Change Interrupt" durchzuführen . Es gibt Bibliotheken dafür, die es jedem Pin ermöglichen, einen Interrupt auszulösen, da der ATMega mit einer etwas cleveren Codierung fähig ist.


1
Dies kann tatsächlich als Antwort nützlich sein, wenn es eine Erklärung / einen Beispielcode zum Implementieren von Pin-Wechsel-Interrupts und deren Verwendung für den in der Frage verwendeten Zweck enthält.
Anindo Ghosh

Während der AVR Pin-Interrupt-Interrupts für alle Pins hat, heißt es in der ursprünglichen Frage, dass "nicht genügend Pins am Atmel vorhanden sind". Das bedeutet, entweder einen anderen Controller oder einen E / A-Expander zu erwerben.
Yann Vernier
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.