Forum: Mikrocontroller und Digitale Elektronik Gleiches Problem wie: Einmaliges Reagieren auf.


von Michael (Gast)


Lesenswert?

Hi Forum,
ich versuche mich gerade an meiner ersten Programmierung eines uCs.
Hierbei bin ich in etwa auf das selbe Problem wie im Beitrag
>> Einmaliges Reagieren auf gleiche, sich mehrfach wiederholende Zustände
gestoßen.

Das Unterbinden einer Ausführung, die auf ein bestimmtes reagiert, ist 
auch mein Problem. Ich hätte da eine Verständnisfrage, die mir hier 
bestimmte einige einfach erklären bzw. Tipps geben könnten, Wie ich im 
besagten Beitrag bereits gelesen habe, setzt man hierzu Flags ein. Meine 
Frage wäre, ob die unten dargestellte Vorgehensweise korrekt ist.

    if( zustand 1 detektiert)
    {
       zustand ausführen;
       flag = 1;
    }


    if( flag == 1)
    {
      if( zustand 1 nicht mehr vorhanden)
      flag = 0;
    }

Man wartet also erst bis der Zustand detektiert wurde und setzt dann ein 
Flag. Wenn Flag = 1 dann wartet das Programm solange bis der Zustand 
nicht mehr vorhanden und setzt dann das Flag zurück. Somit kann beim 
Auftreten des Zustandes wieder reagiert werden. Wäre das so richtig?
Micha

von Oliver J. (skriptkiddy)


Lesenswert?

Bitte nicht so abstrakt. Was genau willst du machen?


Gruß Skriptkiddy

von Michael (Gast)


Lesenswert?

Hallo Skript Kiddy,

tut mir Leid für die schwammige Beschreibung.

Wie bereits erwähnt habe ich leider in etwa das gleiche Problem wie in 
dem bereits erwähnten Beitrag. Mein Programm soll auf eine Folge von 
Ereignissen nur einmal reagieren. Ich bearbeite ebenfalls serielle Daten 
und dabei tritt das gleiche Zeichen 'A' mehrmals hintereinander auf.

Nach einer bestimmten Zeit tritt das Zeichen nicht mehr auf und es 
werden nur noch '0' gesendet. Wenn die Zeichenfolge 'A' wieder auftritt 
möchte ich wieder reagieren.

ich habe das mal nach dem bereits oben beschriebenen Schema gemacht. 
Allerdings reagiert mein Programm immer auf jedes 'A'.

Ich hoffe ich konnte das jetzt einigermaßen verständlich erklären.

von Skua (Gast)


Lesenswert?

Einfach letztes Zeichen merken und vergleichen.

von Oliver J. (skriptkiddy)


Lesenswert?

Eine State Machine ist denke ich die sauberste Lösung.

Zwei Zustände: Z0 ZA

Beim Wechsel von Z0 auf ZA tust du was. Bei Wechsel von ZA auf Z0 
nichts. In den Zuständen ebenfalls nichts tun.


Gruß Skriptkiddy

von Volker Z. (vza)


Lesenswert?

1
if(zeichen == 'A' && flag==0)
2
{
3
    mach(was);
4
    flag=1;
5
}
6
else
7
{
8
   flag=0;
9
}

so in etwa

von Andreas B. (Gast)


Lesenswert?

Michael schrieb:
> if( zustand 1 detektiert)
>     {
>        zustand ausführen;
>        flag = 1;
>     }
>
>
>     if( flag == 1)
>     {
>       if( zustand 1 nicht mehr vorhanden)
>       flag = 0;
>     }

Ins erste if muss noch der Test auf flag rein und das if (flag == 1) 
kannst du dir dann sparen, oder das alles in ein else-Zweig packen:
1
f()
2
{
3
        static bool primed = true;
4
5
        if (detected()) {
6
                if (primed) {
7
                        do_it();
8
                        primed = false;
9
                }
10
        } else {
11
                primed = true;
12
        }
13
}

von oldmax (Gast)


Lesenswert?

Hi
Eigentlich ist doch das gleiche Vorgehen angesagt, wie eine 
Flankenauswertung bei Eingängen. Da ich mit "C" noch auf Kriegsfuss 
stehe, hier mal das Vorgehen:
neues Zeichen lesen und mit abgelegtem Zeichen vergleichen.
Wenn ungleich, dann Flankenmerker setzen und Zeichen in Ablage.
Ist Flankenmerker gesetzt, Zeichen bearbeiten und danach Flankenmerker 
löschen.
Die Ablage wird mit einem Default bei Programmstart belegt.
Gruß oldmax

von mac4ever (Gast)


Lesenswert?

1
if (habs_erkannt == 0){
2
  if (zeichen_A_erkannt()){
3
    mach_was();
4
    habs_erkannt = 1;
5
  }
6
}
7
else  // hier wurde A erkannt und wartet jetzt auf 0
8
{
9
  if(zeichen_0_erkann()){
10
    habs_erkannt = 0;
11
  }
12
}

mach_was() wird einmalig ausgeführt. Anschließend wird auf die 
Zeichenfolge '0' gewartet und der Trigger wieder scharf geschaltet

von hanna (Gast)


Lesenswert?

Und nicht vergessen, alle Variablen, die oft
und "asyncron" beschrieben werden könnten, als
"volatile" zu deklarieren, damit sie der Compiler
nicht optimiert.

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.