mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Unterscheidung, wie oft eine Taste gedrückt wird?


Autor: H. G. (ledi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Ich möchte mit einer Taste bestimmte Funktionen auslösen.
D.h:  Taste = 1x gedrückt --> Funktion1
      Taste = 2x gedrückt --> Funktion2
while(1)
{
   if (Taste == 8 && count == 1)
   {
      ...mach dies
   }
   if (Taste == 8 && count == 2)
   {
      ...mach das
   }
}

usw...

Die Tastenauswertung passiert auf der Senderseite. Auf der 
Empfängerseite erhalte ich also den Wert der gedrückten Taste (Taste 1 = 
1, Taste 2 = 2 usw..)
Wird z.B. die Taste 1 gedrückt, so ist der Wert == 1, solange bis eine 
andere Taste gedrückt wird.

Wie kann ich das lösen?

Autor: Sauger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

Heimo G. schrieb:
> Wird z.B. die Taste 1 gedrückt, so ist der Wert == 1, solange bis eine
> andere Taste gedrückt wird.
>
> Wie kann ich das lösen?

geht nicht, die Tasten müssten gedrückt/losgelassen melden.

MfG

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heimo G. schrieb:


> Wie kann ich das lösen?

> Wird z.B. die Taste 1 gedrückt, so ist der Wert == 1, solange bis eine
> andere Taste gedrückt wird.

Solange dir der Tastenauswerter seine Ergüsse nicht in anderer Form zur 
Verfügung stellt - gar nicht.

Autor: H. G. (ledi)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe die Möglichkeit, das über einen Int. zu lösen.

Bei einem Tastendruck erhalte ich vom IRQ-Pin des Funkmoduls einen 
Interrupt. In der ISR wird der Wert der Taste der Variablen "Taste" 
zugewiesen.

Meine Idee war hier eine Variable "count" zu inkrementieren und diese 
bei der Tastenabfrage mit abzufragen.
Hier habe ich aber das Problem, das der Interrupt bei gedrückter Taste 
alle 40ms ausgelöst wird.
D.h. ein Tastendruck = ca. 5 bis 8 Interrupts.

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie kann ich das lösen?

Z.B. so:

Entprellung (Taste entprellen)
Zähler (Anzahl Tastendrücke)
Timeout (nachtriggerbar)

Entprellter Tastendruck erhöht Zähler und startet Timeout.

Abgelaufener Timeout kopiert Zähler und löscht ihn dann für die nächste 
Orgie, verzweigt dann anhand der Zählerkopie zum entsprechenden Job.

Hauptaufgabe ist (wie immer): Zerlegen des Problems in kleine 
überschaubare Problemchen, die einzeln gelöst werden können.

...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heimo G. schrieb:
> Ich habe die Möglichkeit, das über einen Int. zu lösen.
>
> Bei einem Tastendruck erhalte ich vom IRQ-Pin des Funkmoduls einen
> Interrupt. In der ISR wird der Wert der Taste der Variablen "Taste"
> zugewiesen.
>
> Meine Idee war hier eine Variable "count" zu inkrementieren und diese
> bei der Tastenabfrage mit abzufragen.
> Hier habe ich aber das Problem, das der Interrupt bei gedrückter Taste
> alle 40ms ausgelöst wird.
> D.h. ein Tastendruck = ca. 5 bis 8 Interrupts.

Das wird dann aber aufwändig.
Denn du musst den Fall "dauerhaft gedrückte Taste" vom Fall "Taste 
gedrückt - losgelassen - wieder gedrückt" unterscheiden können.

Und die einzige Möglichkeit wie du das tun kannst, ist es wenn nach den 
erwarteten 40ms (und Vielfachen) nach einem Tastendruck, der Interrupt 
ausbleibt. Dann weißt du, dass die Taste wieder losgelassen wurde. Das 
ganze wird also eine ekelhafte Timingsache, nur um das Drücken und 
Loslassen einer Taste du detektieren.

Autor: Sauger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin,

dann wird dein Sender Pulsen, ähnlich einer Fernbedienung vom TV/Radio
... also bleibst beim geht nicht.

MfG

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.