www.mikrocontroller.net

Forum: Compiler & IDEs zwischen zwei Zuständen toggeln


Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mike (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Andy,

ja wollte ich.

Autor: Matthias Lipinsky (lippy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich glaube, du solltest das etwa so tun:
switch ( zustand ) 
{
//******************************************************************
case ( c_Zustand_A ):
//- entry ---------------------------------
if ( zustand_alt != c_Zustand_A )
{
    zustand_alt = c_Zustand_A;
    timer ( 0 );                     // timer löschen
}
//- periodic ------------------------------
  // no periodic action
//- transitions: button -------------------
timer ( taste_gedrückt);            // timer läuft, wenn gedrückt
if ( timer_wert > 3000 ) zustand = c_Zustand_B;
//- exit ----------------------------------
if ( zustand != c_Zustand_A )
{
  // no exit action 
}
//******************************************************************
case ( c_Zustand_B ):

// .. identisch wie A
}

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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.