Forum: Mikrocontroller und Digitale Elektronik Wie Kombination von auftretenden Zuständen einfach realisieren?


von Axel (Gast)


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

von Peter II (Gast)


Lesenswert?

jeden zustand ein bit in einen byte zuordnen und dann nur noch das byte 
vergleichen?

von Vivil (Gast)


Lesenswert?

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

von Wegstaben V. (wegstabenverbuchsler)


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)

von Anja (Gast)


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

von Axel (Gast)


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.

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.