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
So ganz verständlich finde ich deine Frage nicht... vielleicht weil ich kein Fragezeichen sehe? Gruß Dennis
:
Bearbeitet durch User
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
__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
__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] |
__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.
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
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.
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
__Son´s B. schrieb: > if(Led_Ein(0)==2) Ist immer false (3 != 2), daher wird immer else ausgeführt.
:
Bearbeitet durch User
__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()".
__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.
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.
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.
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?
__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
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
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.
__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
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 :)
__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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.