Tasterabfrage fallende Flanke

OP #1174889
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
#1174900
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.
OP #1174906
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^^
Moderator (Firma: Titel) Persönliche Seite #1174909
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
   }
#1174923
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!
#1174974
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.
Gast #1175012
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).
OP #1175041
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
#1175052
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.
Gast #1175355
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren