www.mikrocontroller.net

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


Autor: Megaman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ben (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Megaman (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Megaman (Gast)
Datum:

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

Autor: let (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...oder zwei Dioden...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

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

Autor: Megaman (Gast)
Datum:

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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :(

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Michael

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

Wir reden im Moment über PICs ;)

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Gruß aus Berlin
Michael

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.