Forum: Mikrocontroller und Digitale Elektronik Warum funktioniert dieses Zählerprogramm nicht?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von WarumNur (Gast)


Lesenswert?

Hallo Leute,

Ich habe folgendes Programm am laufen, welches auch funktioniert:
1
If ((Flow1 = 1) and (Flow1Helper = 0)) then
2
   Flow1Counter = Flow1Counter + 1
3
   Flow1Helper = 1
4
end if
5
    
6
If ((Flow1 = 0) and (Flow1Helper = 1)) then
7
   Flow1Helper = 0
8
end if

Nun wollte ich das optimieren:
1
If ((Flow1 = 1) and (Flow1Helper = 0)) then
2
   inc(Flow1Counter)
3
else
4
    Flow1Helper = Flow1
5
end if

Aber warum funktioniert das nicht?????

Beitrag #5387066 wurde vom Autor gelöscht.
von Johannes (Gast)


Lesenswert?

du musst in deiner if-Abfrage auch vergleichen und darfst keine werte 
setzen

was ist denn das für eine Sprache?

Was funktioniert denn nicht?

von WarumNur (Gast)


Lesenswert?

Mikrobasic

von WarumNur (Gast)


Lesenswert?

Ich umschreibe es mal universell:

Wenn der Eingang eins ist und der Merkerflag null ist, dann
Erhöhe den Wert
Sonst
Ist der Merkerflag gleich wie der Eingang

von Joachim (Gast)


Lesenswert?

Im zweiten Beispiel wird Flowhelper niemals 1.

Gruß

von Starlord (Gast)


Lesenswert?

if (Flow1 == 1)...

2x == verwenden!

von Äxl (geloescht) (Gast)


Lesenswert?

Johannes hat deine intenzijon sicherlich erkannt. ;)
er wollte sicher auf die beiden zu setzenden gleichheitszeichen 
hinweisen
1
If ((Flow1 == 1) and (Flow1Helper == 0)) then
https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/if-then-else-statement#example-1

in Basic scheint das aber mit einem Gleichheitszeichen völlig okay zu 
sein.

von Hugo (Gast)


Lesenswert?

Starlord schrieb:
> if (Flow1 == 1)...
>
> 2x == verwenden!

In BASIC?

von LCD (Gast)


Lesenswert?

WarumNur schrieb:
> If ((Flow1 = 1) and (Flow1Helper = 0)) then
>    inc(Flow1Counter)
> else

Es heißt:
incr
nicht inc

von LCD (Gast)


Lesenswert?

Nachtrag: Jedenfalls in anderen Basic-Dialekten. Und die Klammern danach 
kann man normalerweise auch sparen.

von Johannes R. (oa625)


Lesenswert?

LCD schrieb:
> Es heißt:
> incr
> nicht inc

Doch!
In MBasic heißt es inc(), genauso wie der Assembler-Befehl inc.

Gruß
J.R.

von Andy (Gast)


Lesenswert?

Wenn du einfach du positiven Flanken an Flow1 zählen willst:
1
If ((Flow1 = 1) and (Flow1Helper = 0)) then
2
   inc(Flow1Counter)
3
end if
4
Flow1Helper = Flow1

von PittyJ (Gast)


Lesenswert?

Früher hat man print in den Code eingefügt, und dann selbst mal 
geschaut, was die Variablen machen.
Dafür ist das Programm wohl schon zu groß.

von Markus F. (mfro)


Lesenswert?

WarumNur schrieb:
> Nun wollte ich das optimieren:

In Anlehnung an den bekannten Spruch mit der übriggebliebenen 
Gemüsesuppe und dem saftigen Rindersteak:

Ein Basic-Programm optimiert man am besten dadurch, indem man es durch 
ein hübsches C- oder Assembler-Programm ersetzt.

: Bearbeitet durch User
von .bas (Gast)


Lesenswert?

Markus F. schrieb:
> Ein Basic-Programm optimiert man am besten dadurch, indem man es durch
> ein hübsches C- oder Assembler-Programm ersetzt.

Das läst mich vermuten, das du keine andere höhere Programmiersprache 
kennst.

von Stefan ⛄ F. (stefanus)


Lesenswert?

Entschuldigung, C und Assembler sind zwar gut aber ganz sicher nicht 
"schön".

von Dieter F. (Gast)


Lesenswert?

WarumNur schrieb:
> Aber warum funktioniert das nicht?????
1
If ((Flow1 = 1) and (Flow1Helper = 0)) then
2
   Flow1Counter = Flow1Counter + 1
3
   Flow1Helper = 1
4
end if

Flow-Helper = 1  aus dem IF-Zweig wegoptimiert :-)
                 bleibt im "optimierten" Fall auf 0, wenn inkrementiert 
wird
1
If ((Flow1 = 1) and (Flow1Helper = 0)) then
2
   inc(Flow1Counter)
3
else
4
    Flow1Helper = Flow1
5
end if

von Stephan (Gast)


Lesenswert?

Markus F. schrieb:
> WarumNur schrieb:
>> Nun wollte ich das optimieren:
>
> In Anlehnung an den bekannten Spruch mit der übriggebliebenen
> Gemüsesuppe und dem saftigen Rindersteak:
>
> Ein Basic-Programm optimiert man am besten dadurch, indem man es durch
> ein hübsches C- oder Assembler-Programm ersetzt.

Naja so eine Abfrage sollte Basic schon noch können. Aber inc ist mir in 
Basic auch noch nicht unter gekommen. Vielelicht hilft es ja 
Flowcounter=Flowcounter+1 zu schreiben.

von Ralf (Gast)


Lesenswert?

Debugger starten und schauen wo es hackt.

von asdf (Gast)


Lesenswert?

Ralf schrieb:
> Debugger starten und schauen wo es hackt.

Wo soll da eine Hacke sein?

von Reinhard R. (reirawb)


Lesenswert?

WarumNur schrieb:
> If ((Flow1 = 1) and (Flow1Helper = 0)) then
>    Flow1Counter = Flow1Counter + 1
>    Flow1Helper = 1
> end if
>
> If ((Flow1 = 0) and (Flow1Helper = 1)) then
>    Flow1Helper = 0
> end if

ist eben nicht das selbe wie

> If ((Flow1 = 1) and (Flow1Helper = 0)) then
>    inc(Flow1Counter)
> else
>     Flow1Helper = Flow1
> end if

Der else-Zweig deckt alle Fälle ab, die nicht der if-Bedingung 
entspricht. Das sind in deinem Fall:
 ((Flow1 = 1) and (Flow1Helper = 1))

 ((Flow1 = 0) and (Flow1Helper = 0))

 ((Flow1 = 0) and (Flow1Helper = 1))

du willst aber nur bei
 ((Flow1 = 0) and (Flow1Helper = 1))

die zweite Anweisung ausführen.

Du siehst den Unterschied?

Gruß Reinhard

: Bearbeitet durch User
von Lothar M. (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andy schrieb:
> Wenn du einfach du positiven Flanken an Flow1 zählen willst: ...
Richtig, so und nur so wird das gemacht: eine Speichervariable merkt 
sich den alten Wert des Eingangs, damit dieser im Programmablauf mit dem 
aktuellen Wert verglichen werden kann. Und nach diesem Vergeleich wird 
der aktuelle Wert für den nächsten Durchlauf als alten Wert, und das 
Spiel beginnt von vorn.

Diese Vorgehensweise ist vollkommen unabhängig von der 
Programmiersprache (über die übrigens nur die streiten, die nur eine 
oder zwei kennen und können).

WarumNur schrieb:
> Ich habe folgendes Programm am laufen, welches auch funktioniert
Reduzieren wir das Programm einfach mal und nehmen die 
Steigende-Flanken-Zählergeschichte aus der Merker-Geschichte heraus, 
dann sieht der exakt funktionsgleiche Code vom ersten Post so aus:
1
 // Flanken erkennen und zählen
2
 If ((Flow1 = 1) and (Flow1Helper = 0)) then
3
    Flow1Counter = Flow1Counter + 1
4
 end if
5
6
 // Merker verwalten
7
 If ((Flow1 = 1) and (Flow1Helper = 0)) then
8
    Flow1Helper = 1
9
 end if
10
 
11
 If ((Flow1 = 0) and (Flow1Helper = 1)) then
12
    Flow1Helper = 0
13
 end if
Weil Flow1Helper eh' nur 1 oder 0 sein kann, könnte man das auch so 
schreiben (darüber einfach mal eine Minute ausgiebig nachdenken):
1
 // Flanken erkennen und zählen
2
 If ((Flow1 = 1) and (Flow1Helper = 0)) then
3
    Flow1Counter = Flow1Counter + 1
4
 end if
5
6
 // Merker verwalten
7
 If (Flow1 = 1) then
8
    Flow1Helper = 1
9
 end if
10
 
11
 If (Flow1 = 0) then
12
    Flow1Helper = 0
13
 end if
Und damit kann man es auch so schreiben:
1
 // Flanken erkennen und zählen
2
 If ((Flow1 = 1) and (Flow1Helper = 0)) then
3
    Flow1Counter = Flow1Counter + 1
4
 end if
5
6
 // Merker verwalten
7
 Flow1Helper = Flow1
q.e.d.

: Bearbeitet durch Moderator

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]
  • [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.