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

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.