Forum: Mikrocontroller und Digitale Elektronik Tasterabfrage fallende Flanke


von Max B. (maxberg)


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

von irgendwer (Gast)


Lesenswert?

vorhergender Zustand high -> neuer Zustand low?
wo ist das Problem?

von Karl H. (kbuchegg)


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.

von Max B. (maxberg)


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

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


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:
1
   :
2
   char taster, taster_alt;
3
4
   :
5
   while(1) {
6
     taster = portpin_einlesen();
7
     :
8
     if(taster==0 && taster_alt==1) {
9
        fallende_flanke();
10
     }
11
     :
12
     taster_alt = taster;
13
   }

Kompakter ists so:
1
   :
2
   char taster, taster_alt;
3
4
   :
5
   while(1) {
6
     taster = portpin_einlesen();
7
     :
8
     if((taster!=taster_alt) && !(taster_alt=taster)) {
9
        fallende_flanke();
10
     }
11
     :
12
   }

von Max B. (maxberg)


Lesenswert?

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

von Karl H. (kbuchegg)


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!

von Max B. (maxberg)


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

von Karl H. (kbuchegg)


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.

von Max B. (maxberg)


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

von Karl H. (kbuchegg)


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.

von willi (Gast)


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

von Gast (Gast)


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

von was-willst-du (Gast)


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

von Max B. (maxberg)


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

von was-willst-du (Gast)


Lesenswert?

nimm 8 Bit in eine Variable, dann ist sie voll

von Max B. (maxberg)


Lesenswert?

opala meinte 8 bit... (hab ein bissi wenig geschlafen heute^^)

von Karl H. (kbuchegg)


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.

von Max B. (maxberg)


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

von Winfried (Gast)


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.

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.