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.
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
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.
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.
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
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.
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
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
>>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
@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.
>>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
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....
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.
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.
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.
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!
>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.
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.
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.
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.