mikrocontroller.net

Forum: Compiler & IDEs Tasten, Entprellung, Zeiterkennung


Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der anscheinend überarbeitete Code
(http://www.mikrocontroller.net/attachment.php/2524...
) 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.

Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das gesuchte sei() ist in get_key_press.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hilfe, ich bin zu blöd!

basierend auf:
http://www.mikrocontroller.net/articles/Entprellun...
// single press:

      // reacts on release

    

    if( get_key_short( 1<<BUTTON_A )) 

    {

      cli();

        rc5_send_code( toggle & 1, RC5ADDR_TV1, 33 );

      sei();

    }



    // single long press:

    

    // reacts once when still pressed after certain time

    

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

    {

      cli();

      rc5_send_code( toggle & 1, RC5ADDR_TV1, 17 );

      sei();

    }

    

    // single press and repeat:

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

    

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

    {

      cli();

      rc5_send_code( toggle, RC5ADDR_TV1, 17 );

      sei();

    }




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??

Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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..

Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab's mal ausprobiert..


mit
#
if( get_key_short( 1<<KEY1 ))
#
LED_PORT ^= 1<<LED1;
#
 
#
if( get_key_long( 1<<KEY1 ))

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

    if( get_key_press( 1<<BUTTON_A ) || get_key_rpt( 1<<BUTTON_A ))
    {
      cli();
      rc5_send_code( toggle, RC5ADDR_TV1, 17 );
      sei();
    }

sendet zwar nach langem tastendruck wiederholt, aber der kurze wird
nicht erkannt.. :-(

Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if( get_key_long( 1<<BUTTON_A ) || get_key_rpt( 1<<BUTTON_A ))

ist möglicherweise der richtige weg..

Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ))

  {

              .....

       }
}

Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
äh, fehler, meinte

if( get_key_short( 1<<BUTTON_A ))

{

    if( get_key_short( 1<<BUTTON_B ))

  {

              .....

       }
}

Autor: duundich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

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.