Taster an uC mit Doppelbelegung

Gast #339060
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
Gast #339061
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
Gast #339063
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?
Gast #339064
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).
Gast #339065
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.
#339068
@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
Gast #339069
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?
#339070
@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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 20 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.