Forum: PC-Programmierung Funktion in while nur einmal aufrufen (AVR-GCC)


von Christian B. (christian_buchner)


Lesenswert?

Hallo,

ich habe einen Code der etliche Funktionen umfasst. Der Code im AVR 
läuft in einer while(1) schleife.

Z.b. eine display_on() und display_off() funktion. Diese Funktionen 
schalten halt einen PIN auf High oder Low.

Nun soll die Funktion jedoch nur einmal ausgeführt werden. Also wenn das 
Display bereits eingeschaltet wurde nicht noch einmal "einschalten". Da 
durch den Display Reset etc. der in der ON Funktion auch ein Delay 
ausgeführt werden muss sollte dies nur einmal geschehen.

Wie mache ich das das wenn eine funktion ausgeführt wird nicht nochmal 
ausgeführt wird?

Dann noch arbeite ich viel mit if / else.

Wäre einer so nett mir an einem kurzen Beispiel switch mit case zu 
erklären?

Danke euch.

von STK500-Besitzer (Gast)


Lesenswert?

Christian B. schrieb:
> Wie mache ich das das wenn eine funktion ausgeführt wird nicht nochmal
> ausgeführt wird?
>
> Dann noch arbeite ich viel mit if / else.
>
> Wäre einer so nett mir an einem kurzen Beispiel switch mit case zu
> erklären?

Du musst dir einfach nur merken, ob das Display eingeschaltet ist oder 
nicht.

Warum sollte man das mit einer Switch Case-Abfrage behandeln, wenn 
sowieso nur zwei Zustände möglich sind?

von Oliver S. (oliverso)


Lesenswert?

Wenn du eine Funktion nur einmal aufrufen willst, dann rufe sie nur 
einmal auf.

Das mit der while-Schleife ist prima, aber alles, was zur 
Initialisierung nur einmal beim Start des Programms aufgerufen werden 
darf, gehört vor dieses while.

Oliver

von STK500-Besitzer (Gast)


Lesenswert?

Oliver S. schrieb:
> Das mit der while-Schleife ist prima, aber alles, was zur
> Initialisierung nur einmal beim Start des Programms aufgerufen werden
> darf, gehört vor dieses while.

Außer, wenndas Display während der While-Schleife aufgrund anderer 
Bedingungen ein-/ausgeschaltet werden soll...

von Christian B. (christian_buchner)


Lesenswert?

Also es handelt sich um etliche funktionen die "gestartet" oder 
"gestopt" werden sollen. Aber halt nur einmal.

Als beispiel:

Ein High signal an Pin X sagt Display einschalten, low sagt ausschalten.

Nun steht bei mir in der while das

wenn pin variable == 1 { display_on(); } else { display_off(); }

Das läuft durch die while und klappt auch. Jedoch wirs das Display bei 
an dann jedesmal "resetet" und die "defines" wie schriftart etc neu ins 
display geschrieben. Dies soll jedoch nur einmal erfolgen.

Also suche ich eine art die dann sagt. Display wurde eingeschaltet muss 
nicht nochmal eingeschaltet werden sondern erst wenn es aus war / ist.

Und das muss eben in der while erfolgen.

von Der E. (rogie)


Lesenswert?

Christian B. schrieb:
> wenn pin variable == 1 { display_on(); } else { display_off(); }

Wie wärs zb so:

if (pin_variable == 1 && Display_an==0) { display_on(); Display_an=1; }
if (pin_variable == 0 && Display_an==1){ display_off();Display_an=0; }

: Bearbeitet durch User
von Mark B. (markbrandis)


Lesenswert?

Christian B. schrieb:
> Wie mache ich das das wenn eine funktion ausgeführt wird nicht nochmal
> ausgeführt wird?

Generell: Mit einem Flag, also einer Hilfsvariablen.

Zum Beispiel so:
1
// Initialisierung zu Beginn des Programms
2
bool display_was_set = false;
3
4
// Dazwischen steht irgend ein anderer Code
5
6
// Jetzt wird die Hilfvariable abgefragt
7
if (display_was_set == false)
8
{
9
    set_the_display();
10
    display_was_set = true;
11
}


Siehe auch:
https://de.wikipedia.org/wiki/Flag_%28Informatik%29

von Der E. (rogie)


Lesenswert?

Der E. schrieb:
> Christian B. schrieb:
>> wenn pin variable == 1 { display_on(); } else { display_off(); }
>
> Wie wärs zb so:
>
> if (pin_variable == 1 && Display_an==0) { display_on(); Display_an=1; }
> if (pin_variable == 0 && Display_an==1){ display_off();Display_an=0; }

Oder auch:

if (pin_variable != Display_an)
{
  if (Display_an == 1)
  {
    display_off();
  }
  else
  {
    display_on();
  }
  Display_an = pin_variable;
}

von Christian B. (christian_buchner)


Lesenswert?

Ja genau sowas. Manchmal sind es nur "denkfehler". Bzw. logisches denken 
;)

Und dann wird mir immer gesagt if/else braucht mehr takte als ein switch 
mit case.

Daher die frage/n.

von Georg (Gast)


Lesenswert?

Christian B. schrieb:
> Und dann wird mir immer gesagt if/else braucht mehr takte als ein switch
> mit case.

Und das siehst du dem Display an, dass es 5µs später einschaltet? Und 
selbst wenn, wen juckts?

Georg

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.