Forum: Mikrocontroller und Digitale Elektronik Programmteil in C nur einmal durchlaufen.


von Robert (Gast)


Lesenswert?

Hallo,

ich würde gerne in meinem C Program bei einem Einsprung in eine 
while-Schleife einen Teil gerne nur einmal machen. Was ist hiefür die 
eleganteste Lösung?
Könnt ihr mir ein paar tipps geben wie ihr das macht? Mit einer Semaphor 
bzw. einem Flag? Welchen Typ nehmt ihr? Bit-Variable?

Das was im else-Zweig steht, würde ich gerne immer nur einmal machen.
1
while (guc_menu == MENU)
2
{  
3
 if (gbt_timercount_1 == ON) // Semaphor (500ms) gesetzt?
4
  {
5
   gbt_timercount_1 = OFF; // Semaphor zurücksetzen
6
7
   v_monitoring ();
8
   v_auswertung ();
9
   v_temp_ausgabe ();
10
   v_skalierung ();
11
      
12
   if (gbt_pushbutton_onoff)
13
    {
14
     symbole (0x47,0x50);
15
     v_regelung ();    // Regeln (PID)
16
    }
17
   else       // Regelung ausschalten 
18
    {  
19
     symbole (0x47,0x00);            
20
     v_write_mcp4728 (MCP4728, CON_MCP4728_CHA, HALFSCALE);
21
     v_write_mcp4728 (MCP4728, CON_MCP4728_CHC, HALFSCALE);
22
     v_ausgabe_variable (0, 11, HALFSCALE, 4, 0, 0);
23
     v_ausgabe_variable (0, 16, HALFSCALE, 4, 0, 0);
24
    }
25
   if (gbt_pushbutton_setup)
26
    {
27
     gbt_pushbutton_setup = OFF;
28
     guc_menu = MENU_SETUP;
29
    }
30
   }      
31
}






Grüße Robert

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Setze gbt_pushbutton_onoff in Deinem else-Zweig auf einen Wert ungleich 
0 und Du hast den Drops gelutscht.

von Robert (Gast)


Lesenswert?

Hmm, okay, danke.
gbt_pushputton ist aber eine bitvariable welche ich im keypad-interrupt 
toggle.
ich muss dann whrscheinlich eine neue bitwariable nehmen die ich extra 
hierfür benutze?!

grüße

von Dietrich L. (dietrichl)


Lesenswert?

Robert schrieb:
> ich würde gerne in meinem C Program bei einem Einsprung in eine
> while-Schleife einen Teil gerne nur einmal machen. Was ist hiefür die
> eleganteste Lösung?

Und wenn Du diesen einmaligen Teil einfach vor die while-Schleife 
schreibst?
Oder habe ich da was falsch verstanden?

von Pandur S. (jetztnicht)


Lesenswert?

Also.... Diese triviale Aufgabe beinhaltet eine endliche Anzahl 
Loesungen. Probier die doch einfach aus. Es ist sicher sehr lehrreich.

Natuerlich erst nach dem tagelangen, erfolglosen Absuchen des gesammten 
Internetes.
Die erste Fragestellung ist somit, wie bin ich sicher, das gesammte 
Internet abgesucht zu haben. Gurgel kann das zwar, aber erst auf die 
richtige Frage.

von Robert (Gast)


Lesenswert?

Vor der while-Schleife mache ich das auch. Ich habe aber die Möglichkeit 
in der while-Schleife die Regelung an- und wieder auszuschalten.
Ich weiß dass es eine Menge Lösungen gibt. Mich hatte nur interessiert 
wie ihr das macht und wie ihr die variablen dann nennt um den Überblick 
zu behalten wenn so etwas öffter vorkommt.

Grüße

von Der Andere (Gast)


Lesenswert?

Robert schrieb:
> die Regelung an- und wieder auszuschalten.

Das ist aber eine ganz andere Anforderung wie "nur einmal"!
Wenn du dein Problem so flapsig beschreibst kriegst du halt unpassende 
Antworten.

Wenn du etwas an oder ausschalten willst dann mach es über eine boolsche 
Variable, falls es mehrere logisch verknüpfte Dinge sind dann denke über 
einen Zustandsautomat nach.

von Pandur S. (jetztnicht)


Lesenswert?

Eine Zustandsmaschine oder Zustandsautomat, oder Statemachine, ist der 
normale Ansatz fuer solche Konstrukte.
Der Main-Loop ist aussen rum. Iterationen(Loops) gibt es innen drin 
keine, und gewartet wird nur genau an einem Ort, falls ueberhaupt.

Falls ueberhaupt, kann man dort spaeter einen Sleep() zum Stromsparen 
einfuegen.

Der Programmfluss faellt durch, wird nirgendwo blockiert.

von Axel S. (a-za-z0-9)


Lesenswert?

Robert schrieb:
> ich würde gerne in meinem C Program bei einem Einsprung in eine
> while-Schleife einen Teil gerne nur einmal machen. Was ist hiefür die
> eleganteste Lösung?

Da man nicht "in eine Schleife springt", sondern eher bei der
Programmausführung die Schleife erreicht, ist es ganz einfach:
man zieht diesen Code aus der Schleife heraus und davor. Dann
wird er vor dem Erreichen der Schleife genau einmal ausgeführt.


Robert schrieb:
> Vor der while-Schleife mache ich das auch. Ich habe aber die Möglichkeit
> in der while-Schleife die Regelung an- und wieder auszuschalten.

Wenn du die Regelung innerhalb der Schleife (mehrfach) an- und
ausschalten können willst, dann mußt du auch den else-Teil
mehrfach durchlaufen. Allerdings ist dann deine Programmlogik
fehlerhaft. Du hast jetzt nur 1 Bit: Regelung an oder aus.
Was du anscheinend willst, ist beim Wechsel von "an" zu "aus"
einen bestimmten Codeabschnitt einmalig auszuführen. Dann gehört
der aber nicht einfach in einen else Zweig, sondern du solltest
ein separates if dafür verwenden:

1
while (...)
2
{
3
  if (regelung_ist_an)
4
  {
5
    //zyklischer code für die Regelung
6
  }
7
8
  if (regelung_war_an && !regelung_ist_an)
9
  {
10
    //einmaliger code zum Abschalten der Regelung
11
  }
12
13
  //den letzten Wert merken
14
  regelung_war_an= regelung_ist_an;
15
}


Ach ja:

- deine Einrückung saugt
- deine Variablennamen saugen noch mehr

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Axel S. schrieb:
> Da man nicht "in eine Schleife springt",

Mir schwant böses.

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.