PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt-Controller



ikarus_177
14.06.2008, 19:33
Hi,

für mein Projekt muss ich ca. 20 Interrupts auswerten und feststellen können, von welchem Gerät diese kommen, damit ich darauf reagieren kann.

Nun hat ein ATMega 32 blos 2 solcher Eingänge. Im RN-Wiki steht, es gibt solche Interrupt-Controller, die eigentlich geradezu perfekt für mein Vorhaben wären.

Kennt ihr solche Bausteine / IC's? Kann ich die dann einfach mit einem normalen Datenbus (I2C wäre mir am liebsten) abfragen, um festzustellen, von welchem Gerät der Interrupt ausgeht?

Viele Grüße
ikarus_177

Crock
15.06.2008, 00:56
Ich kenne keine ICs der Art, aber ich wuerde einfach alle Interruptleitungen an den einen Pin haengen, und wenn der getriggert wird, in einer Matrix o.ae. scannen, von wem dieser Interrupt kam. Die Frage ist, ob das fuer deine Anwendung schnell genug ist.

Jaecko
15.06.2008, 08:18
Wenns ein ATMega ist, dann kann man ja alle Interruptquellen an 3 Ports anschliessen. Über Dioden o.ä. dann alle auf z.B. INT0.
Wird INT0 ausgelöst, einfach den Zustand der 3 Ports sichern, dass man den hat. Das auswerten, welches Bit auf welchem Port gesetzt ist, kann man ja danach machen und sich Zeit lassen.

PicNick
15.06.2008, 08:47
Programmable Interrupt-Controller z.B.
Intel 8259
Aber da müssen die devices schon mitspielen.

ikarus_177
15.06.2008, 10:29
Hi,

erst mal Danke für die Antworten. Mir ist eben noch eine weitere Möglichkeit eingefallen, wie man das realisieren könnte.

Und zwar:

ein ATMega16, der als Coprozessor fungiert, fragt im Hauptprogramm ständig alle seine Eingänge ab. An diese Eingänge würde ich dann die Interrupts legen. Wenn ein Eingang des uC's von Gerät1 auf high gesetzt wird, erkennt das der Controller, und schaltet einen Ausgang, der ebenfalls mit Gerät1 verbunden ist, auf high, worauf Gerät1 das ursprüngliche Signal wieder zurücknimmt, der ATMega schaltet dann ebenfalls sein Signal wieder auf low. Da die Eingänge den bestimmten Geräten zugeordnet sind, lässt sich nun feststellen, von welchem Gerät der Interrupt ausgelöst wurde. Der Coprozessor meldet sich nun über I2C beim eigenlichen Masteer und gibt die Informationen weiter, worauf der Master dann reagieren kann.

Könnte man das so realisieren?


Viele Grüße
ikarus_177

Gock
15.06.2008, 10:40
Du könntest Dir einen weiteren µC mit 20 Eingängen so programmieren, dass er diese Eingänge ständig abfragt (pollt) und bei einem IRQ dessen Nr per SPI, I2C oder einfach binär an der anderen µC übermittelt. Bei binär bräuchtest Du 5^2=32, also 5 Ports+INTx -> 6 Leitungen.
Gruß

Edit: war ich wohl zu spät...

linux_80
15.06.2008, 13:42
Hallo,

bei einem Mega88 zB. kann man auf alle Pins einen Interupt legen, den PinChangeInterupt - PCINT, evtl. reicht da auch ein Mega48, da der nur auf die INTs wartet.
Mit den Mega48/88/168 kann man max. 23 solcher Eingänge bearbeiten, dann brauchts aber noch eine Schnittstelle, und den Reset, sinds 20, wenn man den internen Takt verwendet.

shaun
15.06.2008, 15:06
@ikarus: wenn Du selbst schon polling vorschlägst, kann es mit der Interrupt-Notwendigkeit (heisst: schnell und prioritär) ja nicht so weit her sein. Entscheidend für den Verzicht auf "richtige" INTs wäre ja, wie schnell reagiert werden muss und wie lange die Signale anstehen. Mit ein paar Multiplexern und einigen Portpins liesse sich die Funktion ja vielleicht auch in den "Hauptcontroller" verlegen.

ikarus_177
15.06.2008, 19:24
@shaun: ich dachte nur, wenn ein ATMega 16 nichts anderes zu tun hat, als seine Eingänge zu überwachen, müsste das auch sehr schnell gehen? Außerdem kann ich dann gleich das "Interruptabschaltesignal" an das betreffende Gerät zurücksenden.


Viele Grüße
ikarus_177