Forum: Mikrocontroller und Digitale Elektronik C Bedingungen die immer wieder neu erfüllt sein müssen


von Sebastian (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem. Für eine uC-Netzteilsteuerung durchläuft der 
Code Bedingungen. Diese sind von einander abhängig. Ist Bedingung 1 
erfüllt. Teste die Bedingung 2. Ist Bedingung 1 & 2 erfüllt teste 
Bedingung 3 usw...

In C sind das dann schwer verschachtelte If else Codes. Echt ätzend.

 if(portreg->portb.bit.PWR_OK == 1)
  {
    if(portreg->portb.bit.SOFT_OK == 1)
    {
      // Reset Flg ...
      if(uTimeControlFlg.sTimeControlFlg.DCOver == 1)
      {
        ....
        if{...}
      }
      else....
    else
    {
       // Generate error
    }
  usw.

Wie man schnell sieht ist dieser Code total unübersichtlich. Mir würden 
hier so eine Art Statemachine viel besser gefallen (switch case). 
Allerdings müßte man dann in jedem Zustand alle vorhergehenden 
Bedingungen testen. Ist auch Mist.

Vieleicht kennt Ihr das Problem oder habt einen guten 
Codestruktur-Vorschlag. Bin echt gespannt auf Eure Lösungen.

Sebastian


von ARM-Fan (Gast)


Lesenswert?

Ohne die genaue Applikation zu kennen kann man nicht
pauchal sagen, ob ne Statemachine helfen würde.

Ich finds persönlich aber deutlich übersichtlicher,
wenn man in solchen fällen, wie deinem obigen, auf das
NICHTerfülltsein der Bedingung(en) testet und dann ggfs. abbricht

Beispiel:

bool TesteBedingungen()
{
  // teste nacheinander verschiedene bedingungen
  if (bedingung_1 == FALSE) return FALSE;
  if (bedingung_2 == FALSE) return FALSE;
  if (bedingung_3 != 42) return FALSE;

  // alles erfüllt
  return TRUE;
}

Ohne die Einrückerei liest sich sowas viel besser.
Abgesehen davon muß man sowieso ab und an mal überlegen,
ob sich das was man abtesten möchte, nicht auch anders
ausdrücken läßt.


von Marko B. (glagnar)


Lesenswert?

&& und || sind Deine Freunde.

von Werner B. (Gast)


Lesenswert?

a && b == !(!a || !b)


usw.

von Klaus (Gast)


Lesenswert?

Man kann eine State-Machine definieren.
Erst überlegt man, wieviele Zustände es im System überhaupt gibt.
Jeder existierende State kriegt eine Nummer.
Die Nummer zählt / setzt man entsprechend in jedem State.

Die Übergangbedingungen von einem bestehenden Zustand in den nächsten 
fragt man ab, indem die jeweiligen Übergangsbedingungen über  &&  und 
||  wie bereits geraten verknüpft werden.

In main()  erfolgt die Verzweigung über  case  anhand der 
Zustandsnummer.


von Sonic (Gast)


Lesenswert?

Du kannst dir auch 'Merkerbytes' anlegen und jedemal wenn eine Bedingung 
erfüllt wird ein Bit dafür setzen und löschen wenn sie nicht erfüllt 
ist. Dann kannst du die Merkerbytes mit Switch/case und der richtigen 
Verknüpfung abfragen.
Leider kenne ich das Programm nicht und weiß somit nicht wie einfach 
Merkerbits gesetzt werden können (z.B. bei der AD-Wandlung gleich 
Grenzwerte abfragen? Wenn Schalter oder Ausgänge betätigt/gesetzt 
werden?). Dazu müsstest du die Ein- Ausgänge in einer Schleife abfragen 
(nicht dort vernüpfungen abfragen).

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.