Forum: Compiler & IDEs zwischen zwei Zuständen toggeln


von Mike (Gast)


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

von Andy (Gast)


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

von Mike (Gast)


Lesenswert?

Hallo Andy,

ja wollte ich.

von Matthias L. (Gast)


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

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.