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
>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.
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.
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
> 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.
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
>>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.
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
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
>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 :(
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
@ 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 ;)
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
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.