mikrocontroller.net

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


Autor: Sebastian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: ARM-Fan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Marko B. (glagnar)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
&& und || sind Deine Freunde.

Autor: Werner B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
a && b == !(!a || !b)


usw.

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.


Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.