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
Bitte nicht so abstrakt. Was genau willst du machen? Gruß Skriptkiddy
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.
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
1 | if(zeichen == 'A' && flag==0) |
2 | {
|
3 | mach(was); |
4 | flag=1; |
5 | }
|
6 | else
|
7 | {
|
8 | flag=0; |
9 | }
|
so in etwa
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 | }
|
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.