Forum: Mikrocontroller und Digitale Elektronik Taster an uC mit Doppelbelegung


von Markus Reichert (Gast)


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

von Sebastian (Gast)


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

von Andreas H. (asmhesse)


Lesenswert?


von Sebastian (Gast)


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?

von Rahul (Gast)


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).

von Markus Reichert (Gast)


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.

von Rahul (Gast)


Lesenswert?

Wenn du meinst...

von Markus Reichert (Gast)


Lesenswert?

@Rahul

hast du eine andere, bessere Idee? :-)

von Peter D. (peda)


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

von Rahul (Gast)


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?

von Peter D. (peda)


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

von Markus Reichert (Gast)


Lesenswert?

er soll noch ein zweistelliges Display ansteuern und einen Drehregler
bzw. Joystick auswerten.

Das wars dann auch schon. :-)

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
Noch kein Account? Hier anmelden.