Forum: Mikrocontroller und Digitale Elektronik zwei externe IRQs teilen sich 1 IRQ Eingang ?


von Megaman (Gast)


Lesenswert?

Hallo,

an meinem PIC sind 3 externe Interrupts möglich (INT0..2).
Leider brauche ich SPI. Dabei liegen SCK und SDI auf den Pins für INT0 
bzw. INT1.

Ich zwei (gleiche) Devices die jeweils einen IRQ-Ausgang haben, um dem 
PIC Ereignisse zu melden.
Kann ich nun den einen verbleibenden INT2 dafür verwenden, die beiden 
Devices anzuschließen? Wenn ein INT ausgelöst wird, muss der PIC dann 
ebend schauen, welcher der zwei Devices denn nun ausgelöst hat. Kann das 
irgendwann Probleme geben oder ist sowas denkbar?

MFG

von holger (Gast)


Lesenswert?

>Wenn ein INT ausgelöst wird, muss der PIC dann
>ebend schauen, welcher der zwei Devices denn nun ausgelöst hat.

Und woher soll der wissen welches Device den Int ausgelöst hat ?
Nur über den einen Int Pin geht das nicht.

von Tilo (Gast)


Lesenswert?

Schalte vor den int-Pin ein oder-Gatter und lege eines der Signale auf 
einen Eingangs-Pin. Dann kannst du in der Routine überprüfen, welche 
Quelle
der genaue Auslöser war.

von ben (Gast)


Lesenswert?

wenn du noch einen extra pin hast, geht das in bestimmen Fällen.
Du schliesst die eine Interruptquelle an einen normalen Pin an, an den 
Interrupt Pin kommen beide Interruptquellen mit einem Or-Gatter dran.

wenn du zum beispiel weißt, dass die Interruptquellen einen Puls 
ausgeben, der nicht zu kurz sein darf, dann baust du in die 
Interruptroutine am Anfang eine Abfrage rein, ob der normale Pin high 
ist.

Ja, dann war es Interrupt 2, sonst Interrupt eins.

(gilt jetzt alles für die Auswertung der steigenden Flanke)

Natürlich hast du bei dieser Möglichkeit Einschränkungen hinzunehmen.

Gruß

ben

von Megaman (Gast)


Lesenswert?

> Und woher soll der wissen welches Device den Int ausgelöst hat ?
Es gibt ja noch das Interrupt Flag Register. Darüber dachte ich, kann 
man nachschauen.

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Das ganze nennt man Interrupt-Polling. Das geht schon, wenn es sein 
muss. Du brauchst aber mindestens eine zusaetzliche Leitung (Portpin). 
Wird nun ein Interrupt ausgeloest, pruefst Du den Zustand dieses Pins 
und entscheidest anhand daran, welches Geraet den Interrupt ausgeloest 
hat. Besser sind allerdings zwei Pins, weil Du so toleranter gegenueber 
Fehler bist.

Gruss,
Michael

von holger (Gast)


Lesenswert?

>>Kann ich nun den einen verbleibenden INT2 dafür verwenden
>Es gibt ja noch das Interrupt Flag Register. Darüber dachte ich, kann
>man nachschauen.


Der hat aber nur ein Flag. Schau dir die Postings
von ben und Tilo an. Nur so könnte das gehen.

von Megaman (Gast)


Lesenswert?

da Interrupts Low-Aktiv sind, müsste ich da ja ein UND nehmen.

von let (Gast)


Lesenswert?

...oder zwei Dioden...

von Peter D. (peda)


Lesenswert?

Wie dringlich sind denn die Interruptquellen, müssen sie wirklich 
innerhalb weniger µs behandelt werden?

Wenn es mechanische Kontakte sind, dann haben diese schon selber viele 
ms Reaktionszeit, da kommts auf ein paar mehr überhaupt nicht an.
D.h. man fragt sie einfach mit nem Timerinterrupt (z.B. alle 10ms) ab 
und kann obendrein das Entprellen darin erschlagen.


Peter

von Michael U. (amiga)


Lesenswert?

Hallo,

Bedingung ist, daß Deine IRQ-auslösenden ICs darauf abgefragt werden 
können, wer der Auslöser war. Wenn die das in einem Registerbit 
anzeigen, kein Problem.

Wired OR mit 2 Dioden und PullUp reicht da aus, manche ICs haben auch 
OpenCollektor/OpenDrain.Ausgänge für ihren IRQ, dann kann die jeweilige 
Diode auch noch weg.

Gruß aus Berlin
Michael

von Gast (Gast)


Lesenswert?

Was geschieht, wenn beide Interrupts "gleichzeitig" kommen?
(Ja, ich habe Interrupts noch eingefügt)

von Megaman (Gast)


Lesenswert?

ich würde in jedem Fall immer beide ICs nacheinander auslesen (INT 
Register). So verpasst man keins.

von holger (Gast)


Lesenswert?

>da Interrupts Low-Aktiv sind, müsste ich da ja ein UND nehmen.

Gut erkannt !

>Was geschieht, wenn beide Interrupts "gleichzeitig" kommen?

Dann hat der schöne Traum ein Ende :(

von Michael U. (amiga)


Lesenswert?

Hallo,

auch nichts anderes. Prinzipiell sollte bei solch einem Konzept in der 
IRQ immer nachgeschaut werden.

Es hängt von den Quellen und der Wichtigkeit der Bearbeitung, der 
Häufigkeit zu erwartender IRQ und dem ungünstigstem minimalen Abstand 
ab.

Wenn z.B. beide Quellen nicht allzuviele IRQs auslösen, der mögliche 
Mindestabstand 2er IRQ einer Quelle sicher länger ist als die maximale 
Laufzeit der IRQ-Routine (also unter der Annahme, daß beide bearbeitet 
werden müsse, dann würde ich es in der IRQ-Routine so machen:

Quelle 1 abfragen und bearbeiten, wenn nötig.
Quelle 2 abfragen und bearbeiten, wenn nötig.

INT-Flag des IRQ im AVR löschen und raus.
Dann wird eine Anforderung, die von der anderen Quelle während des 
Interrupts mit bearbeitet und das Flag gelöscht, damit nicht sofort 
wieder ein IRQ ausgelöst wird.
Das verhindert dann auch, daß eine IRQ-Anforderung übersehen wird, weil 
sowas ja nur sinnvoll mit Pegelgesteuerten IRQs zu machen ist und eine 
Quelle den IRQ-Pin noch auf L hält.

PS: Sowas hat früher ja auch funktioniert. Vektor-Interrupts kamen auch 
erst mit dem Z80 bei 8Bittern in Mode...

Gruß aus Berlin
Michael

von holger (Gast)


Lesenswert?

@ Michael

>INT-Flag des IRQ im AVR löschen und raus.

Wir reden im Moment über PICs ;)

von Michael U. (amiga)


Lesenswert?

Hallo,

ok ok ok... ;)
Der muß aber ja vermutlich seinen Interrupt auch merken usw. usw.
Hoffe ich zumindest...

Gruß aus Berlin
Michael

von holger (Gast)


Lesenswert?

@ Michael

>Der muß aber ja vermutlich seinen Interrupt auch merken usw. usw.
>Hoffe ich zumindest...

Ja logisch tut er das. Wollte dich nur ein bisschen ausbremsen ;)

von Peter D. (peda)


Lesenswert?

Gast wrote:
> Was geschieht, wenn beide Interrupts "gleichzeitig" kommen?

Dazu nimmt man dann den Level-Interrupt und nicht den Flankeninterrupt.
Solange einer von beiden aktiv ist, wird immer wieder der Handler 
aufgerufen, bis beide bedient wurden.
Mit dem Flankeninterrupt würde man dagegen Interrupts verlieren.


Aber sag ruhig mal, was für sauschnelle Interruptquellen das überhaupt 
sind, daß sie µs schnell bedient werden müssen.


Peter

von Gast (Gast)


Lesenswert?

Peter Dannegger wrote:
>Gast wrote:
>> Was geschieht, wenn beide Interrupts "gleichzeitig" kommen?

>Aber sag ruhig mal, was für sauschnelle Interruptquellen das überhaupt
>sind, daß sie µs schnell bedient werden müssen.

War nur interessiert, ob man damit prinzipell mehr Interrupts verlieren
kann, als mit separaten Interrupts.
Könnte ja wichtig sein keinen zu verpassen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.