Forum: Mikrocontroller und Digitale Elektronik Rückgabewert zum Vergleich


von __Son´s B. (bersison)


Lesenswert?

Hallo.
Habe hier mit dem Vergleichen eines Rückgabewertes Probleme.
Folgend der spannendste Auszug;
__________________________________
uint8_t Led_Ein(uint8_t Led)
{
switch(Led)
{
case 1: LED_HIGH; Led=1; break;
case 2: LED_MID; Led=2; break;
default: LED_LOW; Led=3; break;
}
return Led;
}

int main(void)
...
MitWert=ADC_Read_Avg(3,64);
if(MitWert>=OBER_BEREICH)
{
if(Led_Ein(0)==2) Led_Ein(1);
else
{
Led_Ein(2);
Wait(2000);
Led_Ein(1);
}
...
_____________________________________

Nach meinem Verständniss, sollte es egal sein, was in der internen 
Klammer steht (Led_Ein(0)==2), da nur der Rückgabewert geprüft wird.

: Bearbeitet durch User
von Dennis S. (eltio)


Lesenswert?

So ganz verständlich finde ich deine Frage nicht... vielleicht weil ich 
kein Fragezeichen sehe?

Gruß
Dennis

: Bearbeitet durch User
von __Son´s B. (bersison)


Lesenswert?

Anstatt "if(Led_Ein(0)==2)" nur den Rückgabewert vergleicht, sendet er 
erst einmal die "0" an die Funktion Led_Ein().

Wie kann die Funktionsrückgabe ausgewertet werden, OHNE die Funktion neu 
an zu steuern?

: Bearbeitet durch User
von __Son´s B. (bersison)


Lesenswert?

__Son´s B. schrieb:
> Wie kann die Funktionsrückgabe ausgewertet werden, OHNE die Funktion neu
> an zu steuern?
Globale Variable "Led_Rueckgabe", statt Variable innerhalb der Funktion 
"Led"?

: Bearbeitet durch User
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

__Son´s B. schrieb:
> Folgend der spannendste Auszug;
Nimm doch in Zukunft bitte die passenden Tags. Einfach so, wie es knapp 
über der Eingabebox zu lesen ist:
1
Antwort schreiben
2
Wichtige Regeln - erst lesen, dann posten!
3
....
4
Formatierung (mehr Informationen...)
5
6
    [c]C-Code[/c]

von Georg G. (df2au)


Lesenswert?

__Son´s B. schrieb:
> Anstatt "if(Led_Ein(0)==2)" nur den Rückgabewert vergleicht, sendet er
> erst einmal die "0" an die Funktion Led_Ein().

Ja was denn sonst?
Es wird Led_Ein(0) aufgerufen und dann
der Rückgabewert mit 2 verglichen.
Was ist dir an der Konstruktion unklar? Schau dir notfalls das 
Assemblerlisting an.

von M. K. (sylaina)


Lesenswert?

Deine Funktion Led_Ein() ist ziemlich funktionslos bzgl Rückgabewert 
denn du gibts nur zurück, was du übergeben hast. Das ist so ähnlich als 
würde der Chef seiner Sekretärin eine volle Kaffeetasse geben und sie 
anweisen, ihm eine volle Kaffeetasse zu geben.
Sinnvoller wäre es die entsprechende LED "einzuschalten" (was du ja 
anscheinend auch machst) und dann zu überprüfen ob das geklappt hat und 
diesbezüglich einen Rückgabewert generieren.

: Bearbeitet durch User
von Georg G. (df2au)


Lesenswert?

Michael K. schrieb:
> denn du gibts nur zurück, was du übergeben hast

Nicht, wenn er wie im Beispiel led_ein(0) aufruft. Dann bekommt er eine 
3 zurück.

Ich fürchte aber, dass ich noch nicht ganz begriffen habe, was er 
eigentlich machen will.

von __Son´s B. (bersison)


Lesenswert?

Ja, ich erkenne gerade meinen Denkfehler!
Rückgabe ist unnötig/falsch.

Eigentlich möchte ich zu jeder Zeit vergleichen, welche LED gerade "1" 
ist, um direkte Sprünge von LED1 auf LED3 und umgekehrt, zu vermeiden.
Zustandsänderungen müssen grundsätzlich über LED2 laufen.
Daher muss eine eigene Var mit dem letzten LED-Zustand im main() zur 
Verfügung stehen!?!

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

__Son´s B. schrieb:
> if(Led_Ein(0)==2)

Ist immer false (3 != 2), daher wird immer else ausgeführt.

: Bearbeitet durch User
von Dennis S. (eltio)


Lesenswert?

__Son´s B. schrieb:
> Daher muss eine eigene Var mit dem letzten LED-Zustand im main() zur
> Verfügung stehen!?!

Oder als globale Variable oder als static Variable in "Led_Ein()".

von M. K. (sylaina)


Lesenswert?

__Son´s B. schrieb:
> Eigentlich möchte ich zu jeder Zeit vergleichen, welche LED gerade "1"
> ist, um direkte Sprünge von LED1 auf LED3 und umgekehrt, zu vermeiden.
> Zustandsänderungen müssen grundsätzlich über LED2 laufen.

Das heißt du hast 3 LEDs (1, 2, 3) und willst nur dass es immer über 2 
zum anderen Zustand geht? Mach das doch über einen Zähler der nur die 
Zählrichtung ändert sowie er ein Extrema erreicht hat.

von haeh (Gast)


Lesenswert?

Wenn Du schon mit Oberwert arbeitest und Du so wie das verstehe eine LED 
auf LOW, MID oder HIGH haben willst je nachdem wie der Poti steht dann 
mach's doch direkt im main ohne doppelten Vergleich.

von haeh (Gast)


Lesenswert?

Oh immer den ganzen Thread durchlesen.
Ist aber auch mit drei LEDs sinnvoller den switch ins main zu packen und 
dort die Variable anlegen.
Male Dir Deine Statemachine auf's Papier und guck Dir die Übergänge an.

von __Son´s B. (bersison)


Lesenswert?

haeh schrieb:
> mit drei LEDs sinnvoller den switch ins main zu packen
Macht es grundsätzlich nicht mehr Sinn, das main() so schlank wie 
möglich zu gestalten, damit das main() besser zu lesen ist.
Die Folge wären mehrere Funktionen udn Macros.

Was sagt eure Praxis und Erfahrung dazu?

von Dennis S. (eltio)


Lesenswert?

__Son´s B. schrieb:
> Macht es grundsätzlich nicht mehr Sinn, das main() so schlank wie
> möglich zu gestalten, damit das main() besser zu lesen ist.
> Die Folge wären mehrere Funktionen udn Macros.
>
> Was sagt eure Praxis und Erfahrung dazu?

Ja, in der Regel schon. Aber dazu müssen die Funktionen entsprechend gut 
designt sein.

: Bearbeitet durch User
von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

So gehts:
1
void Led_Ein(uint8_t Led)
2
{
3
    static uint8_t last_Led = 0xFF;      // FF = undefined
4
5
    if (last_Led != Led)
6
    {
7
        switch(Led)
8
        {
9
            case 1: LED_HIGH; break;
10
            case 2: LED_MID; break;
11
            default: LED_LOW; break;
12
        }
13
        last_Led = Led;
14
    }
15
}

Die Funktion gibt nichts mehr zurück (void), aber merkt sich intern 
immer den letzten Zustand. Die "Merkvariable" last_Led muss dafür static 
definiert sein, damit sie die Laufzeit der Funktion überlebt.

Wiederholte Aufrufe mit denselben Werten hintereinander werden nun 
einfach ignoriert. Die Leds ändern also nur noch ihren Zustand, wenn 
auch der Wert des Parameters (Led) sich ändert.

: Bearbeitet durch Moderator
von __Son´s B. (bersison)


Lesenswert?

Frank M. schrieb:
> Die Leds ändern also nur noch ihren Zustand, wenn
> auch der Wert des Parameters (Led) sich ändert.
Danke - macht auch keinen Sinn, wenn sich der Zustand über Stunden nicht 
ändert, aber eine Funktion ~1000/Sek neu gestartet wird.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

__Son´s B. schrieb:
> Danke - macht auch keinen Sinn, wenn sich der Zustand über Stunden nicht
> ändert, aber eine Funktion ~1000/Sek neu gestartet wird.

Man kann natürlich über den Sinn, eine Funktion zum Ändern von LEDs 
1000 mal pro Sekunde aufzurufen, obwohl sich gar nichts ändert, 
trefflich streiten.

Aber das ist Deine Sache.

: Bearbeitet durch Moderator
von __Son´s B. (bersison)


Lesenswert?

Diesbezüglich ist mir erst gestern ein Licht (oder LED) auf gegangen ...
Aber genau dafür lasse ich mir in Foren inspirieren und veränderte 
Blickwinkel auf zeigen!
DANKE :)

von haeh (Gast)


Lesenswert?

__Son´s B. schrieb:
> haeh schrieb:
>> mit drei LEDs sinnvoller den switch ins main zu packen
> Macht es grundsätzlich nicht mehr Sinn, das main() so schlank wie
> möglich zu gestalten, damit das main() besser zu lesen ist.
> Die Folge wären mehrere Funktionen udn Macros.
>
> Was sagt eure Praxis und Erfahrung dazu?

Wenn Du rein objektorientiert arbeitest ist das main immer klein.
Wenn Du prozedural arbeitest kommt es drauf an wie umfangreich Dein 
Projekt ist.
Zehn Zeilen Code mehr im main wenn sie noch gut dokumentiert sind macht 
keinen Unterschied.
Und idR packt man die Statemachine da rein und läßt die dann 
entsprechende Funktionen aufrufen und den Status ändern.
Bei Dir braucht es ja nur ein togglen zwischen den LEDs wenn ich Dich 
nun richtig verstanden habe.

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.