Tasten, Entprellung, Zeiterkennung

Gast #410606
Lesenswert?
• ▲
▼
Der anscheinend überarbeitete Code
(http://www.mikrocontroller.net/attachment.php/252480/C_TAST.C
) in http://www.mikrocontroller.net/articles/Entprellung benutzt noch
alte C - Konventionen und nicht die Typendeklarationen aus dem
Tutorial.

So wird auch in

u8 get_key_short( u8 key_mask )
{
  cli();      // read key state and key press atomic !
  return get_key_press( ~key_state & key_mask );
}


anscheinend die interrupts nicht wieder eingeschaltet. Hat das so seine
richtigkeit?

Wie lassen sich die Abfragen kombinieren, wenn die Abfragefunktion das
Zustandsbyte doch wieder zurücksetzen?

Ich möchte z.B. eine Aktion bei kurzem Tastendruck, und bei langem eine
andere wiederholt ausführen.
Gast #410609
Lesenswert?
• ▲
▼
hilfe, ich bin zu blöd!

basierend auf:
http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29
1
// single press:
2

3
      // reacts on release
4

5
    
6

7
    if( get_key_short( 1<<BUTTON_A )) 
8

9
    {
10

11
      cli();
12

13
        rc5_send_code( toggle & 1, RC5ADDR_TV1, 33 );
14

15
      sei();
16

17
    }
18

19

20

21
    // single long press:
22

23
    
24

25
    // reacts once when still pressed after certain time
26

27
    
28

29
    if( get_key_long( 1<<BUTTON_A ))   // after short press:
30

31
    {
32

33
      cli();
34

35
      rc5_send_code( toggle & 1, RC5ADDR_TV1, 17 );
36

37
      sei();
38

39
    }
40

41
    
42

43
    // single press and repeat:
44

45
// funktioniert anscheinend ohne vorherige funktion nicht,  wird einmal
46
ausgeführt
47

48
    
49

50
    if( get_key_press( 1<<BUTTON_A ) || get_key_rpt( 1<<BUTTON_A ))
51

52
    {
53

54
      cli();
55

56
      rc5_send_code( toggle, RC5ADDR_TV1, 17 );
57

58
      sei();
59

60
    }

Das kann doch nicht so schwer sein. get_key_short klappt ja auch
wunderbar; wenn man innerhalb der schwelle die taste drückt und
losläßt, greift das.

zusätzlich möchte ich jetzt aber noch bei einem längeren tastendruck,
daß für die dauer im eingestellen abstand der code wiederholt
ausgeführt wird.

einzeln, wie im beispiel, funktionieren die sachen, aber anscheinend
nicht für dieselbe taste.

was kann ich machen??
Gast #410610
Lesenswert?
• ▲
▼
ts, danke schonmal, ich habe eben schon google bemüht, mit dem
dateinamen diesen oft zitierten thread zu finden..leider ergebnislos.
wiki und avrfreaks, aber nicht der eigentliche thread.

dann lese ich mal..
Gast #410611
Lesenswert?
• ▲
▼
ich hab's mal ausprobiert..


mit
1
#
2
if( get_key_short( 1<<KEY1 ))
3
#
4
LED_PORT ^= 1<<LED1;
5
#
6
 
7
#
8
if( get_key_long( 1<<KEY1 ))

wird das richtige ausgeführt, aber nicht wiederholt.
1
if( get_key_short( 1<<BUTTON_A )) 
2
    {
3
      cli();
4
        rc5_send_code( toggle & 1, RC5ADDR_TV1, 33 );
5
      sei();
6
    }
7

8
    if( get_key_press( 1<<BUTTON_A ) || get_key_rpt( 1<<BUTTON_A ))
9
    {
10
      cli();
11
      rc5_send_code( toggle, RC5ADDR_TV1, 17 );
12
      sei();
13
    }

sendet zwar nach langem tastendruck wiederholt, aber der kurze wird
nicht erkannt.. :-(
Gast #410613
Lesenswert?
• ▲
▼
juhuu, das funktioniert!

und wie könnte man prüfen, ob tasten gleichzeitig gedrückt werden?

if( get_key_press( 1<<BUTTON_B || 1<<BUTTON_B)) bewirkt nichts, werden
trotzdem als einzelne tastendrücke erkannt

sollte man die prüfung verschachteln?

if( get_key_short( 1<<BUTTON_A ))

{

    if( get_key_long( 1<<BUTTON_A ) || get_key_rpt( 1<<BUTTON_A ))

  {

              .....

       }
}

Antwort schreiben

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.

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.