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.
da Interrupts Low-Aktiv sind, müsste ich da ja ein UND nehmen.
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
Was geschieht, wenn beide Interrupts "gleichzeitig" kommen? (Ja, ich habe Interrupts noch eingefügt)
ich würde in jedem Fall immer beide ICs nacheinander auslesen (INT Register). So verpasst man keins.
>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
Hallo, ok ok ok... ;) Der muß aber ja vermutlich seinen Interrupt auch merken usw. usw. Hoffe ich zumindest... 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.