IRMP Bei gedrückter taste nur ein mal reagieren

#3809083
Lesenswert?

Hat jemand eine Idee wie man es am einfachsten realisieren kann das IRMP 
einen gedrückten Tastendruck nur als einmal gedrückt erkennt? Ich möchte 
gerne mit ein und der selben Taste eine LED EIN und wieder ausschalten.

Da die Fernbedienung bei gedrückter Taste permanent das gleiche Signal 
sendet toggelt die LED dadurch ja ständig.

Man müßt also irgendwie dem Programm mitteilen das erst wieder reagiert 
werden soll wenn die Taste losgelassen wurde.

Wie gehe ich da am besten ran? Mittels Timer? Oder hat jemand noch eine 
andere Idee?
Moderator Persönliche Seite #3809251
Lesenswert?

Lokus Pokus schrieb:
> Hat jemand eine Idee wie man es am einfachsten realisieren kann das IRMP
> einen gedrückten Tastendruck nur als einmal gedrückt erkennt?

Ganz einfach
1
if (irmp_data.flags & IRMP_FLAG_REPETITION)
2
{
3
     // Taste wurde lang gedrückt, es handelt sich um eine Wiederholung
4
     ;  // Tue NICHTS
5
}
6
else
7
{
8
     // Es handelt sich um eine neue Taste
9
     action();
10
}

Das ist auch so im IRMP-Artikel erklärt, such einfach nach

           "Entprellen" von Tasten

im Artikel.
#3810020
Lesenswert?

Irgendwie ändert sich da nichts wenn ich die Entprell-Funktion einbaue.

Der Code sieht so aus:
1
int main(void)
2
{
3
  IRMP_DATA irmp_data;
4

5
  ioinit();                          // Ein/Ausgänge initialisieren
6
  irmp_init();                        // IRMP initialisieren
7
  timer_init();                        // Timer initialisieren
8

9
  sei ();                            // Interrupts aktivieren
10

11
  for (;;)
12
  {
13
    if (irmp_get_data (&irmp_data))
14
    {
15
      // wenn ein IR-Signal erkannt wird, dann...
16
      // irmp_data.protocol ist das protokoll, siehe irmp.h
17
      // irmp_data.address ist die Adresse / Hersteller Code des IR Sender
18
      // irmp_data.command ist der Befehlscode
19
      // irmp_protocol_names[irmp_data.protocol] ist der Protokollname (wenn aktiviert, siehe irmpconfig.h)
20

21
        if (irmp_data.flags & IRMP_FLAG_REPETITION)
22
        {
23
          switch (irmp_data.command)
24
          {
25
            case 0x0008: OUT_PORT ^=(SCHALTER1); break;    // Taste rot1
26
            case 0x000C: OUT_PORT ^=(SCHALTER2); break;    // Taste rot2
27
            case 0x0010: OUT_PORT ^=(SCHALTER3); break;    // Taste rot3
28
            case 0x0014: OUT_PORT ^=(SCHALTER4); break;    // Taste rot4
29
            case 0x0009: OUT_PORT ^=(SCHALTER5); break;    // Taste grün1
30
            case 0x000D: OUT_PORT ^=(SCHALTER6); break;    // Taste grün2
31
            case 0x0011: OUT_PORT ^=(SCHALTER7); break;    // Taste grün3
32
            case 0x0015: OUT_PORT ^=(SCHALTER8); break;    // Taste grün4
33

34
            case 0x0002: OUT_PORT =(ALL_LOW); break;    // Taste off
35
            case 0x0003: OUT_PORT =(ALL_HI); break;      // Taste on
36
          }
37
      }
38
        else
39
        {
40
          // Es handelt sich um eine neue Taste
41
        }
42
    }
43
  }
44
}
Moderator Persönliche Seite #3810802
Lesenswert?

Lokus Pokus schrieb:
> Irgendwie ändert sich da nichts wenn ich die Entprell-Funktion einbaue.

Dirk hat da schon Recht:

Weil Du genau dann reagierst, wenn Du die Taste länger gedrückt hältst. 
Das ist genau falsch herum.

Entweder:

 - Du schreibst den Code in den Else-Block

Oder:

 - Du schreibst das if um:

   if (! (irmp_data.flags & IRMP_FLAG_REPETITION))

   Dann kann der else-Block entfallen.

Such Dir das aus, was Dir besser gefällt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren