mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Dannegger-Entprellung anpassen


Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe gerade die Dannegger-Super-Entprellung auf meinem uC 
implementiert.
Funktioniert auch gut!

Es ist hier ja so, dass wenn man die Taste drückt, der Tastendruck erst 
registriert wird, wenn man wieder losgelassen hat.

Gibt es eine Möglichkeit, es irgendwie so anzupassen, dass das Programm 
auf den Tastendruck sofort reagiert. Um z.b. bei einem Menü sofort bei 
Tastendruck das nächste Item anzuzeigen, obwohl die Taste noch gedrückt 
ist und trotzdem erst zwischendruch ein loslassen registriert werden 
muss, bevor der nächste Tastendruck erfolgen kann?

Ich persönlich steige durch die Dannegger-Entprellung sowieso nicht 
durch, hab sie genommen, weil sie hier so beliebt ist.

Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich seh grad, beim get_key_long funktioniert das so, beim short nicht.

Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, noch ein Nachtrag: mit get_key_press läufts, wie ich es meine.
Wofür ist dann get_key_short?

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

Bewertung
0 lesenswert
nicht lesenswert
Vladislav schrieb:
> OK, noch ein Nachtrag: mit get_key_press läufts, wie ich es meine.
> Wofür ist dann get_key_short?

Wenn du zwischen langem und kurzem Tastendruck unterscheiden willst. Wie 
lange eine Taste gedrückt wurde, kannst du logischerweise erst dann 
feststellen, wenn sie wieder losgelassen wurde oder die Zeit für 'langer 
Tastendruck' erreicht ist.

Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry Karl-Heinz, das versteh ich grad nicht. Für welche Funktion 
würdest du get_key_short nehmen.

Den get_key_press für Menü rauf und runter und so

Den get_key_long um z.b. beim hochzählen von größeren Werten den Lauf zu 
beschleunigen.

Aber den get_key_short? Hab ich die Funktion grad nicht verstanden.

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

Bewertung
0 lesenswert
nicht lesenswert
Vladislav schrieb:
> Sorry Karl-Heinz, das versteh ich grad nicht. Für welche Funktion
> würdest du get_key_short nehmen.

Ich erfinde jetzt etwas

  einzelner kurzer Tastendruck: ein Zahlenwert erhöht sich um 1
  einzelner langer Tastendruck: selbiger Wert erhöht sich um 100


get_key_press und get_key_long passen nicht zusammen.

Entweder du verwendest  get_key_press
oder du verwendest das Duo  get_key_short / get_key_long

get_key_press ist es egal, wie lange gedrückt wird
nur bei short/long wirkt sich das aus.

Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> nur bei short/long wirkt sich das aus.

Press und long sind 1A, nur short leuchtet mit nicht ein.
Bei long geht meine LED jetzt an, wenn ich die Taste lange gedrückt 
halte, aber bei short geht sie erst an, wenn ich die Taste dann wieder 
losgelassen hab.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:

>   einzelner kurzer Tastendruck: ein Zahlenwert erhöht sich um 1
>   einzelner langer Tastendruck: selbiger Wert erhöht sich um 100

Ist aber nun gerade ein Fall, bei dem es funktionieren würde. ;-)
Mit dem ersten Tastendruck (Drücken genügt) erhöht man den Wert
um 1.  Nach 500 ms ist die Taste immer noch gedrückt, und man
erhöht erstmal um 99, danach weiter um jeweils 100, wenn sie weiter
gedrückt bleibt.

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

Bewertung
0 lesenswert
nicht lesenswert
Vladislav schrieb:

> Press und long sind 1A, nur short leuchtet mit nicht ein.
> Bei long geht meine LED jetzt an, wenn ich die Taste lange gedrückt
> halte, aber bei short geht sie erst an, wenn ich die Taste dann wieder
> losgelassen hab.

Ja logisch.
Wie soll denn das Programm feststellen ob du mit dem Niederdrücken einer 
Taste jetzt kurz oder lang drücken willst?


In a Nutshell: Wenn du keinen Sinn darin siehst, dann verwends einfach 
nicht :-)

Ich könnte mir auch dieses Szenario vorstellen:
Benutzer hat die Möglichkeit eine Taste zu drücken. DIe Funktionalität 
springt erst dann an, wenn er die Taste loslässt. Bleibt er länger auf 
der Taste, so kann er dadurch die Anforderung 'löschen' und die 
Funktionalität wird nicht ausgeführt.

Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> In a Nutshell: Wenn du keinen Sinn darin siehst, dann verwends einfach
> nicht :-)

Nein, um Gotteswillen, ich bin grad begeistert und probier ein bisschen 
damit rum.

Wenn ich jetzt aber z.b. eine LED mit REPEAT toggle und eine andere mit 
LONG und REPEAT dabei die ganze zeit gedrückt halte, dann wird aus dem 
LONG ein PRESS ?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Siehe:

Beitrag "Re: Universelle Tastenabfrage"

Erlaubte Funktionen einer Taste:

- get_key_press()

- get_key_rpt()

- get_key_press() mit get_key_rpt()

- get_key_short() mit get_key_long()

- get_key_short() mit get_key_long_r() und get_key_rpt_l()



Peter

Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> mit get_key_long_r() und get_key_rpt_l()

Und was sind jetzt _r und _l ?

Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

if( get_key_short( 1<<KEY1 ))
      LED_PORT ^= 1<<LED1;
 
    if( get_key_long( 1<<KEY1 ))
      LED_PORT ^= 1<<LED2;
 
                                                  // single press and repeat
 
    if( get_key_press( 1<<KEY2 ) || get_key_rpt( 1<<KEY2 )){
      uint8_t i = LED_PORT;
 
      i = (i & 0x07) | ((i << 1) & 0xF0);
      if( i < 0xF0 )
        i |= 0x08;
      LED_PORT = i;      
    }

Du benutzt doch hier auch long alleine.

Ich komm da immernoch nicht so ganz hinter, tut mir leid.
Kannst du mir die einzelnen Funktion vielleicht nochmal eben 
beschreiben, wieso welche nur zusammen mit anderen gehen?

Ich probiere gerade z.b. mittels zweier gleichzeitig gedrückter Tasten 
einen Punkt zurückzuspringen. Aber das will nicht so.

Ich hatte:
else if (get_button_press (BUTTON_1 | BUTTON_2))
{
  item = 0;
}
aber das geht nicht, dann springt er auch bei einer zurück und wenn ich:
else if (get_button_press (BUTTON_1 | BUTTON_2) == (BUTTON_1 | BUTTON_2))
{
  item = 0;
}
geht das auch nur sporadisch, aber nicht wirklich...


Danke!

Autor: Michael M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Peter für deine Routine, ihre ausführliche Dokumentation und deine 
Erläuterung der Funktionen an dieser Stelle nochmal.

Hey Vladislav, diese Zeilen oben müssen aus deinem Post verschwunden 
sein...

Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich finde die Routine doch spitze und ich freu mich sehr, dass Peter sie 
hier für alle frei gibt, jedoch verstehe ich sie (noch) nicht so ganz. 
Sorry

Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre einer noch so nett und würde mir das erklären? :\

Ich wäre euch echt sehr dankbar!

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vladislav schrieb:
> Wäre einer noch so nett und würde mir das erklären?
Beitrag "Tastenabfrage bei Menüführung - Ideenblockade"

Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich verstehe das mit den Kombinationen nicht und darüber hinaus probiere 
ich die ganze Zeit herum, um mit Taste 1 und 2 aus dem Menü einen Punkt 
zurück zu springen. Aber ich bekomme es nicht hin.

Habe mir den Thread zum Entprellen schon durchgelesen...mir ist das auch 
klar, dass der uC nicht wissen kann, ob gleich noch eine zweite taste 
kommt... es klappt halt nur, wenn ich sie wirklich gleichzeitig drücke.

Gibt es dafür keine Lösung?

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

Bewertung
0 lesenswert
nicht lesenswert
Vladislav schrieb:
> Ich verstehe das mit den Kombinationen nicht

Dann vergiss fürs erste die Kombinationen. Man braucht sie nur in 
Sinderfällen.

> und darüber hinaus probiere
> ich die ganze Zeit herum, um mit Taste 1 und 2 aus dem Menü einen Punkt
> zurück zu springen. Aber ich bekomme es nicht hin.

