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
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
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?
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).
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.
@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
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?
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.