mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Tasterabfrage fallende Flanke


Autor: Max Berg (maxberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi!

Eine Frage: Gibt es eine Möglichkeit an einem Port (bei mir PIC16F887, 
PORTA, PORTB, egal) abzufragen ob ein Taster losgelassen wurde (das 
heißt er muss schon gedrückt werden, nur möchte ich die fallende Flanke 
dedektieren)

Falls das jetzt nicht so verständlich war^^:

Ich drücke einen Taster und möchte, dass das dafür bestimmte Ereignis 
erst beim loslassen eintritt...
Und das eben ohne Interrupt!

Danke und liebe Grüße

Max Berg

Autor: irgendwer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vorhergender Zustand high -> neuer Zustand low?
wo ist das Problem?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sicher gibts das.
Ist genau die Umkehrung dessen, was du tun würdest, wenn du auf 
steigende Flanke testen willst.

> Und das eben ohne Interrupt!
So einen Taster frägt mann sinnigerweise eh nicht mit einem Interrupt ab 
(es sei denn man muss den µC aus dem Sleep rausholen) sondern mit einem 
Timerinterrupt. Denn Flanke abfragen ist eine Sache - Taste entprellen 
eine andere. Und das geht mit Polling in einem Timer in einer Interrupt 
Funktion am allereinfachsten. Vor allen Dingen weil in den meisten 
Programmen sowieso so ein zyklischer Zeitgeber für immer wiederkehrende 
Aufgaben gebraucht wird.

Autor: Max Berg (maxberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja ich möchte zuerst schauen dass er gedrückt wird! (Er ist standart 
mäßi auf low..)

Um genau mein Problem zu beschreiben... Ich möchte einen Taster drücken 
um daten zu senden... Da wenn ich den taster drücke aber mit 31,25khz 
daten fließen und ich nicht soooo kurz drücken kann^^ möchte ich halt 
dass bei loslassen des tasters gesendet wird (der moment des loslassens 
ist so kurz das dies kein problem darstellt)

ich hoffe ich erkläre verständlich^^

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und das eben ohne Interrupt!
Das heißt dann Polling. Du mußt den Taster zyklisch abfragen, und einer 
Variable zuweisen. Und wenn die Variable 1 ist, dein Portpin aber 0, 
dann hast du eine fallende Flanke:
   :
   char taster, taster_alt;

   :
   while(1) {
     taster = portpin_einlesen();
     :
     if(taster==0 && taster_alt==1) {
        fallende_flanke();
     }
     :
     taster_alt = taster;
   }

Kompakter ists so:
   :
   char taster, taster_alt;

   :
   while(1) {
     taster = portpin_einlesen();
     :
     if((taster!=taster_alt) && !(taster_alt=taster)) {
        fallende_flanke();
     }
     :
   }

Autor: Max Berg (maxberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja pollen tu ich eh... aber ich müsste halt zuerst auf high abfragen und 
dann gleich auf low... ob sie losgelassen wurde!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Max Berg wrote:
> Naja ich möchte zuerst schauen dass er gedrückt wird! (Er ist standart
> mäßi auf low..)
>
> Um genau mein Problem zu beschreiben... Ich möchte einen Taster drücken
> um daten zu senden... Da wenn ich den taster drücke aber mit 31,25khz
> daten fließen und ich nicht soooo kurz drücken kann^^

Diese Aussage sagt mir, dass du momentan nicht auf die steigende Flanke 
testest, sondern auf einen High-Pegel.

> möchte ich halt
> dass bei loslassen des tasters gesendet wird (der moment des loslassens
> ist so kurz das dies kein problem darstellt)

So ein Quatsch. Der Moment des Loslassens ist genauso lang wie der 
Moment des Drückens. Nur dass du in einem Fall eine steigende Flanke 
hast und im anderen eine fallende Flanke (oder umgekehrt, je nachdem wie 
der Taster angeschlossen ist)

Aber wie gesagt: Flankenerkennung ist eine Sache - Entprellung eine 
andere. Selbst wenn du die Taste nur einmal drückst oder loslässt, für 
den µC sind das jedesmal ein paar Flankenwechsel!

Autor: Max Berg (maxberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
opala hab high pegel mit steigender flanke verwechselt! tut mir leid...
also ich möchte wissen wenn der taster losgelassen wird (dieser muss 
aber zuvor gedrückt sein)

also ich drücke, dann taster is high, und wenn ich loslasse dann sol 
gesendet werden...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Max Berg wrote:
> opala hab high pegel mit steigender flanke verwechselt! tut mir leid...
> also ich möchte wissen wenn der taster losgelassen wird (dieser muss
> aber zuvor gedrückt sein)
>
> also ich drücke, dann taster is high, und wenn ich loslasse dann sol
> gesendet werden...

Wie Lothar schon sagte:
Du musst dir immer den vorhergehenden Zustand der Taste merken. Die 
vergleichst du mit dem aktuellen Zustand und wenn die von gedrückt auf 
nicht gedrückt wechselt, hast du deine Flanke erkannt.

Autor: Max Berg (maxberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey Danke! Ja das ist gut!

Hmm jetzt ist das problem das ich das bei ca 50 tastern machen muss^^ 
das werden viele variablen^^

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Max Berg wrote:
> Hey Danke! Ja das ist gut!
>
> Hmm jetzt ist das problem das ich das bei ca 50 tastern machen muss^^
> das werden viele variablen^^

Oooch. Das Array ist schon erfunden.

Autor: willi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Hmm jetzt ist das problem das ich das bei ca 50 tastern machen muss^^
>>das werden viele variablen^^

naja 7 Byte, und dann sind noch 4 bit übrig, die welt is das nich

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
50 Bytes im RAM sind selten ein Problem, aber solltest Du von der 
Methode "Codeteil schreiben, danach 1 mal kopieren und 49 mal pasten" 
Gebrauch machen, könntest Du eins mit dem Programmspeicher bekommen. 
Davon ist abzuraten. Wenn Du es "richtig" machen willst, dann mit einer 
Schleife von 0 ... 49, in der auf die Tastenvariablen indiziert 
zugegriffen wird (Array).

Autor: was-willst-du (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>ja pollen tu ich eh... aber ich müsste halt zuerst auf high abfragen und
>dann gleich auf low... ob sie losgelassen wurde!


tu es halt einfach

viel Spaß mit Midi

Autor: Max Berg (maxberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hehe stimmt midi^^

grins tja in assembler arrays?? Hab ich bis jetzt nicht gewusst aber 
vielleicht gibts ja bei google was^^

@willi
Stimmt ich kann ja in einer variable 7 bit setzten! auf die idee bin ihc 
garnicht gekommen! Danke dir!!

Danke überhauot an alle antworten

Autor: was-willst-du (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nimm 8 Bit in eine Variable, dann ist sie voll

Autor: Max Berg (maxberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
opala meinte 8 bit... (hab ein bissi wenig geschlafen heute^^)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Max Berg wrote:
> hehe stimmt midi^^
>
> grins tja in assembler arrays?? Hab ich bis jetzt nicht gewusst aber
> vielleicht gibts ja bei google was^^

:-)
Die Lehre daraus kann nur sein:
Wenn du bei deiner Frage was von Assembler gesagt hättest, ....

Aber auch dann: Arrays sind letztendlich in Assembler auch nur eine 
bestimmte Technik der Offsetberechnung in mehreren aufeinanderfolgend 
allokierten Bytes. Was anderes macht auch der Compiler nicht.

Autor: Max Berg (maxberg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl

Haha ja tut mir leid ich werd nächstes mal drauf achten^^ Ja ich arbeite 
in assembler^^ (frage mich zwar gerade warum weils in C eigentlich 
weniger zach wäre... aber man mag ja die herausforderung^^

Autor: Winfried (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke, du wirst hier irgendwo einen Code finden, wie man eine 
Tastaturmatrix abfragt. Das haben schon Millionen vor dir gemacht, ist 
eine Standard-Sache. Den nimmst du einfach und bist glücklich. Denn die 
meisten dieser Routinen entprellen, merken sich den Tastenzustand und 
können dir sagen, ob eine Taste gerade losgelassen oder gedrückt wurde.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.