Steigende und fallende Flanke in c

Gast #4382293
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!
Gast
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.
Gast
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.
Gast
Entprellen ist was ANDERES als "alle 20ms mal nachschauen"...

Genau solche SW findet man in immer mehr kaufbaren Geräten... muss ich 
leider feststellen.
Gast
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.
Gast
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
Gast
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.
Gast
>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?
Gast
@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!
Gast
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.
Gast
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!!
Moderator (Firma: Titel) Persönliche Seite
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...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.