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


von duundich (Gast)


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
1
uint8_t get_key_state( uint8_t key_mask )
2
3
{
4
5
  cli();  // disable global interrupts
6
7
  key_mask &= key_state;  // read key(s)
8
9
  sei();  // enable interrupts globally, regardless of previous state!
10
11
  return key_mask;
12
13
}

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

Wenn ich es anders probiere
1
// turn tv off, when both buttons pushed simultaneously
2
3
if( get_key_state( 1<<BUTTON_A) && get_key_state( 1<<BUTTON_B)) 
4
5
{
6
7
  cli();
8
9
  rc5_send_code( toggle & 1, RC5ADDR_TV1, 12 );
10
11
  key_state ^= 1<<BUTTON_A || 1<<BUTTON_B; // clear key(s)
12
13
  sei();
14
15
}

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.

von johnny.m (Gast)


Lesenswert?

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

von Peter D. (peda)


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

von oto (Gast)


Lesenswert?

genau

von duundich (Gast)


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.

von Peter D. (peda)


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.
1
if((key_state & (1<<KEY1|1<<KEY2)) == (1<<KEY1|1<<KEY2)){
2
  get_key_press( 1<<KEY1|1<<KEY2 ); // clear bits
3
  // hier Fernseher aus
4
}


Peter

von duundich (Gast)


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.

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.