Wie Kombination von auftretenden Zuständen einfach realisieren?

Gast #2116947
Lesenswert?

Hallo,
ich möchte gerne auf 6 verschiedenen Zustände reagieren:

zustand a;
zustand b;
zustand c;
zustand d;
zustand e;
zustand f;

Dies Zustände können auch in verschiedenen Kombinationen bzw. gemeinsam 
auftreten. Da ich nun nicht alle 63 möglichen Kombinationen so...

if( zustand a == 0 &&
    zustand b == 1 &&
    zustand c == 0 &&
    zustand d == 1 &&
    zustand e == 0 &&
    zustand f == 0 )

tu was;

...vordefinieren will, wollte ich fragen, welche Möglichkeiten es gibt, 
dies anders zu realisieren. Würde mich freuen, wenn mir hierzu jemand 
weiterhelfen könnte.

Gruß
Axel
#2116960
Lesenswert?

"bau" dir eine Zustandsmatrix, welche als "Adressbits" deine Zustände 
hat, und an der jeweiligen Adresse die benötigte Funktion.

Deine Matrix muß dann genau 2^5 Adressen haben. Alle Adressen müssen 
sinnhafte Werte haben. Z.B.

Zustand fedcba
        001010  = Adresse 10 dezimal --> Wert 67
        001011  = Adresse 11 dezimal -_> Wert 99


in deinem Array an Adrese 10 steht dann "67", welches gleichbedeutend 
ist mit der Aktion "LED grün einschalten" (oder was weiß ich was du 
machen möchtest)

der Zustand 001011 ist unerlaubt. Daher bewirkt "99" die Aktion "Hupe 
einschalten" (oder sonstewas)
Gast #2116982
Lesenswert?

Bei vielen verschiedenen Aktionen würde ich das ganze als 
Funktionspointer-Array deklarieren und die Zustände dann als Index ins 
Array verwenden.

    PROGMEM const void (*FuncPtr[64])(void) =
    {
        (void *) GetAdc0,
        (void *) GetAdc1,
        (void *) GetAdc2,
        (void *) GetAdc3,
        ....
        (void *) LCD_Line1,
        (void *) LCD_Line2,
        (void *) RLY_Out,
        (void *) EPILOG,
    };

int main(void)
{
    void (*fp)(void);  /* pointer to function */

    fp = (void *) pgm_read_word_near(FuncPtr + StateSum);
    (*fp)();

Gruß Anja
Gast #2116995
Lesenswert?

Hallo,
danke für die schnellen Antworten.
Eine Zustandsmatrix brauche ich in jedem Fall, die die einzelnen

@Vivil: Was meinst du mit:

> Na wie sieht es mit 1 2 4 8 16 32 aus?


zustand a = 0 * 1
zustand b = 1 * 2
zustand c = 0 * 4
zustand d = 1 * 8
zustand e = 0 * 16
zustand f = 0 * 32

Summe = 10

if ( Summe == 10 )
send("Zustand b und a detektiert")

Allerdings muss ich ja die Zahlenwerte auch irgendwo hinterlegen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren