zwischen zwei Zuständen toggeln

Gast #612066
Lesenswert?

Hallo,

ich möchte zwischen zwei Zuständen, mit Hilfe eines Zustandsautomaten 
toggeln. Wird im Zustand A Taster T länger als 3 Sekunden betätigt so 
wird in Zustand B gewechselt. Wird in Zustand B Taster T länger als 3 
Sekunden betätigt so wird wieder in Zustand A gewechselt.
Bei einer steigenden Flanke und gedrückten Taster wird ein Timerwert 
abgespeichert und immer mit einem free running counter verglichen.

Im Zustand A:

if (steigende Flanke und Taster == An)
old_timer = get_timer();

if (Taster == An && get_delay(old_timer) > 3000)
Zustand = A;

***************************************************

Im Zustand B:

if (steigende Flanke und Taster == An)
old_timer = get_timer();

if (Taster == An && get_delay(old_timer) > 3000)
Zustand = A;


Das funktioniert aber nicht richtig, was muss ich noch verändern. Hab 
irgendwie ein Brett vorm Kopf

Danke
Gast #612077
Lesenswert?

Du wolltest sicherlich bei "Zustand A" schreiben:

if (Taster == An && get_delay(old_timer) > 3000)
Zustand = B;
          ^
          |
oder?
Ansonsten möglicherweise in den if-Anweisungen mal prophylaktisch 
Klammern setzen
Gast #612137
Lesenswert?

Ich glaube, du solltest das etwa so tun:
1
switch ( zustand ) 
2
{
3
//******************************************************************
4
case ( c_Zustand_A ):
5
//- entry ---------------------------------
6
if ( zustand_alt != c_Zustand_A )
7
{
8
    zustand_alt = c_Zustand_A;
9
    timer ( 0 );                     // timer löschen
10
}
11
//- periodic ------------------------------
12
  // no periodic action
13
//- transitions: button -------------------
14
timer ( taste_gedrückt);            // timer läuft, wenn gedrückt
15
if ( timer_wert > 3000 ) zustand = c_Zustand_B;
16
//- exit ----------------------------------
17
if ( zustand != c_Zustand_A )
18
{
19
  // no exit action 
20
}
21
//******************************************************************
22
case ( c_Zustand_B ):
23

24
// .. identisch wie A
25
}

timer ( 0 ) soll timer_wert auf Null setzen und halten
timer ( 1 ) erhöht den timer_wert periodisch

So programmiere ich immer Schrittketten

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