mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einmalige Auswertung angeschlossener Tasten


Autor: TerraTux (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Codergemeinde,

ich hab vor ein paar Tagen den Einstieg in die Welt der µC
geschafft...kommt man heut ja fast nicht mehr drumherum, und es macht
auch Spaß :)

Zu meinem Problem:

in meinem "Herumspielprogramm" wird mit jedem Schleifendurchlauf die
Funktion getkey() aufgerufen, welche wiederum die Funktion keyhit()
aufruft die einen Status zurückgibt (0 wenn keine Taste gedrückt).

Ich möchte aber, dass wenn eine Taste gedrückt wird, der Status
geliefert wird, so wie es die Funktionen auch tun. Jedoch soll dieser
Status nur einmal geliefert werden. Solange die Taste gedrückt bleibt,
soll wieder 0 zurückkommen.

Kurzum: (bei jedem Aufruf von getkey() )
0
0
1  // hier eine Taste gedrückt
0
0
0  // hier mal wieder losgelassen
1  // erneut eine Taste gedrückt
0
...

Nun hab ich hier im Forum schon einiges gelesen, z.b. 2pol. Taster,
welche einmal den Interrupt auslösen und einen Port gegen Masse ziehen
etc... Aber ich hab hier das D06x von display3000.com (die keyboard.c
ist ursprünglich auch aus mitgeliefertem Quellcode), und die Taster
sind da von Haus aus an den Port D gelegt, ergo keine HW-Interrupts)

Irgendeine Idee? So wie die Funktion getkey() derzeit aufgebaut ist,
geht es nicht, das Signal wird trotzdem solange zurückgegeben wie die
Taste gedrückt ist.

Danke & Gruß,
TT

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
 bin selber noch neuling und kann nur erahnen, was in deinem Code
passiert.

Aber eine universelle (evtl. nicht die eleganteste) Lösung ist:
Wenn keyhit (o.Ä.) einen Wert zurückgibt, speichert es diesen auch für
sich selbst ab. Beim nächsten Aufruf, prüft es dann ob sich der Status
Quo im Vergleich zum abgelegten Wert geändert hat. Falls Ja, gibt es
den neuen Wert aus und ändert auch den abgelegten. Falls nicht, gibt es
FALSE (o.Ä.) aus.

Habe damit mal ein Flip-Flop gebaut. Bin aber pfiffigeren Ideen gerne
aufgeschlossen.

Autor: TerraTux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

genau das hab ich in der Funktion getkey() ja versucht zu
bewerkstelligen. Wenn ich eine Taste drücke, liefert getkey() einen
Wert. Dieser Wert soll aber nur einmal zurückgegeben werden, egal wie
lange ich drücke. Denn während ich drücke, wird getkey() immer und
immer wieder abgefragt.

Wenn Taste gedrückt, und die 'pressed' nicht gesetzt ist, setz
'pressed' und gib den Status der Taste zurück. Halte ich gedrückt,
ändert sich ja der Status nicht (v != KEY_NONE; also größer 0) und ist
'pressed' gesetzt (wird noch gedrückt und status wurde schon
zurückgegeben) gib wieder 0 zurück. Erst wenn keyhit 0 (KEY_NONE)
liefert und 'pressed' auf 1 steht, wird das wieder auf 0 gesetzt und
er kann den nächsten Tastendruck liefern.

Aber irgendwo schein ich hier einen Denkfehler zu haben.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werde mir deinen Beitrag nochmal durchlesen, wenn ich geschlafen habe.

Aber pauschal würde ich sagen der Denkfehler liegt bei dir :-)

Scherz beiseite, was ist den in 'pressed' abgelegt?

Autor: Sebastian Heyn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich löse sowas mit einer einfachen schleife nach der ausgabe. Leider
benutz ich nur BASCOM  aber das gleiche kannst du ja in c auch machen
Symbolisches beispiel

do
if getkey=keypressed then goto ausgabe
loop 'Hauptprogramm


ausgabe:
ausgabeaufdisplayfunktion
do
loop until 'keynotpressed'
return


wenn es nötig ist dass das hauptprogramm nach der ausgabe weiter lübbt
kannst du ja mit einem statusbit arbeiten

' pinb.x=0 -> taste gedrückt

do
if pinb.x=0 and status=0 then gosub ausgabe
if status=1 and pinb.x=1 then status=0
loop
end

ausgabe:
status=1 'eben wurde eine taste gedrückt
ausgabeaufdisplayfunktion
return

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau Dir das mal an (AVR-GCC-Tutorial):


http://www.mikrocontroller.net/articles/Entprellung


Peter

Autor: TerraTux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo und Danke für die Antworten...

@Peter:
Eine Entprellung ist eigentlich genau das was ich eben nicht brauch,
denn auch dort wird der Status 'Taste gedrückt' geliefert, solange
ich den Taster auch gedrückt halte, mal unabhängig davon ob dieser auch
wirklich prellt oder nicht.

Ich hoff ich bekomm es nochmal etwas durchsichtiger erklärt...

Mit jedem durchlauf des Hauptprogramms wird getkey() aufgerufen. Drück
ich eine Taste, liefert getkey() irgendeinen Wert, welcher der
gedrückten Taste entspricht...das Programm läuft weiter. Beim nächsten
durchlauf, wird getkey() wieder aufgerufen, hier aber soll wieder 0
geliefert werden , das auch wenn die Taste noch gedrückt ist, und erst
dann wieder einen Tastenwert liefern, wenn zwischenzeitlich mal keine
Taste gedrückt war. So gesehen eigentlich nur einen Impuls...


ODER, meinst Du ich kann mit etwas umdenken diese Entprellroutinen
dafür missbrauchen?

Gruß,
TT

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Mit jedem durchlauf des Hauptprogramms wird getkey() aufgerufen.
> Drück ich eine Taste, liefert getkey() irgendeinen Wert, welcher
> der gedrückten Taste entspricht...das Programm läuft weiter. Beim
> nächsten durchlauf, wird getkey() wieder aufgerufen, hier aber soll
> wieder 0 geliefert werden , das auch wenn die Taste noch gedrückt
> ist,

Genau das macht die
get_key_press
Funktion im angegebenen Link

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@TerraTux

"Eine Entprellung ist eigentlich genau das was ich eben nicht
brauch,"


Dann wärst Du aber der erste.

Entprellung braucht man immer, wenn es ums Einlesen mechanischer
Kontakte geht.

Und die Flankenerkennung braucht man auch oft, daher ist die eine
Codezeile dafür gleich mit drinne:
key_press |= key_state & i;    // 0->1: key press detect


Peter

Autor: TerraTux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ah...also hab ich doch was falsch verstanden. :)

Gut dann werd ich mich nach Arbeit mal weiter damit beschäftigen.
Ich dank euch erstmal, und werd mich ggf. nochmal melden.

Gruß,
TT

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.