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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.