mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Einfaches Problem bei Tastendruckerkennung - bitte um Hilfe


Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

bitte nehmt es mir nicht übel, daß ich etwas penetrant werde. Aber
meine Laune wird immer schlechter, weil ich es einfach nicht
hinbekomme.

Mit Peter Dannegers universeller Tastenabfrage möchte ich erkennen, ob
zwei Tasten gleichzeitig gedrückt sind, zusätzlich zur funktionierenden
Prüfung auf kurzen und langen Tastendruck (mit Wiederholung).

Das Problem und den Code findet ihr hier:
http://www.mikrocontroller.net/forum/read-4-310276.html#new

Ich verstehe nicht, an welcher Stelle ich einhaken muß, um diesen
Zustand von den anderen zu unterscheiden. Ich habe auch schon versucht,
direkt am key_state anzusetzen und ihn 'noninvasiv' auszulesen
uint8_t get_key_state( uint8_t key_mask )

{

  cli();  // disable global interrupts

  key_mask &= key_state;  // read key(s)

  sei();  // enable interrupts globally, regardless of previous state!

  return key_mask;

}

also ohne ihn zurückzusetzen. Das hat zur Folge, daß unmittelbar nach
der Erkennung eine der anderen Funktionen greift.

Wenn ich es anders probiere
// turn tv off, when both buttons pushed simultaneously

if( get_key_state( 1<<BUTTON_A) && get_key_state( 1<<BUTTON_B)) 

{

  cli();

  rc5_send_code( toggle & 1, RC5ADDR_TV1, 12 );

  key_state ^= 1<<BUTTON_A || 1<<BUTTON_B; // clear key(s)

  sei();

}

also key_state erst zurücksetze, wenn beide Tasten als gleichzeitig
gedrückt erkannt werden, funktioniert es anscheinend.

Aber die Wiederholfunktion ist außer Gefecht gesetzt.

Wenn jemand von Euch mich auf den Lösungsweg zu hinzuweisen, und zu
erläutern, wie man geschickt ansetzen kann, wäre ich echt dankbar.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ...1<<BUTTON_A || 1<<BUTTON_B;
sicher, dass da nicht ein bitweises "|" hinsoll?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ne Shift-Taste geht, hab ich ja schon gepostet.

Hast Du Dir überhaupt mal ein Bedienkonzept ausgedacht ?

Eine Shift-Taste, die außerdem allein was machen soll, wer soll da denn
noch durchblicken.

Es sei denn, Du willst mit Absicht, daß kein anderer außer Dir das
Gerät bedienen können soll.

Ein MC kann nicht erraten, was Du erreichen willst. Es muß immer eine
eindeutige Zustandsabfolge geben, die unterschiedlich von allen anderen
Abfolgen ist.

In der Regel erwartet der Bedienende auch ein direktes Feedback, wenn
er was drückt.
Eine Reaktion erst nach 3 Tasten eignet sich bestenfalls als
Kodeschloß, oder um den Bedienenden zur Weißglut zu bringen (dann aber
auch Vandalensicherheit beachten).


Überlege Dir erstmal ein vernünftiges Bedienkonzept und dann kann man
anfangen zu programmieren.


Peter

Autor: oto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
genau

Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ johnny m.:
Danke für den Hinweis, ich meinte das bitweise |. Mal sehen, ob das
hilft..

@Peter:
Deine Aussage überrascht mich, weil Du normalerweise immer konstruktive
Kritik übst, die sich auf's angesprochene Problem bezieht.

Aber wir verstehen wir uns wohl nur miß - meine Anforderungen nochmal
ausformuliert, in der Codesammlung steht's im Prinzip schon mit
Codeschnipseln:

An einer Minimalfernbedienung sind zwei Tasten, und 5 Funktionen.
Bedienkonzept:

Taste kurz drücken wechselt das Programm (bzw. schaltet ein).
Lang drücken ändert Lautstärke, gedrückt halten wiederholt.
Beide Tasten gleichzeitig gedrückt: Fernseher schaltet aus.

Die Bedienung und das 'Konzept' (so komplex ist es ja nicht) ist
nicht das Problem, da steige ich durch.
Dein Code läuft prima, und bis aufs Ausschalten klappt es wunderbar,
und ich verstehe in etwa, wie es funktioniert.
Nur verstehe ich leider nicht, bei welchem Zustand ich im Code einhaken
kann, damit das Programm das tut, was ich möchte; aber das habe ich ja
auch schon geschrieben.

Ich weiß nicht, wie viele hier im Forum Deinen Code so aktiv im Kopf
haben wie Du, deswegen möchte ich Dich bitten, mir zu erklären, wie ich
das Problem angehe.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Beide Tasten gleichzeitig gedrückt: Fernseher schaltet aus."

Dann hast Du aber beim Drücken der 1. Taste ne Aktion, denn exakt
gleichzeitig Drücken geht nicht.
if((key_state & (1<<KEY1|1<<KEY2)) == (1<<KEY1|1<<KEY2)){
  get_key_press( 1<<KEY1|1<<KEY2 ); // clear bits
  // hier Fernseher aus
} 


Peter

Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter, vielen Dank!

Mir ist inzwischen aufgefallen, daß das Nichtfunktionieren der
Wiederholfunktion am sleep mode liegt, und nicht an der Prüfung auf
gleichzeitigen Tastendruck.

Was genau die Ursache ist, konnte ich aber noch nicht feststellen.

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.