Dann zeig dein Programm

> kommt... es klappt halt nur, wenn ich sie wirklich gleichzeitig drücke.

Eine Menüfuhrung, die darauf beruht, dass der Benutzer 2 Tasten 
gleichzeitig drücken muss, ist meistens sowieso schlecht. Sowas erfreut 
immer wieder die Grobmotoriker.
Spendier deinem Benutzer genügend Tasten oder bau ihm einen Menüpunkt 
'Zurück' ein, dann brauchst du nur 3 Tasten.

Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Antwort! Hier mal ein kurzer Auszug vom Menü:
case 11:                       // Menuepunkt 1.1
{
  if (disp_done == FALSE)      // Gibt einmal neuen Inhalt auf Display aus
  {
    lcd_clear_display ();      // Loesche Display
    lcd_jump_to (2,1);         // Untere Zeile, 1. Stelle
    lcd_send_string ("MENUE"); // Sende String "Menue"
    lcd_jump_to (1,3);         // Obere Zeile, 3. Stelle
    lcd_send_num (1, TRUE);    // Sende 1 mit Dezimalpunkt
    lcd_send_num (1, FALSE);   // Sende 1 ohne Dezimalpunkt
          
    disp_done = TRUE;          // Display-Inhalt fertig
  }
        
  if (get_button_press (BUTTON_3)) // Wenn Taste 'OK' gedrueckt
  {
    disp_done = 0;             // Beim naechsten mal Display beschreiben
    item = 12;                 // Menuepunkt auf 1.2 (weiter)
  }
  else if (get_button_press (BUTTON_1 | BUTTON_2)) // <- PROBLEM HIER!
  {
    item = 10;                 // Menuepunkt auf 1.0 (zurueck)
    disp_done = 0;             // Beim naechsten mal Display beschreiben
  }
        
  break;
}

So sieht ein Menüpunkt aus.
Ich habe leider nur drei Tasten, da komm ich nicht drum herum. Daher ist 
meine Tastensteuerung etwas eingeschränkt...

Ich würde daher gerne mit BUTTON_1 und BUTTON_2 gleichzeitig einen Punkt 
zurückspringen, aber nunja, die Problematik ist mir bekannt...der uC 
kann nicht wissen, was kommt.

Es geht halt, wenn ich wirklich gleichzeitig:
else if ((get_button_press (BUTTON_1 | BUTTON_2) == (BUTTON_1 | BUTTON_2))
schreibe, aber wirklich gleichzeitig!

Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vladislav schrieb:
> schreibe, aber wirklich gleichzeitig!

DRÜCKE, meine ich natürlich, sorry!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vladislav schrieb:
> die Problematik ist mir bekannt...der uC
> kann nicht wissen, was kommt.

Dann ist Dein Versuch in etwa so erfolgreich, wie einen Gegenstand nach 
oben fallen lassen zu wollen.

Du mußt Dir erstmal einen Plan machen, welche Betätigungsmöglichkeiten 
Du hast und wie Du sie verwendest.
Einfach drauflos programmieren und merken, da fehlt ne Taste, ist der 
falsche Weg!

Du hast mit 3 Tasten z.B. folgende Möglichkeiten, die von einem MC ohne 
Hellsehen eindeutig erkannt werden können:
                            Anzahl Funktionen
3 Tasten:                   3
Shift + 2 Tasten:           4
3 Tasten kurz/lang:         6
Shift + 2 Tasten kurz/lang: 8


Peter

Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber das Problem geht ja weiter:

              MENUE_2.1 <-> MENUE_2.2 <-> MENUE_2.3
                |
MENUE_1.0 <-> MENUE_2.0 <-> MENUE_3.0
  /\           ||            ||
  ||           ||            ||
  \/           \/            \/
--------------------------------------
|         NORMALES PROGRAMM          |
--------------------------------------

Ich kann also vom normalen Programm in den Menüpunkt 1.0 springen und 
von der untersten Ebene überall wieder ins Programm - vorzugsweise mit 
LINKS+RECHTS

Mal angenommen ich bin im Punkt 2.0, dann kann ich mit mit LINKS 
(get_button_press (BUTTON_LINKS) ins Menü 1.0 und mit RECHTS 
(get_button_press (BUTTON_RECHTS) in 3.0

Will ich aber jetzt zurück zum Programm mit gleichzeitigen Druck von 
LINKS+RECHTS, dann nimmt der uC natürlich den normalen Befehl für RECHTS 
oder LINKS...oh man, 3 Tasten sind echt scheisse, aber ich kann das 
nicht ändern.

Was kann ich hier tun? Ich bin echt ratlos!

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube , ich würde die Variante "3 Tasten kurz/lang" wählen.

Tastenbeschriftung:  Rechts, Links und Enter.

Programm  -> Menue1.0  : Enter (lang)
Menue X.0 -> Programm  : Enter (lang)
Menue X.0 -> Menue x.0 : Rechts / Links
Menue 2.0 -> Menue 2.1 : Enter
Menue 2.x -> Menue 2.0 : Enter (lang)

usw.

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

Bewertung
0 lesenswert
nicht lesenswert
Vladislav schrieb:

> Will ich aber jetzt zurück zum Programm mit gleichzeitigen Druck

Nochmal:

gleichzeitiges Drücken vom Benutzer zu verlangen ist praktisch IMMER 
Mist!

Denn das kriegt kein Mensch hin.
Irgendeine der beiden Tasten kommt immer früher! Da kannst du als 
Programmierer nichts dagegen tun.

> von
> LINKS+RECHTS, dann nimmt der uC natürlich den normalen Befehl für RECHTS
> oder LINKS...oh man, 3 Tasten sind echt scheisse, aber ich kann das
> nicht ändern.

Dann musst du das Menüsystem so umbauen, dass du nicht darauf angewiesen 
bist, dass 2 Tasten gleichzeitig gedrückt werden müssen!

> Was kann ich hier tun? Ich bin echt ratlos!

Im einfachsten Fall verzichtest du darauf, dass der Benutzer mit 
irgendeiner Sonderkombination wieder in den normalen Programmlauf kommt 
sondern zwingst ihn, dass er sauber über das Hauptmenü aussteigt.

Eine Variante davon zwingt den Benutzer gar nicht, dass er das selber 
macht, sondern das Programm bricht nach x Sekunden ohne Benutzereingabe 
das Menüsystem ab und geht selbsttätig zurück.

Du kannst ihm auch im Menü einen Menüpunkt 'Exit' anbieten, den er 
anwählen muss um direkt aus einem Submenü wieder in den normalen 
Programmlauf auszusteigen.

Du kannst die Taste für 'Auswahl' mit einer Sonderfunktion für 'langen 
Tastendruck' versehen und wenn das passiert erfolgt der Ausstieg und 
lebst damit, dass zunächst eine Funktion mehr oder weniger ausgewählt 
wird, die dann durch den langen Tastendruck abgebrochen wird.


Aber eines solltest du auf keinen Fall tun: Ohne Planung und Überlegung 
wie das Konzept deiner Benutzersteuerung funktionieren soll dich 
hinsetzen und drauflos programmieren. Denn das geht mit Sicherheit 
schief.


> oh man, 3 Tasten sind echt scheisse

3 Tasten reichen völlig aus, siehe die ganzen Menüsysteme die auf einem 
einzigen Drehencoder mit Tastfunktion basieren. Nur muss man sich im 
Vorfeld überlegen, wie die Menüsteuerung funktionieren soll.

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was spricht z.B gegen einen Punkt "zurück" in jedem Menü?

Jedes Menü kommt mit 2 Pfeiltasten/oder Encoder und einer Enter Taste 
aus. Und das kann auch jeder bedienen, man muss sich ja nix merken

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> gleichzeitiges Drücken vom Benutzer zu verlangen ist praktisch IMMER
> Mist!

Naja.  Ist eine Frage der Definition von "gleichzeitig".  Ich habe
lange Zeit die Emulation der mittleren Maustaste (die bei X11-
Programmen ja seit Jahr und Tag üblich war) durch gleichzeitiges
Drücken beider Tasten einer 2-Tasten-Maus benutzt, das geht schon.
Man muss halt eine Karenzzeit einplanen, innerhalb derer beim Drücken
der ersten Taste der Zustand von "nicht gedrückt" nach "unentschlossen"
wandert, und erst nach dem Timeout wechselt er in "eine Taste gedrückt"
oder "zwei Tasten gedrückt".  Für die besagte Maustastenemulation
waren glaub' ich 50 ms Karenzzeit ein sinnvoller Wert, wenn die
mechanische Konstruktion der Tasten schlechter ist als bei einer Maus,
würde ich auf 100 ms gehen.  In dieser Zeit schafft es ein Normal-
sterblicher durchaus, beide Knöpfe gedrückt zu halten.

Autor: Vladislav (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Volker Zabe schrieb:
> Ich glaube , ich würde die Variante "3 Tasten kurz/lang" wählen.

Ich habe jetzt auch erstmal die Kombination kurz/lang.

Jetzt ist es so: LINKS+RECHTS lang gedrückt, Menü zurück, geht auch, 
solange ich nicht NACH LINKS und NACH RECHTS mit get_key_PRESS sondern 
mit SHORT mache, was natürlich zur Folge hat, dass der nächste Punkt 
erst kommt, wenn man die entsprechende Taste wieder los lässt, 
währenddessen die lang gedrückten aufs Drücken reagieren und nicht aufs 
loslassen.

GRRR...

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

Bewertung
0 lesenswert
nicht lesenswert
Vladislav schrieb:
> Volker Zabe schrieb:
>> Ich glaube , ich würde die Variante "3 Tasten kurz/lang" wählen.
>
> Ich habe jetzt auch erstmal die Kombination kurz/lang.
>
> Jetzt ist es so: LINKS+RECHTS lang gedrückt, Menü zurück, geht auch,
> solange ich nicht NACH LINKS und NACH RECHTS mit get_key_PRESS sondern
> mit SHORT mache, was natürlich zur Folge hat, dass der nächste Punkt
> erst kommt, wenn man die entsprechende Taste wieder los lässt,
> währenddessen die lang gedrückten aufs Drücken reagieren und nicht aufs
> loslassen.
>
> GRRR...


Du versuchst krampfhaft eine 'Do what I mean' Steuerung zu bauen.
Das funktioniert nicht.

Entweder du löst deine Aktionen aus, wenn die Taste niedergedrückt wird.
 In dem Fall musst du damit rechnen, dass der Benutzer genau das
 eigentlich gar nicht wollte. Da dein Programm aber nicht hellsehen
 kann wie lange der Benutzer die Taste noch gedrückt halten wird,
 läufst du in das Problem, dass du eine Aktion die eigentlich schon
 stattgefunden hat, bei anhaltend langem Tastendruck wieder rück-
 gängig machen musst, bzw. das ganze Menüsystem so aufzubauen, dass
 dieser vom Benutzer eigentlich nicht gewollte Tastendruck keinen
 'Schaden' anrichtet.

Oder du löst die Aktion erst beim Loslassen (oder überschreiten einer 
Zeitbegrenzung) aus.
  Dann hast du natürlich das Problem, das es für den Benutzer so
  aussieht: Er drückt eine Taste und zunächst mal passiert nichts,
  weil die Aktion ja erst beim Loslassen angestossen werden kann, weil
  ja beim Niederdrücken noch nicht feststeht, ob das ein kurzer oder
  ein langer Tastendruck werden wird.


Die eierlegende Wollmilchsau, die auch noch zukünftige Aktionen des 
Benutzers erraten kann, existiert nun mal nicht.

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

Bewertung
0 lesenswert
nicht lesenswert
Jörg Wunsch schrieb:

> Man muss halt eine Karenzzeit einplanen, innerhalb derer beim Drücken
> der ersten Taste der Zustand von "nicht gedrückt" nach "unentschlossen"
> wandert, und erst nach dem Timeout wechselt er in "eine Taste gedrückt"
> oder "zwei Tasten gedrückt".  Für die besagte Maustastenemulation
> waren glaub' ich 50 ms Karenzzeit ein sinnvoller Wert, wenn die
> mechanische Konstruktion der Tasten schlechter ist als bei einer Maus,
> würde ich auf 100 ms gehen.  In dieser Zeit schafft es ein Normal-
> sterblicher durchaus, beide Knöpfe gedrückt zu halten.

Schon klar. So oder so ähnlich haben wir das wohl damals alle gemacht, 
als die ersten 3-Tasten Mäuse aufgekommen sind.

Aber mit dem, was in der PeDa Entprellung vorhanden ist, ist das ohne 
zuätzlichen Programmieraufwand nicht möglich. Die ist nicht darauf 
ausgelegt, dass mehrer Tastendrücke 'gleichzeitig' einen weiteren 
virtuellen Tastendruck ergeben.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Aber mit dem, was in der PeDa Entprellung vorhanden ist, ist das ohne
> zuätzlichen Programmieraufwand nicht möglich.

Naja, es geht schon. Ist aber wirklich keine schöne Bedienung.

  for(;;){                                              // main loop
    switch( get_key_long(  1<<KEY0 | 1<<KEY1 ) |
            get_key_short( 1<<KEY0 | 1<<KEY1 )){

      case 1<<KEY0:             LED_PORT ^= 1<<LED0; break;

      case 1<<KEY1:             LED_PORT ^= 1<<LED1; break;

      default:
                if((key_press & (1<<KEY0 | 1<<KEY1)) != (1<<KEY0 | 1<<KEY1))
                  break;
                get_key_press( 1<<KEY0 | 1<<KEY1 );

      case 1<<KEY0 | 1<<KEY1:   LED_PORT ^= 1<<LED2; break;
    }
  }

Die Einzeltasten können natürlich erst nach Loslassen oder nach der 
Langdruckzeit erkannt werden.
Oder man muß eben die
#include <mentalist.h>
einbinden.


Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich muß mich korrigieren.
Ohne Timeout ist das nun auch für Grobmotoriker bedienbar.

Dafür ist ne extra Funktion hinzugekommen, get_key_common().
Hier der Code:

Beitrag "Universelle Tastenabfrage mit 2 Tastenerkennung"


Peter

Autor: Heribert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Man kann auch auswählen, ob der Druck beider Tasten innerhalb einer
> bestimmte Zeit erfolgen soll (#define TIMEOUT)

Wo wird denn im Quelltext der Wert von TIMEOUT ausgewertet? Also wo wird
berücksichtigt, ob ich 10 oder 100 oder 1000 eingebe?

Ansonsten prima! Die Funktion fehlte noch - deine Tastenentprellung ist
wirklich der Hammer, PeDa! Danke sehr!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heribert schrieb:
> Wo wird denn im Quelltext der Wert von TIMEOUT ausgewertet? Also wo wird
> berücksichtigt, ob ich 10 oder 100 oder 1000 eingebe?

TIMEOUT entscheidet nur zwischen mit/ohne.

Die Zeit steht in:
#define REPEAT_START    50              // after 500ms


Peter

Autor: Heribert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Dannegger schrieb:
> Die Zeit steht in:#define REPEAT_START    50              // after 500ms
>
>
> Peter

Alles klar, ich danke dir vielmals!

Autor: Gerd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich habe die Entprellung grad bei mir ebenfalls mal mit eingebunden! 
Peter, großes LOB!!! Sehr gut!!!

Ne Frage habe ich noch. Ich werde die Entprellung hauptsächlich zur 
Menüsteuerung nutzen. Jetzt mache ich zum Beispiel während des Betriebs 
mit langem Tastendruck der einen Taste das Menü auf. Vorher wird auf 
keine Tasten reagiert.

Mir fällt dabei auf, dass wenn ich jetzt beispielsweise vorher bereits 
eine andere Taste mal gedrückt habe, sich der uC das ja merkt.

Es passiert während des Betriebes nichts, da die Taste nicht abgefragt 
wird.

Wenn ich aber jetzt ins Menü gehe und die Taste ab da eine Funktion hat, 
dann fragt er ja den Status ab und hat im Speicher noch, dass die Taset 
gedrückt worden war und führt das dann auch direkt aus.

Kann man das umgehen?

Danke schonmal,

Gerd

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gerd schrieb:
> Kann man das umgehen?
Ohne bisher ein Menü realisiert zu haben: beim Öffnen des Menüs 
get_key_press & get_key_rpt einmalig aufrufen und das Problem sollte 
sich erledigt haben.

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... da die entsprechenden Register (Merker) dadurch gelöscht werden.

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Register => Variablen

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.