get_key_long() von Peter Dannegger

OP #2585898
Hallo zusammen,

ich habe schon lange zu meinem Problem hier gesucht, aber dieses Thema 
zu den Entprell Routinen von P.Dannegger wurde noch nicht angesprochen.

Ich schaffe es nicht die Funktion get_key_long() zum Funktionieren zu 
überreden.

Meine Defines:
1
#define KEY_DDR         DDRA
2
#define KEY_PORT        PORTA
3
#define KEY_PIN         PINA
4
#define DIR_INC_KEY     0
5
#define DIR_DEC_KEY     1
6
#define SETAXIS_KEY     2
7
#define GOTO_REF_KEY    3
8
#define ENCODER_KEY     4
9
#define ALL_KEYS        (1<<DIR_INC_KEY | 1<<DIR_DEC_KEY | 1<<SETAXIS_KEY | 1<<GOTO_REF_KEY | 1<<ENCODER_KEY)
10
 
11
#define REPEAT_MASK     (1<<ENCODER_KEY | 1<<DIR_INC_KEY | 1<<DIR_DEC_KEY)       // repeat: key1, key2
12
#define REPEAT_START    50                        // after 500ms
13
#define REPEAT_NEXT     20                        // every 200ms

Es soll get_key_long() mit dem ENCODER_KEY klappen.
Dazu muss ich diesen ja erstmal in die REPEAT_MASK eintragen, soweit 
richtig?

Nun meine erste Frage: Wo stelle ich die Zeit ein nach der ein 
Tastendruck als "long" gewertet wird.

In main() sieht das ganze bei mir so aus:
1
int main() 
2
{
3
  // initzeug
4
  while(1) {
5
    if( get_key_short( 1<<ENCODER_KEY )) {
6
      foo();
7
    }
8
    
9
    if( get_key_long( 1<<ENCODER_KEY )) {
10
      bar();    
11
    }
12
  }
13
}

Habe ich hier irgendwo einen Denkfehler?
Ich kann den Taster solange drücken wie ich will, bar() wird nie 
aufgerufen.

Danke schonmal,
Alex
#2586003
Bernhard M. schrieb:
> Muss man nicht immer get_key_long() vor get_key_short() aufrufen?
> Andersherum gehts glaube ich nicht.

Glauben ist nicht wissen, was soll also der Beitrag.

Ich verwende die Abfragen nacheinande und ohne Probleme.
1
      // Auslesen der Encoder Zustände
2
      // alle weiteren Funktionen greifen auf diese Daten in |encoder| zu.
3

4
      ENCODER_DATA(direction)       = ENCODER_READ();
5
      ENCODER_DATA(key_short_press) = get_key_short( _BV(KEY_ENCODER_BIT) );  // beide Key-Ereignisse können nicht zusammen auftreten
6
      ENCODER_DATA(key_long_press)  = get_key_long ( _BV(KEY_ENCODER_BIT) );  // beide Key-Ereignisse können nicht zusammen auftreten
#2586019
1
#ifdef ACTIVE_HIGH
2
  key_rpt = ~(key_rpt | (key_state & REPEAT_MASK));
3
#else
4
    key_rpt |= key_state & REPEAT_MASK;
5
#endif

Wer hat sich denn sowas ausgedacht?

Ob Taste gegen GND oder VCC, wird nur beim Einlesen des Input-Ports 
unterschieden, nirgendwo anders!


Peter
OP #2586057
> Ob Taste gegen GND oder VCC, wird nur beim Einlesen des Input-Ports
> unterschieden, nirgendwo anders!

Also ist diese Stelle in der ISR korrekt?
1
#ifdef ACTIVE_HIGH
2
  i = key_state ^ KEY_PIN;                        // key changed ?
3
#else
4
  i = key_state ^ ~KEY_PIN;                       // key changed ?
5
#endif

Dann werde ich
1
#ifdef ACTIVE_HIGH
2
  key_rpt = ~(key_rpt | (key_state & REPEAT_MASK));
3
#else
4
    key_rpt |= key_state & REPEAT_MASK;
5
#endif

wieder durch
1
    key_rpt |= key_state & REPEAT_MASK;
ersetzen.

Obs dann klappt weiß ich erst wenn ich wieder im Keller sitze.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.