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!
@Peter: Danke für die Antwort. Der Pull-Up ist allerdings schon intern beim ATmega, deswegen ist der nicht in der Schaltung.
>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.
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.