2-Tasten Steuerung

Gast #1207030
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
Gast #1207045
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?
Gast #1207055
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).
Gast #1207065
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
Gast #1207081
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. ;-)

...
#1207082
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

Antwort schreiben

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.

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.