mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 2-Tasten Steuerung


Autor: climbah (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
  If Keypressed = 1 Then
    If Pind.5 = 0 And Pind.6 = 0 Then
      Keydifference = Syssecelapsed(keydown)
      If Keydifference >= 3 Then
        Keypressed = 0
        Keydown =        If _mode <> 2 Then _mode = 1
      Else
        Call Confirm
        Keypressed = 0
      Keydown = 0
      End If
    End If
  Else
    If Pind.5 = 0 And Pind.6 = 0 Then
      Keydown = Syssec()
      Keypressed = 1
    Else
      Debounce Pind.5 , 0 , Increment , Sub
      Debounce Pind.6 , 0 , Decrement , Sub
    End If
  End If

Grüsse Climbah

Autor: was-willst-du (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: climbah (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
If PIND.5 = 0 And PIND.6 = 0 Then

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

Autor: Oha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ganz nebenbei ging das Entprellen vergessen...

Autor: climbah (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: was-willst-du (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: climbah (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
If PIND.5 = 0 Then
     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

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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. ;-)

...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moinmoin Peter...

...

Autor: climbah (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 
:)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.