Gleiches Problem wie: Einmaliges Reagieren auf.

Gast #2115781
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
Gast #2115796
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.
Gast #2115888
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
}
Gast #2116662
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
Gast #2116668
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

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