Forum: Compiler & IDEs AVR-gcc Wie IF-Abfrage richtig nachvollziehen


von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo allerseits,


momentan befasse ich mich mit den Anpassungen dieses vorgefertigten auf 
IRMP basiernden Moodlight-Programms

Beitrag "noch ein AVR Moodlight"
Re: noch ein AVR Moodlight
AVR-Moodlight-20120308.tar.gz (86,6 KB, 103 Downloads)

an meine bestehende Schaltung und an diejenigen Fernbedienungen, die mir 
zur Verfügung stehen.

Nachdem nun die Anpassung an meine NEC-Fernbedienung gelungen war, 
wollte ich dies auch für die RC5-Fernbedienung vornehmen. Klappte auch. 
Ebenso für das Kaseikyo-Protokoll.

Nun sollten beide Fernbedienungen wahlweise erkannt werden und genau da 
beginnt mein Problem.
Die Protokolle werden einzeln erkannt, bei jedem Tastendruck blitzt die 
Toggle-LED kurz auf, bleibt aber niemals an und mir ist vor allem die 
Wirkungsweise der IF-Abfrage unklar, da ich mich beim Durchdenken immer 
in Widersprücken verstricke.

Ich verstehe die Wirkungsweise dieser Zeilen folgendermaßen:

In My_PROTO und MY_REMOTE werden Protokoll und Geräte-Code derjenigen 
Fernbedienung festgelegt, auf die das Programm reagieren soll.
Diese werden dann beide verglichen mit "irmp_data.protocol" und 
"irmp_data.address".
Falls die "richtigen" Signale empfangen wurden, soll eine Aktion 
abhängig von der gedrückten Taste geschehen, sofern es eine der 
definierten Tasten ist, hier also nur die vier Tasten ON/OFF und 1, 2, 
3.

Die IF-Abfrage benutzt !=, das ich mit "ungleich" übersetze.
Falls ("Vergleich1 auf Ungleichheit" ODER "Vergleich2 auf Ungleichheit") 
toggle die LED und return.
Das würde die Aktionen auslösen, sofern nur einer der Partner ungleich 
wäre. Das ist aber falsch.

Was genau macht eigentlich das Return?
Return kenne ich, um einen Rückgabewert an das übergeordnete Programm zu 
geben. Z.B. return (0) oder return variablenname.
Falls nicht die richtige Fernbedienung (Protokoll und Gerätecode) 
erkannt wurden, soll die nachfolgende switch-case-Abfrage garnicht 
durchlaufen werden.

Ich wäre um Tipps dankbar.
mit freundlichem Gruß
____________________________________________
in moodlight.c (Darstellung etwas gekürzt):
1
/* remote control address and command codes */
2
3
#define MY_PROTO    IRMP_NEC_PROTOCOL   /* IR protocol and */
4
#define MY_REMOTE   0x916e              /* system code */
5
6
7
....
8
....
9
10
11
/* last received IR signal */
12
13
IRMP_DATA irmp_data;
14
15
16
/* evaluate an IR remote signal */
17
void moodlight_remote(void)
18
{
19
20
/*  es geht um genau diese IF-Abfrage, die ich nicht genau verstehe <<<<<<<<<<<<<--<<<<<<<<<---<<<<<<<<---*/
21
    if (   irmp_data.protocol != MY_PROTO
22
        || irmp_data.address  != MY_REMOTE) {
23
    PORTC ^= 1 << PC5;    // LED toggeln
24
        return;
25
    }
26
27
    switch (irmp_data.command) {
28
29
    case KEY_OPERATE: /* on/off */
30
        {
31
            if ((irmp_data.flags & IRMP_FLAG_REPETITION) == 0) {
32
                ml.flags ^= ML_FLAG_OFF;
33
                if (ml.flags & ML_FLAG_OFF) {
34
                    level_r = 0;
35
                    level_g = 0;
36
                    level_b = 0;
37
                } else {
38
                    moodlight_wakeup();
39
                }
40
            }
41
            break;
42
        }
43
44
    case KEY_1:
45
        {
46
            ml.mode = 1;
47
            ml.delay = 6;
48
            ml.flags = 0;
49
            ml.cycle = 1;
50
            tick = 1;
51
            break;
52
        }
53
54
    case KEY_2:
55
        {
56
            ml.mode = 2;
57
            ml.delay = 4;
58
            ml.flags = 0;
59
            ml.cycle = 1;
60
            tick = 1;
61
            break;
62
        }
63
64
    case KEY_3:
65
        {
66
            ml.mode = 3;
67
            ml.delay = 4;
68
            ml.flags = 0;
69
            ml.cycle = 0;
70
            tick = 1;
71
            break;
72
        }
73
    }
74
}

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Christian S. schrieb:
> Die IF-Abfrage benutzt !=, das ich mit "ungleich" übersetze.
> Falls ("Vergleich1 auf Ungleichheit" ODER "Vergleich2 auf Ungleichheit")
> toggle die LED und return.


> Das würde die Aktionen auslösen, sofern nur einer der Partner ungleich
> wäre.

Was meinst Du mit "die Aktionen auslösen"? Das Ansteuern der LED?

> Das ist aber falsch.

So aber stehts da.


> Was genau macht eigentlich das Return?

Die Funktion verlassen. Da die Funktion als void deklariert ist, gibt 
es keinen Rückgabewert, also steht auch nichts hinter return.

Der Code, der auf das return -Statement folgt, wird nur durchgeführt, 
wenn BEIDE, also Protokoll und Adresse korrekt sind.

von Christian S. (roehrenvorheizer)


Lesenswert?

Hallo nochmal,

mit "Aktionen auslösen" meine ich das Durchlaufen der 
Switch-case-Anweisungen. Wobei sie auch dann durchlaufen werden, wenn 
falsche Tasten gedrückt werden. Mit falschen meine ich solche, die 
keinerlei Aktion auslösen sollen.

Nachdem nun klar ist, was das Return genau macht, ist die ganze Sache 
einfacher zu verstehen:
Die IF-Abfrage macht einen Vergleich auf Ungleichheit. Falls etwas 
ungleiches vorkommt, führe toggeln und return aus. Springe aus 
"moodlight_step" heraus. Die Switch-case-Abfrage wird nicht mehr 
durchlaufen, so daß keinerlei Tastendrücke eine "Aktion" auslösen 
können.
Falls Gleichheit vorliegt, die switch-case Abfragen durchlaufen und bei 
"richtiger" Taste eine Aktion ausführen.

Danke für's Helfen, das hat mich schon weiter gebracht.

mit freundlichem Gruß

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Christian S. schrieb:
> Danke für's Helfen, das hat mich schon weiter gebracht.

Bei so elementaren Dingen einer Programmiersprache bringt einen 
übrigens auch ein Buch weiter -- "Programmieren in C", Brian Kernighan 
& Dennis Ritchie, 2. Ausgabe, Hanser-Verlag.

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.