www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Taster an uC mit Doppelbelegung


Autor: Markus Reichert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte folgendes Realisieren: ein Taster mit Doppelbelegung mit
Hilfe von unterschiedlichen Betätigungsdauern.

D.h. wenn ich kurz drücke soll eine andere Funktion aufgerufen werden,
als wenn ich 5 Sek. drücke. Kann man so etwas realisieren? Als Anfänger
habe ich leider keine Ahnung, wie so etwas gehen könnte.

Wäre super, wenn mir jemand einen Tip geben könnte.

Danke und Gruß
Markus

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Auf den externen Interrupt-Pin legen. Auf beide Flanken triggern. Beim
DOWN Timer starten, beim UP auswerten. Zu kurze Werte verwerfen wg.
Tastenprellung.

Gruß,
Sebastian

Autor: Andreas Hesse (asmhesse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andreas,

finde ich für diesen Zweck zu kompliziert.

Wenn Markus das so macht, wie ich beschrieben habe, wertet er einfach
Zeiten unter, sagen wir, 1/50s (ausprobieren!) gar nicht aus und gut
ist. Ein lebender user wird sicher auf jeden Fall länger drücken,
Prellen ist kürzer.

PseudoCode:

if zeit>1s
{tue dies}
else if zeit<1/50s
{tue das}

Oder habe ich was übersehen?

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Den Taster muß man eh entprellen (Interrupt ist dafür eigentlich zu
schade).
Wenn man also den Zustand des Tasters sowieso regelmässig abfregt, kann
man auch feststellen, ob er länger als eine bestimmte Zeit betätigt
wurde.
Wenn man einen Taster alle 10-100ms abfragt reicht es in der Regel
(alles über 100ms würde das System zu sehr verlangsamen).

Autor: Markus Reichert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank erstmal für die konstruktiven Vorschläge.

Ich hänge an den uC eine Folientastatur mit ca. 15 Tasten an und habe
vor, das ganze eigentlich über Interrupt zu steuern.

Das Gerät wird ganz einfach: Taste X drücken, Befehl über RX/TX
versenden. Eine Taste soll dabei eine Doppelfunktion beinhalten: d.h.
kurz drücken ein anderer Befehl wie lang drücken. Aber das betrifft nur
eine einzige Taste.

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du meinst...

Autor: Markus Reichert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Rahul

hast du eine andere, bessere Idee? :-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Markus

"Ich hänge an den uC eine Folientastatur mit ca. 15 Tasten an"

Kein Problem, einfach im Interrupt 2 Ports einlesen und alle Variablen
16-Bittig machen:

[C ]
...
u16 i;
...
i = key_state ^ ~(KEY_PIN0 + (KEY_PIN1 << 8));
...
[/C]


Peter

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja. Oben schon beschrieben. Andreas Hesse hat das auch schon
verlinkt...
Tasturen fragt man periodisch ab (Timer-Interrupt). Das belastet den
Controller fast überhaupt nicht und funktioniert mit jedem Port.
Vor allem kann man die Funktion dann aber auch auf andere Tasten im
Bedarfsfall problemlos übertragen.
Übrigens ersparst du dir mit dem periodischen Abfragen auch die
Reaktion auf den Interrupt und damit auf dessen Flanke.
Sonst ist es nämlich die gleiche (wenn nicht sogar die selbe)
Funktion.
Was macht dein Controller denn sonst noch bzw. soll er noch machen?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Sebastian

"finde ich für diesen Zweck zu kompliziert."


Der Code ansich ist sehr effizient, sowohl im Flash/SRAM-Verbrauch als
auch hinsichtlich CPU-Belastung. Das wird erreicht, indem er alle Bits
(Tasten) parallel behandelt.


Er scheint nur kompliziert, bis man ihn mal für eine Taste
durchgespielt und verstanden hat.


Peter

Autor: Markus Reichert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
er soll noch ein zweistelliges Display ansteuern und einen Drehregler
bzw. Joystick auswerten.

Das wars dann auch schon. :-)

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.