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
vorhergender Zustand high -> neuer Zustand low? wo ist das Problem?
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.
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^^
> 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 | }
|
ja pollen tu ich eh... aber ich müsste halt zuerst auf high abfragen und dann gleich auf low... ob sie losgelassen wurde!
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!
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...
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.
Hey Danke! Ja das ist gut! Hmm jetzt ist das problem das ich das bei ca 50 tastern machen muss^^ das werden viele variablen^^
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.
>>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
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).
>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
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
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.
@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^^
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.