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.
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??
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..
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.. :-(
1 | if( get_key_long( 1<<BUTTON_A ) || get_key_rpt( 1<<BUTTON_A )) |
ist möglicherweise der richtige weg..
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 )) { ..... } }
äh, fehler, meinte if( get_key_short( 1<<BUTTON_A )) { if( get_key_short( 1<<BUTTON_B )) { ..... } }
Komisch, hat das noch niemand gemacht, oder ist es schwer, oder stelle ich meine Fragen falsch? Ich schlage vor, den Lösungsansatz ggf. direkt in der Codesammlung zugehörig zum Code einzubringen: http://www.mikrocontroller.net/forum/read-4-310276.html#new
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.