Forum: Mikrocontroller und Digitale Elektronik IRMP Bei gedrückter taste nur ein mal reagieren


von Lokus P. (derschatten)


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?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Lokus Pokus schrieb:
> Da die Fernbedienung bei gedrückter Taste permanent das gleiche Signal
> sendet
 Seit wann ist das so ?

: Bearbeitet durch User
von Lokus P. (derschatten)


Lesenswert?

keine Ahnung, sag dus mir?

von Peter D. (peda)


Lesenswert?

Hängt allein vom Code der FB ab.
Z.B. beim RC5-Code sagt Dir das Toggle-Bit, ob nochmal gedrückt wurde. 
Bei lange Drücken bleibt das Toggle-Bit auf seinem Wert.

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Lokus P. (derschatten)


Lesenswert?

Ahh, ok. Danke euch!

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
> Hängt allein vom Code der FB ab.

Nein, IRMP erkennt das unabhängig von einem evtl. vorhandenen 
Toggle-Bit.

Das altertümliche RC5 ist längst tot, vergiss es ;-)

: Bearbeitet durch Moderator
von Peter D. (peda)


Lesenswert?

Frank M. schrieb:
> Nein, IRMP erkennt das unabhängig von einem evtl. vorhandenen
> Toggle-Bit.

War nur ein Beispiel. Andere Code haben einen anderen Mechanismus dafür.
Wenn die Lib das schon auswertet, dann sollte man mal die Doku zu der 
Lib lesen.
Ich benutze ja auch nicht printf(), ohne in das Manual geschaut zu 
haben.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Peter Dannegger schrieb:
> Wenn die Lib das schon auswertet, dann sollte man mal die Doku zu der
> Lib lesen.

ACK. War auch 'ne Menge Arbeit, die zu erstellen ;-)

von Lokus P. (derschatten)


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
}

von Dirk K. (dekoepi)


Lesenswert?

Einfach die Logik überdenken: Body von if() und else() vertauschen, dann 
sollte es klappen - wenn der restliche Code ok ist und das macht, was du 
dir denkst.

von Frank M. (ukw) (Moderator) Benutzerseite


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.

von Lokus P. (derschatten)


Lesenswert?

Ja, genauso funkts. Danke euch!

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
Noch kein Account? Hier anmelden.