Hallo Leute, wie schaffe ich es, dass bei einem Tasterdruck der Ausgang eines µC toggelt. Es soll auf die steigende Flanke reagiert werden. Das heißt ich drücke den Taster, das Signal wird auf Masse gezogen (falende Flanke) nachdem ich den Taster wieder loslasse kommt eine steigende flanke und genau auf die soll der toggle Befehl reagieren. Die programmierung erfolgt in C (Atmel Studio 6). Danke!
>Die programmierung erfolgt in C
Und was hast du selbst schon an Software geschrieben?
Helpme91 schrieb: > wie schaffe ich es, dass bei einem Tasterdruck der Ausgang eines µC > toggelt. Erstmal tust du gut daran, dein Problem entsprechend dem EVA-Prinzip zu zerlegen. > Das heißt ich drücke den Taster, das Signal wird auf Masse > gezogen (falende Flanke) nachdem ich den Taster wieder loslasse kommt > eine steigende flanke und genau auf die soll der toggle Befehl > reagieren. Dann wirst du wohl erstmal erkennen müssen, wann sich der Pegel an deinem Eingangspin von Low auf High ändert.
Helpme91 schrieb: > Es soll auf die steigende Flanke reagiert werden. > Das heißt ich drücke den Taster, das Signal wird auf Masse > gezogen (falende Flanke) nachdem ich den Taster wieder loslasse kommt > eine steigende flanke und genau auf die soll der toggle Befehl > reagieren. Im Prinzip: 1.) Variablen für den aktuellen Wert und den Vergangenheitswert anlegen 2.) In jedem Zyklus den aktuellen Wert einlesen 3.) Aktuellen Wert mit dem Vergangenheitswert vergleichen 4.) Je nachdem wie der Vergleich ausfällt, bestimmte Reaktionen anstoßen 5.) Am Ende des Zyklus den aktuellen Wert im Vergangenheitswert speichern Vorher sollte man freilich noch das Tastersignal entprellen.
:
Bearbeitet durch User
Mark B. schrieb: > Vorher sollte man freilich noch das Tastersignal entprellen. Oder man guckt einfach selten genug, was der Taster so macht. Wenn da keiner zu hektisch drauf rum hackt, sollte es reichen, z.B. alle 20ms mal nachzusehen. Dann übersieht man das Prellen automatisch und alles wird gut.
Wolfgang schrieb: > sollte es reichen, z.B. alle 20ms mal nachzusehen. Dann übersieht man > das Prellen automatisch und alles wird gut. Dann übersieht man aber auch, dass das, was man da zufällig gesehen hat, nur ein 10us langer Störimpuls war, auf den man besser nicht reagiert hätte...
Entprellen ist was ANDERES als "alle 20ms mal nachschauen"... Genau solche SW findet man in immer mehr kaufbaren Geräten... muss ich leider feststellen.
Lothar M. schrieb: > Dann übersieht man aber auch, dass das, was man da zufällig gesehen hat, > nur ein 10us langer Störimpuls war, auf den man besser nicht reagiert > hätte... Ein 10µs langer Störimpuls hat aber nichts mit Entprellen, sondern mit Störunterdrückung zu tun. Das sollte man doch auseinander halten und dann auch beim Namen nennen. Ein prellender Taster erzeugt nicht zwischendurch aus Langerweile mal einen 10µs Impuls.
Wolfgang schrieb: > Lothar M. schrieb: > Dann übersieht man aber auch, dass das, was man da zufällig gesehen hat, > nur ein 10us langer Störimpuls war, auf den man besser nicht reagiert > hätte... > > Ein 10µs langer Störimpuls hat aber nichts mit Entprellen, sondern mit > Störunterdrückung zu tun. Das sollte man doch auseinander halten und > dann auch beim Namen nennen. > > Ein prellender Taster erzeugt nicht zwischendurch aus Langerweile mal > einen 10µs Impuls. Und trotzdem siehts du den Impuls und reagierst entsprechend. Schade
Eine Flanke erkennt man, indem man den vorherigen Zustand mit dem aktuellen zustand vergleicht. Wenn vorher=Low und aktuell=High, dann hast du eine steigende Flanke. Wenn vorher=High und aktuell=Low, dann hast du eine fallende Flanke. Du musst also nur den vorherigen Zustand des Tasters irgendwo speichern und ihn Zyklisch abfragen. Hinzu kommt noch die Notwendigkeit des Entprellens. Das kann man per Software mit einem Timer machen, oder per Hardware zum Beispiel so:
1 | ___ |
2 | |------ ---[===]---+-----µC Eingang mit Pull-Up |
3 | | |
4 | |----||------------+ |
5 | 100nF 100 Ohm |
Per Software kannst du es so machen: a) nach Reaktion auf eine Flanke erstmal 10ms Warten. Denn das prellen des Kontaktes wird nicht länger anhalten. Die nächste Tastenabfrage findet dann sicher nach dem Prellen statt. b) Die Abfrage der Taste für 10ms nach einer erkannten Flanke überspringen. Das hat den Vorteil, dass dein ganzes Programm nciht für die 10ms stehen bleibt. Es kann in dieser Zeit noch andere Sachen machen (Multitasking). Entprellen mit Kondensator hat den praktischen Neben-Effekt, dass Störimpulse, die man sich z.B. von Funkstörungen einfängt, weitgehend unterdrückt werden. Die Software fällt entsprechend einfacher aus.
>Und trotzdem siehts du den Impuls und reagierst entsprechend. Schade
@Jan: Hast du solche Störungen auf den Leitungen? Wirklich?
Oder sind das theoretische Überlegungen?
Was unternimmst du gegen diese Störungen?
@Wolfgang Schonmal was von ESD gehört. Es kann nunmal vorkommen, dass gerade dann, wenn du in deiner 20 ms Schleife nachschaust, ein ESD Peak deinen Eingang auslöst. Und was machst du nun? Bei einem sauberen Entprellen, wird dies mit abgefangen. Aber bei einem "ich schau mal gelegentlich nach" Entprellen, so wie du es vorschlägst nicht. Du musst schon von allen Eventualitäten ausgehen. Ich mag mich irren, aber so wie du es vorschlägst, kann es im worst-case zu einer nicht gewollten Reaktion kommen. Es sei denn du guckst nach, ob sich das Signal mehrere Zyklen nicht ändert. Und schon sind wir wieder bei einem sauberen Entprellen. Huch!
Jan schrieb: > Schonmal was von ESD gehört. Es kann nunmal vorkommen, dass gerade dann, > wenn du in deiner 20 ms Schleife nachschaust, ein ESD Peak deinen > Eingang auslöst. Du redest von Entprellen und diskutierst über Entstören. ESD hat nichts mit Prellen zu tun und muss sowieso erstmal auf Hardwareebene (grob) abgefangen werden, damit nichts kaputt geht. Natürlich ist es sinnvoll, Entstörung und Entprellen über ein passendes Filter unter einen Hut bringen. Trotzdem sind das völlig verschiedene Ursachen, die bei der Auslegung zu berücksichtigen sind.
Das mit der Flanken erkennung habe ich hin bekommen. Nun müsste ich das Signal auswerten. Wie programmiere ich das nun, dass das Programm erkennt wenn der Taster nur 0,5s lang gedrückt wurde? Beispiel: Wenn der Taster nur 0,5s lang gedrückt wurde soll eine LED ein oder aus geschaltet werden. Wenn der Taster länger als 0,5s gedrückt wird soll die LED gedimmt werden. Wie geht das? Danke!!
Wolfgang schrieb: > Lothar M. schrieb: >> Dann übersieht man aber auch, dass das, was man da zufällig gesehen hat, >> nur ein 10us langer Störimpuls war, auf den man besser nicht reagiert >> hätte... > Ein 10µs langer Störimpuls hat aber nichts mit Entprellen, sondern mit > Störunterdrückung zu tun. Das sollte man doch auseinander halten und > dann auch beim Namen nennen. Ich schage mit dieser Entprellungs-Klappe aber ganz einfach 2 Fliegen. Oder andersrum: ich muss mich um solche EMV-Impulse nicht extra kümmern. Das macht die Entprellung kostenlos nebenher mit... Helpme91 schrieb: > Wie geht das? Dafür brauchst du jetzt erst mal keine Flankenauswertung, sondern lediglich einen Zähler, der z.B. alle 10ms um 1 hochgezählt wird. Und immer wenn der Taster nicht betätigt ist, wird der Zähler auf 0 gesetzt. Wenn der Taster also betätigt wird, läuft der Zähler hoch, und wenn er 50 erreicht, dann fängst du an zu dimmen. Wenn der Taster dann wieder nicht betätigt ist, siehst du nach dem Zählerstand. Ist der zwischen 5 und 49, dann hast du einen entprellten Tastendruck zum Schalten. Viele Worte und doch nur ein paar Zeilen C-Code.... Pseudo-Code:
1 | if (10ms_vorbei) { |
2 | zaehler++; |
3 | if (taster_gedrueckt()) { |
4 | if (zaehler>50) { |
5 | dimmerwert_aendern(); |
6 | zaehler=50; // Zähler vor Überlauf sichern |
7 | }
|
8 | }
|
9 | else { // Taster nicht gedrückt ODER gerade losgelassen |
10 | if (zaehler>5 && zaehler<=50) { |
11 | ein_aus_schalten(); |
12 | }
|
13 | zaehler=0; |
14 | }
|
15 | }
|
Dieser Code läuft im Idealfall in der Mainloop, die im Idealfall wieder weniger als 10ms zum einmaligen Durchlluf braucht. Wer das aus irgendwelchen Gründen nicht hinbekommt (z.B. weil der Begriff Zustandsautomat noch unbekannt ist), der lässt das Ding im Timerinterrupt laufen...
:
Bearbeitet durch Moderator
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.