Forum: Mikrocontroller und Digitale Elektronik Steigende und fallende Flanke in c


von Helpme91 (Gast)


Lesenswert?

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!

von CCCCCC (Gast)


Lesenswert?

>Die programmierung erfolgt in C

Und was hast du selbst schon an Software geschrieben?

von Forist (Gast)


Lesenswert?

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.

von Der Andere (Gast)


Lesenswert?

Such mal nach
"entprellen"

von Mark B. (markbrandis)


Lesenswert?

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
von Wolfgang (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Chriss (Gast)


Lesenswert?

Entprellen ist was ANDERES als "alle 20ms mal nachschauen"...

Genau solche SW findet man in immer mehr kaufbaren Geräten... muss ich 
leider feststellen.

von Wolfgang (Gast)


Lesenswert?

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.

von Jan (Gast)


Lesenswert?

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

von Stefan F. (Gast)


Lesenswert?

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.

von prellen-puls (Gast)


Lesenswert?

>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?

von Jan (Gast)


Lesenswert?

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

von Wolfgang (Gast)


Lesenswert?

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.

von Helpme91 (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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