PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrere Signale über einen Interrupt erkennen



Minifriese
02.06.2004, 13:41
Moin moin,

Ich will mit einem ATMega8 mehrere PWM-Signale von verschiedenen Quellen einlesen. Neulich hatte jemand in diesem Forum die Idee, jedes Signal auf einen eigenen Eingangspin zu legen und außerdem alle (über Dioden) auf einen gemeinsamen Interrupt zu führen. Der Interrupt merkt dann, daß eins der Signale auf high geht und man kann in der Interruptroutine rauskriegen, welches. Die eigentlich Auswertung des Signals macht man dann an dessen Eingangspin.

Mein Problem ist jetzt: Wenn eines der Signale auf high steht, ist damit der Interrupt für alle anderen Signale geblockt, weil ja konstant high-Pegel anliegt. Wie kriege ich das weg?

Ich hab mir überlegt, für jedes Eingangssignal je einen weiteren Pin als Ausgang zu benutzen, um ein Signal, das den Interrupt ausgelöst hat, erstmal vom Interrupt zu trennen, damit die anderen Signale wieder die Chance haben, ihn auszulösen. Allerdings bräuchte ich dazu einen elektronischen Schalter, der Spannungen unterbricht. Ein Transistor ist ja mehr zur Stromregelung da, gibt's sowas auch entsprechend für Spannungen?
Ich stell mir das so vor, daß ich am Kollektor die Signalquelle habe (Die natürlich weiterhin zu ihrem Eingangspin geht), der "Emitter" geht zum Interrupt, und an der Basis hängt der zu diesem Signal gehörende Ausgangspin, der das Signal vom Interrupt trennen soll (mit high oder low Pegel ist ja erstmal wumpe). Wenn jetzt ein Signal auf high geht, wird erstens über die Interruptroutine festgestellt, welches Signal das ist, dann wird der entsprechende Ausgang gesetzt, um dieses Signal vom Interrupt zu trennen und der Interrupt horcht wieder auf alle anderen Signale.

Bloß welches Bauteil wirkt wie so ein Schalter?

Weiß jemand, was ich meine, oder muß ich dochmal versuchen, das in Paint aufzumalen? ;-)

Nils

matren
02.06.2004, 14:16
Ich bin zwar kein Elektronik-Spezialist.
Als Schalter für kann man aber meines wissens, ja Optokoppler oder kleine Relais verwenden. (falls Du das noch nicht in Erwägung gezogen hast!)

trickTronic
02.06.2004, 14:56
Hallo,
und auch Transistoren kann man als Schalter benutzen (Schaltplan im Bild).
Der Kondensator C1 und RB1 sind nicht unbedingt nötig (sind nur da, um schneller zu schalten).
RB ~ 470 Ohm, RB1 ~ 470 Ohm, C1 ~ 100pF, RL ~ 470 Ohm bei VCC=5V.

Es gibt da aber noch was anderes: 74HC4066, CD4066
Das sind Schalter für 4 analoge Spannungen, der Strom und die Spannung sind aber begrenzt - man kann nicht alles schalten!

schöne Grüße,
Alex

Manf
02.06.2004, 16:01
Bloß welches Bauteil wirkt wie so ein Schalter?
Nils
Analogschalter nennen die sich

CD4016, 4066

und Kollegen. 4stück pro IC. Andere Anaolgschalter wirken als 1 zu n Multiplexer.
Damit müßte es gehen.

Es ist aber eine logische Verknüpfung für die man nicht unbedingt einen Schalter braucht. Manchmal sind die logischen Funktionen aber leichter mit Schaltern realisierbar als mit Gattern.
Manfred

Doch, die Antwort war schon da (siehe oben)

Minifriese
02.06.2004, 17:16
Nabend, besten Dank für die Ideen!
Die Relais hatte ich auch zuerst im Kopf, aber da ich den Interrupt benutzen will, um PWM-Signale zu messen, sind die Schaltzeiten wohl zu groß. Ich werd mich mal über die Analogschalter schlau machen, hab ich noch nie von gehört.
Das mit dem Transistor ist zwar bauteilmäßig etwas mehr Aufwand, aber ne gute Rückzugsmöglichkeit. Weil ich da sehen kann, daß es funktionieren muß :-)
Auch die Idee von Manfred mit den Gattern ist mir noch gar nicht gekommen, mit vier UND-Gattern (ich hab vier PWMs) sollte das sehr elegant gehen... Es gibt glaub ich sogar Chips mit genau vier Gattern, da werd ich mal googeln gehn ;-)

Nils

shadow-netz
02.06.2004, 19:56
Hallo!

Ich versteh das Problem nicht. Interrupts werden doch iA dazu verwendet um dem Prozessor zu sagen, dass ein Gerät von ihm etwas möchte.

Der Interrupt ist dann so lange anhängig, wie das "Problem" besteht.

Der einzige Fall wo man Interrupts ausgeschaltet haben möchte ist maximal beim starten. Denn wenn einer ausgeschaltet ist, muss man ja ihn auch wieder explizit anschalten.

Für sowas verwendet man iA ein Maskenregister, welches mit dem Interrupt Register verundet wird.

BTW jeder Transistor ist ein Schalter ;)

Minifriese
03.06.2004, 07:11
Nee, ich habe ja mehrere Signale auf einem Interrupt. Und wenn einer den Interrupt ausgelöst hat, soll er ihn nicht blockieren, damit die anderen auch ne Chance kriegen, ihn auszulösen. Ich will also nicht den Interrupt ausschalten, sondern eines der Signale vom Interrupt trennen.

Manf
03.06.2004, 09:55
Ich nehme an, der Kommentar war so gemeint, daß der Prozessor wenn er einen Interrupt erhält, sobald wie möglich seine laufende Arbeit beendet und sucht, welche Interrupts ihn gerufen haben.
Ein zweiter Interrupt in der Zeit wird nicht getrennt gezählt und auch nicht nach Quelle erfasst.
Bei der Abarbeitung des Interrupt wird zunächst das spezifische Anforderungssignal der Inerruptquelle zurückgesetzt und dann der Interrupt bearbeitet.
Die Anforderungen könnten also konstant per Oderverknüpfung anliegen, soweit ich das kenne.
Manfred

shadow-netz
03.06.2004, 10:52
genau.

Sobald einer oder mehrer anliegen wird der erste (priorisiert) abgearbeitet. Danach sollte er ja nicht mehr vorhanden sein, da der Grund durch Eingreifen des Prozessors beseitigt wurde.

Das macht der Prozessor solange bis kein Interrupt mehr da ist und macht dann mit seiner Arbeit weiter.

Die einzelnen Signale werden wie Manf schon meinte Ver"oder"t.

Wenn man einen Interrupt abschaltet beseitigt man ja nicht das Problem an sich, sondern nur seine Signalisierung. Deshalb ist das imo der falsche Designansatz.

Damit die anderen auch dran kommen muss der Prozessor schnell genug sein. Sollten die anderen dann immernoch nicht dran kommen, weil das erste Interruptsignal immernoch anliegt dann handelt es sich eigentlich nicht mehr um einen Interrupt, da dann die Ursache nicht beseitigt wurde.

mfg Shadow

Minifriese
03.06.2004, 18:37
Danach sollte er ja nicht mehr vorhanden sein, da der Grund durch Eingreifen des Prozessors beseitigt wurde.


Schon klar, daß da bei manchen Anwendungen der Grund beseitigt wird. Bei mir aber nicht, denn der Grund ist ja, daß ein PWM-Signal seine High-Phase angefangen hat. Und es bleibt ja dann solange high, wie es seinem aktuellen Meßwert entspricht, unabhängig von meinem Prozessor. Deswegen kann ich nicht die "Ursache" des Interrupts beseitigen, sondern nur das entsprechende Signal vom Interrupt trennen. Das Design paßt schon ;-)

Ich mach das ganze ja nur über einen normalen Interrupt, weil ich keine vier Timer-Capture-Interrupt-Pins habe. Sonst würd ich ja einfach jedes PWM an einen davon klemmen; daß die für PWMs besser geeignet sind, ist mir schon klar. Gibt bloß nicht genug...

Nils

xcyber
03.06.2004, 18:41
Wenn ich das Problem richtig verstanden habe, dann ist eine Oder-Verknüpfung hier nicht zielführend.
Minifriese will ja PWM-Signale auswerten. Dazu muss die Zeit messen die das das Signal High ist (T1) und ins Verhältnis zur Gesamtzeit (T2) setzen.
Soweit ich weiß hat der Meaga8 ein sog. Input Capture Pin (ICP) mit dem man PWM Signale einfach messen kann. Ein bereits angesprochener Analog-Switch kann dazu vernwendet werden um jeweils nur ein PWM Signal mit dem ICP zu verbinden. Vorteil dieser Methode ist der relativ geringe Programmieraufwand und die hohe Genauigkeit des Messverfahrens. Nachteil ist dass man die einzelnen Signale nicht gleichzeitig sondern nur nacheinender messen kann.
Als zweite Methode kann man wie auch schon angesprochen ein Interrupt Pin verwenden um den Mikrocontroller zu signalisieren dass sich eines der Signale geändert hat, der dann über ein eigenes Pin pro Signal checkt welches Signal das betrifft und so die x Signale gleichzeitig messen.
Sowohl Und-Verknüpfung als auch Oder-Verknüpfung der einzelenen Signale zum interrupteingang bringen hier aber nicht den gewünschten Effekt. (Bei UND würde man nur den Übergang zwischen den Zusatand 'Alle Signale sind High (T1)' und 'mindestens ein Signal ist low' feststellen können - bei ODER würde man nur den Übergang zwischen 'kein Signal ist high' und 'mindestens ein Signal ist high' feststellen können).
Mir fällt keine logische Funktion ein die genau den hier gestellten Anforderungen gerecht wird. Was man am ehesten noch verwenden könnte wäre ein Exklusives Oder (XOR). Mit einem XOR das die 4 Signale verknüpft würde sich der Ausgang des XOR's immer dann ändern wenn sich eines der Eingangssignale ändert. Ändern sich 2 genau zum gleichen Zeitpunkt, könnte man dies nicht feststellen.
Ansonsten könnte man auch noch die Signale über einfache RC-Glieder integrieren und die resultierende Spannnung mit dem ADC des Mega8 messen.
Hoffe meine Ausführungen sind halbwegs verständlich, Kommentare sind willkommen.
lG

Minifriese
03.06.2004, 19:04
(Bei UND würde man nur den Übergang zwischen den Zusatand 'Alle Signale sind High (T1)' und 'mindestens ein Signal ist low' feststellen können - bei ODER würde man nur den Übergang zwischen 'kein Signal ist high' und 'mindestens ein Signal ist high' feststellen können).


Neenee,

Ich wollte mit dem UND ja nicht die vier PWMs verbinden, sonder jeweils ein PWM mit einem Ausgang des µPs verUNDen und das Ergebnis auf den Interrupt legen. Also vier UND-Gatter mit jeweils zwei Eingängen, nämlich je ein PWM und ein Ausgang des µPs.

Wenn dann zum Beispiel PWM1 auf high geht, erkennt das meine Interruptroutine und schaltet den zugehörigen Ausgang auf Null (Ruhezustand für die vier Ausgänge müßte also high sein). Damit ist dieses UND nicht mehr erfüllt und PWM1 hat keinen Einfluß mehr auf den Interrupt.
Nils

Minifriese
03.06.2004, 19:04
(Bei UND würde man nur den Übergang zwischen den Zusatand 'Alle Signale sind High (T1)' und 'mindestens ein Signal ist low' feststellen können - bei ODER würde man nur den Übergang zwischen 'kein Signal ist high' und 'mindestens ein Signal ist high' feststellen können).


Neenee,

Ich wollte mit dem UND ja nicht die vier PWMs verbinden, sonder jeweils ein PWM mit einem Ausgang des µPs verUNDen und das Ergebnis auf den Interrupt legen. Also vier UND-Gatter mit jeweils zwei Eingängen, nämlich je ein PWM und ein Ausgang des µPs.

Wenn dann zum Beispiel PWM1 auf high geht, erkennt das meine Interruptroutine und schaltet den zugehörigen Ausgang auf Null (Ruhezustand für die vier Ausgänge müßte also high sein). Damit ist dieses UND nicht mehr erfüllt und PWM1 hat keinen Einfluß mehr auf den Interrupt.
Nils

shadow-netz
03.06.2004, 20:22
hmm also ist das so eine Art Multiplexer, wenn du dann immer einen PWM nacheinander einschaltest.

Nur für jeden Messeingang einen Ausgang zusätzlich zu brauchen ist doch etwas "teuer". Lohnt sich da der Analogmux nicht mehr?

Gottfreak
03.06.2004, 21:59
Die Lösung mit dem XOR(je 2 Eingänge verbinden und die Ergebnisse nochmal, also 3 Gatter) ist doch ganz gut: Du kriegst jede Änderung mit und kannst dann alle Pins überprüfen(wenn sich zwei gleichzeitig ändern, merkst du das zwar nicht, aber bei der nächsten Änderung sind dann, wenn die Frequenz gleich ist, 3 anders als vorher. Dann müsstest du das Ergebnis verwerfen und auf den nächsten Durchlauf warten (auf den Takt genau gleichzeitige Änderungen sind wahrscheinlich eine krasse Ausnahme.).).
Welche Frequenz haben die Signale denn?
Ein weiteres Problem könnte darin bestehen, dass der Timer, den du verwendest wohl irgendwann überläuft, wenn immer irgendein Signal läuft. Dann kannst du den nicht einfach zurücksetzen und musst den Überlauf irgendwie abfangen.
Wenn die zeitliche Auflösung nicht so wichtig ist, wäre ein Multiplexer die Lösung der Wahl: Du schaltest nur ein Signal durch, wartest, bis eine Periode vorbei ist und machst dann mit dem nächsten weiter(dann könntest du sogar den Capture-Pin nehmen.).

Kommen die PWMs tatsächlich aus unterschiedlichen Quellen?
Wenn sie gleichzeitig starten würden (wie z.B. beim ADXL) oder nacheinander kämen(wie z.B. beim Modellempfänger) wäre die Sache erheblich einfacher.
Geräte gleicher Frequenz lassen sich u.U. auch syncronisieren(auf gleichzeitigen Pulsbeginn).

PS: Verrätst du uns, was du damit vor hast?

shadow-netz
03.06.2004, 22:09
mit dem XOR wär ich vorsichtig...
es kann wirklich je nach quelle recht wahrscheinlich sein, dass die signale sich gleichzeitig ändern.
und selbst wenn sie sich knapp nacheinder ändern, kann es passieren, dass der spike der dadurch entsteht einfach verschluckt wird.
probieren kann man es zwar, aber optimal ist es sicher nicht.

Gottfreak
03.06.2004, 22:20
Da also alle gefundenen Lösungen nicht für 4 PWM-Signale beliebiger Art optimal sind, muss wohl eine Lösung für einen ganz speziellen Fall her, dessen spezielle Eigenschaften wir leider (hoffentlich noch...) nicht kennen.


und selbst wenn sie sich knapp nacheinder ändern, kann es passieren, dass der spike der dadurch entsteht einfach verschluckt wird.

Das hängt natürlich einerseits von der Geschwindigkeit der Gatter und andererseits von der der Signale ab. Welche zu verpassen scheint Minifriese jedenfalls nicht zu gefallen (sonst würde ein Multiplexer wohl ausreichen.).

shadow-netz
03.06.2004, 22:28
och wer was wissen will wird sich schon drum bemühen, dass einem geantwortet wird.

und wenn man solch hohe anforderungen an die messgenauigkeit hat (alle signale) wird dann eventuell auch über bessere (mehr) hardware nachdenken müssen.

God
03.06.2004, 22:32
Ich gehe nochma eben von der Programmierung zur Hardware zurück. :mrgreen:



Bloß welches Bauteil wirkt wie so ein Schalter?


Es sollte ja eine Art elektronischer Schalter her. Da Gibts doch diese "Schmitt-Trigger" ich mein ich hät ma irgendwo gesehen das das ein elektronischer Schalter ist. ist das so? :?:


mfg God

shadow-netz
03.06.2004, 22:41
hmm mit einem schmitti kann man eigentlich nix schalten.
nur signale schnell auf einen definierten pegel bringen, da er unterschiedliche ein (logisch '1') - und ausschaltschwellen (logisch '0') hat

xcyber
03.06.2004, 23:32
Bloß welches Bauteil wirkt wie so ein Schalter?


guckste hier (http://focus.ti.com/logic/docs/generalcontent.tsp?templateId=5985&navigationId=11407&path=templatedata/cm/general/data/sswitch_analog)

lG

Minifriese
04.06.2004, 07:53
hmm also ist das so eine Art Multiplexer, wenn du dann immer einen PWM nacheinander einschaltest.


Fast, bloß daß ich die Signale nicht hintereinander einschalte, sondern je nach Bedarf abschalte. Eben, damit ein high-Signal nicht den Interrrupt blockiert. Meistens wären also alle Signale freigeschaltet.

Ich werd das ganze einfach mal bauen, das klappt schon so, wie ich mir das vorstelle. Aber schön, daß das so viele interessiert ;-)

Es geht übrigens ganz simpel um die Sensoren eines halbautonomen Roboters: Lagesensor (ADXL, eine Achse), zwei Tiefensensoren, Kompaß, vielleicht noch ein Geschwindigkeitssensor/Wellendrehzahlsensor.

Nils

Gottfreak
04.06.2004, 09:31
Zitat:

hmm also ist das so eine Art Multiplexer, wenn du dann immer einen PWM nacheinander einschaltest.



Fast, bloß daß ich die Signale nicht hintereinander einschalte, sondern je nach Bedarf abschalte. Eben, damit ein high-Signal nicht den Interrrupt blockiert. Meistens wären also alle Signale freigeschaltet.

Das klingt irgendwie nicht, als müssten die Daten so oft aktualisiert werden. Reicht nicht einfach eine Periode des ersten Signals, dann eine des zweiten etc. (mit "normalem" Multiplexer)?
Die elegantere Lösung (wenn du genug ports dafür hast) baust du da natürlich schon.