Forum: Mikrocontroller und Digitale Elektronik 2-Tasten Steuerung


von climbah (Gast)


Lesenswert?

Hallo Leute ,
Ich Habe Da Ein Kleines Problemchen. Ich entwickle zurzeit ein kleines 
Programm mit einer 2-tastensteuerung

 Taste 1 Increment
 Taste 2 Decrement
 Und Taste 1 + 2 Bestätigen

Anbei meine Tastenlogik, welche beim Bestätigen überhaupt nicht greifft. 
Ich weiss wirklich nicht wie ich das anders lösen kann, denn eine
Taste wird immer eher gedrückt sein.

Schön wär wenn ich da irgendwie warten könnte.
1
  If Keypressed = 1 Then
2
    If Pind.5 = 0 And Pind.6 = 0 Then
3
      Keydifference = Syssecelapsed(keydown)
4
      If Keydifference >= 3 Then
5
        Keypressed = 0
6
        Keydown =        If _mode <> 2 Then _mode = 1
7
      Else
8
        Call Confirm
9
        Keypressed = 0
10
      Keydown = 0
11
      End If
12
    End If
13
  Else
14
    If Pind.5 = 0 And Pind.6 = 0 Then
15
      Keydown = Syssec()
16
      Keypressed = 1
17
    Else
18
      Debounce Pind.5 , 0 , Increment , Sub
19
      Debounce Pind.6 , 0 , Decrement , Sub
20
    End If
21
  End If

Grüsse Climbah

von was-willst-du (Gast)


Lesenswert?

Wie wärs mit

Taste 1 gedrückt incr

Taste 2 gedrückt decr

Taste 1 und 2 gleichzeitig gedrückt incr oder decr rückgängig machen und 
bestätigen auslösen ?

von climbah (Gast)


Lesenswert?

Das würde ja heissen ich müsste ne kleine History betreiben um zu wissen 
welcher Knopf zuletzt gedrückt würde.

Gibt es den keine Möglichkeit bei der Zeile
1
If PIND.5 = 0 And PIND.6 = 0 Then

etwas wie Debounce, aber eben nur über 2 Tasten hinweg zu realisieren?

von Oha (Gast)


Lesenswert?

So ganz nebenbei ging das Entprellen vergessen...

von climbah (Gast)


Lesenswert?

Ich weiss dass ich eine einzige Taste entprellen kann (debounce). Wenn 
du mir aber sagen kannst wie ich 2 Tasten miteinander gleichzeitig 
entprellen kann, bitte teil mir das mit.

Grüsse climbah

von was-willst-du (Gast)


Lesenswert?

>If PIND.5 = 0 And PIND.6 = 0 Then

Ist schon nicht schlecht gedacht, aber diese Tasten werden doch von 
Menschen (?) gedrückt. Was ist da schon gleichzeitig? Die Tasten werden 
immer nacheinander erkannt werden.


@oha  Stimmt, steht nicht expilizit da, aber "Taste gedrückt" sollte 
schon sicher erkannt sein (entprellt).

von climbah (Gast)


Lesenswert?

Ja die Tasten werden von Menschen gedrückt, da gibt es dann auch wieder 
2mögliche Reihenfolgen, was heissen würde ich müsste beide Wege 
abdecken.

Aber reicht denn ein
1
If PIND.5 = 0 Then
2
     If PIND.6 = 0 Then
oder muss ich da noch ein Wait dazwischentun, wenn ja wie lange? 25, 
50ms?

Danke für eure Antworten
climbah

von Hannes Lux (Gast)


Lesenswert?

Ohne zyklisches Abfragen des Tastenports (durch Timer getaktet) wüsste 
ich auch keine "schnelle Lösung".

Ansonsten:
In Timer-ISR:
- Tastenport einlesen und unbenutzte Bits ausblenden
- mit gemerktem alten Wert vergleichen
  - bei Gleichheit Prellzähler runterzählen
  - Bei Ablauf des Prellzählers Merker für neuen, gültigen Tastendruck
    setzen
  - bei Unterschied Prellzähler auf Startwert setzen
- neuen Wert als alten Wert für nächsten Vergleich sichern

In Mainloop:
- Wenn Merker gesetzt, dann alten Tastenwert auswerten und Merker 
löschen
  - wenn $bf, dann Decrement
  - wenn $df, dann Increment
  - wenn $9f, dann übernehmen
  - wenn $ff, dann nix tun
  - andere Werte dürfte es aufgrund der Ausblendung der unbenutzten Bits
  nicht geben

Noch besser ist der 8-Tasten-Algorithmus von Peter Dannegger 
(Codesammlung, Stichwort "Bulletproof"), doch er ist schwerer zu 
verstehen und bringt in Deinem Fall keine echten Vorteile, ich werde es 
mir also nicht antun, Dir den verständlich zu machen. ;-)

...

von Peter D. (peda)


Lesenswert?

Du brauchst erstmal ne ordentliche Entprellroutine, die Tasten 
gleichzeitig und unabhängig entprellt.
Das Bascom-Debounce ist blockierend und kann das daher nicht.

Beitrag "Universelle Tastenabfrage"

Damit kannst Du auch Gleichzeitigkeit erkennen, wenn die Tasten 
innerhalb des Zeitintervalls für long-press gedrückt werden.

Einfacher ist aber, unterschiedliche Aktionen bei kurz oder lang Drücken 
einer Taste zum machen (für den Benutzer leichter verständlich).


Peter

von Hannes Lux (Gast)


Lesenswert?

Moinmoin Peter...

...

von climbah (Gast)


Lesenswert?

Ich danke euch beiden recht herzlich für die Unterstützung, ich werde 
mir den Code mal ansehen und versuchen umzusetzen, in Bascom natürlich 
:)

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.