zwei externe IRQs teilen sich 1 IRQ Eingang ?

Gast #836055
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
Gast #836066
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.
Gast #836072
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
Persönliche Seite #836079
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
Gast #836081
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.
#836110
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
#836113
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
#836148
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
#836300
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
Gast #836313
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren