Forum: Mikrocontroller und Digitale Elektronik Mehrere Buttons an einem Interrupt Pin


von einsteiger (Gast)


Lesenswert?

Hi,

ich habe 3 Buttons und einen Interruptpin am AVR zur Verfügung. Kann ich 
alle Buttons an den Interruptpin und zusätzlich an normale IO-Pins 
hängen, so dass bei Drücken von jedem Button der Interrupt ausgelöst 
wird und in diesem dann geprüft wird, welcher Pegel an welchem Pin auf 
LOW gezogen wurde?

Ich hab das Ganze wie im Bild im Anhang beschaltet, würde das so 
funktionieren?
Für die Dioden wollte ich Schottky Dioden mit möglichst geringer 
Flussspannung nehmen, damit das LOW noch sicher detektiert wird.

Viele Grüße.

von Nico S. (nico22)


Lesenswert?

Anhang fehlt.

von einsteiger (Gast)


Angehängte Dateien:

Lesenswert?

Sry.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Also meine kleinen 10-cent taster haben jeweils zwei Pärchen von 
Kontakten, die sie verbinden, ich denke, solche wären da angebrachter, 
aber klingt irgendwie trotzdem nach Murks, was du vor hast, such mal 
nach Tastenentprellung von Peter Danegger, der entprellt da 8 Taster 
gleichzeitig, und da kannst du dir deinen Int sparen.


MfG Dennis

von einsteiger (Gast)


Lesenswert?

Also es geht ja nicht um das Entpressen, sondern darum, dass ich nicht 
andauernd den Pin Status abfragen will. Ich möchte den Tasterdruck gern 
mit einem Interrupt behandeln. Aber habe nicht für jeden Taster einen 
Interrupt frei. Daher wollte ich es wie im Bild machen. So dass ich nur 
einmal im Interrupt gucken muss welcher Taster gedrückt wurde und danach 
mein normales Programm sich nicht mehr um die Taster kümmern braucht 
statt in einer Endlosschleife den Status zu pollen.

von Uwe (de0508)


Angehängte Dateien:

Lesenswert?

Hallo einsteiger,

Taster und Interrupt Eingang passt nicht zusammen.

Man nimmt die Entpressroutine von PeDa die läuft z.b. alle 10ms und 
liefert dir Zustandsinformationen zu deinen Tastern.

Hier mal einige Links zum verstehen, wie man vorgehen sollte:

- Beitrag "Universelle Tastenabfrage"
- Beitrag "Re: Universelle Tastenabfrage"

Das Thema kommt leider jede Woche 1 mal zur Frage und keiner ließt sich 
die einzig sinnvolle Lösung durch.


Ich habe Peters Funktionen wie im Anhang zu sehen, erweitert.

Hoffentlich sieht Du dir jetzt die genialen Routinen von PeDa an und 
bist nicht beratungsresistent, wie viele andere vor Dir.

von icke (Gast)


Lesenswert?

Sollte trotz des Beratungszwanges funktionieren.

von Dennis H. (Gast)


Lesenswert?

Sobald so ein Taster prellt, wirst du deine Freude mit deinem externen 
Interrupt haben, weil du diesen dann z.B. gleich dreimal aufrufst. Ich 
war ganz am Anfang auch so wie du, ich war der Meinung, das geht schon, 
und auch ich musste einfach mal feststellen, das es so nicht geht. Ich 
bin nach wie vor ein Anfänger, aber das habe ich gelernt. und alle 10ms 
abfragen, ob die Taster gedrückt sind ist ehrlich gesagt nicht viel 
Arbeit für den Prozessor, der langweilt sich nach wie vor zu tode.


MfG Dennis

von einsteiger (Gast)


Lesenswert?

Also das funktioniert bei euch dann über einen Timer der ein paar mal 
pro Sekunde sampelt, wenn ich das richtig verstanden habe.

Warum soll den Interrupt und Taster nicht zusammenpassen? Dafür ist 
sowas doch da, um auf ein externes Event zu reagieren dachte ich.

von Thorsten S. (whitejack) (Gast)


Lesenswert?

Hey,


>>dass ich nicht andauernd den Pin Status abfragen will.

Das Ziel sollte sein deine Hardware in der Software wieder abzubilden.

Erster Schritt, für jeden Taster ein Bit reservieren.

Zweiter, in einer wiederkehrend aufgerufenen Routine deine Taster so 
abfragen dass die Info von "Außen-Hardware" in die entsprechenden Bits 
gespiegelt wird.

Dritter, die Bits entprellen, kann entfallen wenn du die Abfragefrequenz 
schon ganz vernünftig wählst.

Vierter, die Bits sperren, sodass du die Taste erst wieder loslassen 
musst bevor die Freigabe erneut erteilt wird.

Fünfter, sonderfunktionen wie einen Autorun/trigger einbauen.

Hier mal ein Beispiel wie man mit 5 Pins 4LED und 6Taster anschließen 
kann.

Beitrag "6 IO Pins für 6 Taster und 2 Duo LED"

Interrupts werden für andere Aufgaben, z.B. ein Signal auszumessen o.ä. 
benutzt nicht für Signale deren Zustand schwer einzuschätzen ist. Du 
kannst höchstens das Abfragen des Tasters in einem Timer Interrupt 
machen, ist aber nicht nötig. Alles viel zu lasch im Timing.

TS

von spess53 (Gast)


Lesenswert?

Hi

>Warum soll den Interrupt und Taster nicht zusammenpassen? Dafür ist
>sowas doch da, um auf ein externes Event zu reagieren dachte ich.

Ein Taster erzeugt aber durch Kontaktprellen nicht nur ein Event. Und 
das nicht nur beim Drücken sondern u.U. auch beim Loslassen.

MfG Spess

von Thorsten S. (whitejack) (Gast)


Lesenswert?

>>um auf ein externes Event zu reagieren dachte ich.

Ja richtig, unswar binnen ns darauf zu reagieren, du bist hier im ms 
Bereich. Wenn am Interrupt Pin etwas flattert ist dei Controller platt, 
der ist dann damit beschäftigt binnen ns auf deinen Taster zu reagieren 
und Interrupts zu generieren.

Wenn du die Änderung der Schallgeschwindigkeit in Luftfeuchtigkeit 
messen willst o.ä. dann KANN so ein Signal ggf an einem Interrupt 
gebrauchen.

TS

von Thorsten S. (whitejack) (Gast)


Lesenswert?


von einsteiger (Gast)


Lesenswert?

@Dennis H.: Ich habe sonst immer Taster an Interrupts, aber diesmal ist 
das Problem, dass ich zu wenig Interrupts frei habe. Und sonst hatte ich 
auch nie ein Problem. Ich hatte immer folgenden Ablauf:

Taster gedrückt -> Interrupt aufgerufen -> solange Sampeln bis 5 mal 
hintereinander LOW detektiert wurde, somit ist der Taster gedrückt. Code 
ausführen und Interrupt auf steigende Flanke setzen -> Taster wird 
losgelassen -> Interrupt -> solange Sampeln bis 5 mal hinterreinander 
HIGH detektiert wurde und Interrupt wieder auf fallende Flanke setzen, 
somit ist der Taster losgelassen.

Das hat immer ganz gut geklappt. Und das gute ist ja dass er immer nur 
bei steigender oder fallender Flanke auslöst und dann die Global 
Interrupts deaktiviert, so dass ich nicht mehr als einen Interrupt auf 
einmal bekomme...natürlich könnte man statt dem Sampeln auch ein paar ms 
aktiv warten.

So ist mir das irgendwie lieber als immer zwischendurch zu pollen. 
Könnte man das Prellen nicht auch durch einen schönen Tiefpass 
verhindern? Dann könnte man sich das entprellen auch sparen.

von Thorsten S. (whitejack) (Gast)


Lesenswert?

>>Könnte man das Prellen nicht auch durch einen schönen Tiefpass

ja, damit gehst du dann immer weiter von einer praktischen Lösung weg.

Wenn du vernünftig programmierst hast du alle deine "Probleme" garnicht 
erst.

TS

von oldmax (Gast)


Lesenswert?

Hi
Wenn er denn unbedingt Taster am Interrupt betreiben möchte, so gönnt 
ihm den Spass doch mal. Es ist oft genug darüber mehr oder weniger 
sinnvolles zum Thema Taster und Interrupt geschrieben worden. Meine 
Meinung ist auch, das mechanische Kontakte und Interrupt nicht 
zusammenpassen, aber wenn's denn sein soll, Why not.
Einfach Taster auf normale Eingänge legen und über Diode an einen 
gemeinasamen Interrupteingang. In der ISR dann einfach nachsehen, 
welcher der Taster nun (prellt.... ) gedrückt ist. Viel Spass.
Gruß oldmax

PS:Ich kann absolut nicht verstehen, warum man normale Eingänge nicht 
Pollen soll. Die Philosophie "EVA" ist nicht unbegründet ein Begriff in 
der EDV.
EVA:
Einlesen
Verarbeiten
Ausgeben
Aber es scheint immer noch Mode zu sein, ein Rad neu erfinden zu 
wollen....

von Karl H. (kbuchegg)


Lesenswert?

einsteiger schrieb:

> Taster gedrückt -> Interrupt aufgerufen -> solange Sampeln bis 5 mal
> hintereinander LOW detektiert wurde,

Wie machst du das denn?
Sag jetzt bitte nicht indem du in der ISR für den externen Interrupt mit 
Warteschleifen arbeitest.

> So ist mir das irgendwie lieber als immer zwischendurch zu pollen.

Ich werde es nie verstehen.
Die PeDa Lösung ist sowas von gut, spielt alle Stücke die man in der 
Praxis braucht (inklusive Autorepeat, langer und kurzer Tastendruck), 
braucht so gut wie keine Rechenzeit, ist supereinfach in der Verwendung, 
auf jede beliebige Pinsituation anpassbar, kommt mit den schliessigsten 
Tastern zurecht und ist in jedem Programm integrierbar.
Wie man jemandem etwas anderes nahelegen kann, ist mir ein absolutes 
Rätsel.

von Karl H. (kbuchegg)


Lesenswert?

einsteiger schrieb:

> Warum soll den Interrupt und Taster nicht zusammenpassen? Dafür ist
> sowas doch da, um auf ein externes Event zu reagieren dachte ich.

Ein Tastendruck ist für deinen µC ein Ereignis, das in absoluter 
Zeitlupe abläuft. Interrupts brauchst du, wenn du eine garantiert 
schnelle Reaktion auf ein externes Ereignis brauchst. Wenn die 
Temperatur an einem Kernreaktor steigt, wäre es gut, wenn der µC schnell 
reagiert. Wenn die Lichtschranke zur Geschwindigkeitsmessung auslöst, 
wäre es gut, wenn das Programm schnell reagiert.
Aber Tastendrücke sind in der Kategorie: Wenn das Programm 20ms früher 
oder später den Tastendruck registriert ist das genauso wichtig, wie 
wenn in China ein Sack Reis umfällt. Alles was in einem Programm mit 
direkter Ein/Ausgabe für den Benutzer zu tun hat, ist völlig 
zeitunkritisch, weil der Mensch immer noch um Größenordnungen langsamer 
ist, als selbst der langsamste µC. Du willst dir aber auf keinen Fall 
den µC mit irgendwelchen Delays in irgendwelchen Interrupt Routinen 
lahmlegen.

von Ralph (Gast)


Lesenswert?

einsteiger schrieb:
> So ist mir das irgendwie lieber als immer zwischendurch zu pollen.
> Könnte man das Prellen nicht auch durch einen schönen Tiefpass
> verhindern? Dann könnte man sich das entprellen auch sparen.

Eine durchaus sinnvolle Lösung. Man MUSS NICHT alles in Software machen 
was auch ohne geht.
Und gerade in Verbindung mit einem InterruptPin für die Tastenabfrage 
macht das sogar wirklich Sinn um das Prellen und damit unzählige 
Interrupts zu verhindern.
Nachteil ist dabei das der Schaltzeitpunkt etwas verzögert wird.
Wie lange de Verzögerung ist hängt dabei an der Dimensionierung des 
Tiefpass.

Und deine Schaltung da oben nennt sich "wired OR" und ja das 
funktioniert so.
Allerdings sollte auch dein INT Pin einen Pullup haben.

von Peter S. (psavr)


Lesenswert?

Zur ursprünglichen Frage:

Ja es geht problemlos, bei der Schaltung fehlt aber noch ein PullUp 
Widerstand am Interrupt-Eingangspin (ca. 33k) und zur Entprellung würde 
ich ein 100nF Kondensator auf Masse schalten.

Thats it!

von einsteiger (Gast)


Lesenswert?

@Peter: Danke für die Antwort. Der Pull-Up ist allerdings schon intern 
beim ATmega, deswegen ist der nicht in der Schaltung.

von Peter S. (psavr)


Lesenswert?

>Der Pull-Up ist allerdings schon intern beim ATmega, deswegen ist der
>nicht in der Schaltung
Ok, das müsste reichen! Einfach gucken dass Du den Interrupt erst scharf 
machst, wenn die IO-Pins konfiguriert sind. Die 100nF würde ich aber 
einfügen, falls Du nicht per SW entprellen willst.

von Karl H. (kbuchegg)


Lesenswert?

Wisst ihr, was das eigentlich lustige ist:
Es gibt ein kommerzielles Board, welches über Kondensatoren entprellt.

Mit dem Effekt, dass alle irgendwann die Kondensatoren auslöten, weil 
der kurzfristige Kurzschluss ihre Programme zum Abstürzen bringen.
Beitrag "design fehler am atmel evaluations-board - programm stuerzt ab"


AUch lustig: Seine Tasten lösen gegenseitig aus. D.h. er braucht noch 
nicht einmal entprellen.

von seltenposter (Gast)


Lesenswert?

an einsteiger -
ich halte es mit oldmax - wenn Du es so machen will dann mach es so, es 
wird problemlos funktionieren.
Dem Kunden oder Benutzer ist es letztendlich völlig egal ob Du im 
externen IRQ Schleifen reinlegst oder im TimerIRQ oder 
Hauptprogrammschleife die Taster bearbeitest - solange das Ganze eben 
gut funktioniert und nicht 100 Entwickler auch damit arbeiten müssen 
würde ich da keine Justament-Glaubensfrage draus machen.

Persönlich würde ich eher empfehlen die Bearbeitung (und Entprellung) 
ohne externen IRQ zu machen, es ist ja nix zeitkritisches und die drei 
Dioden könntest Dir dann sparen - aber Deine Entscheidung.

an Karl Heinz Buchegger

bei dem Atmel Board schalten die Taster nach Vcc und die fetten C´s 
liegen gegen GND - soweit das im Beitrag steht. Dieser unglaubliche 
Schwachsinn hat mit dem Vorschlag in dieser Diskussion ja wenig zu tun, 
bei (internem) Pullup von ca. 33k und 100nF über den Taster gegen GND 
kann so ein Effekt nicht mal ansatzweise auftreten.

von einsteiger (Gast)


Lesenswert?

Ich werde einfach mal verschiedene Werte für mein C testen und noch 
einen R in Serie dazu vorsehen und dort auch mal verschiedene Werte 
testen und dann mal mit dem Oszi gucken. Simuliert sah das ganze 
eigentlich ok aus, aber die Realität ist ja oft anders.

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
Noch kein Account? Hier anmelden.