mikrocontroller.net

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


Autor: WarumNur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

Ich habe folgendes Programm am laufen, welches auch funktioniert:
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

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

Aber warum funktioniert das nicht?????

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

Bewertung
1 lesenswert
nicht 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?

Autor: WarumNur (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mikrobasic

Autor: WarumNur (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joachim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im zweiten Beispiel wird Flowhelper niemals 1.

Gruß

Autor: Starlord (Gast)
Datum:

Bewertung
-6 lesenswert
nicht lesenswert
if (Flow1 == 1)...

2x == verwenden!

Autor: Äxl (geloescht) (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Johannes hat deine intenzijon sicherlich erkannt. ;)
er wollte sicher auf die beiden zu setzenden gleichheitszeichen 
hinweisen
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.

Autor: Hugo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Starlord schrieb:
> if (Flow1 == 1)...
>
> 2x == verwenden!

In BASIC?

Autor: LCD (Gast)
Datum:

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

Es heißt:
incr
nicht inc

Autor: LCD (Gast)
Datum:

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

Autor: Johannes R. (oa625)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Andy (Gast)
Datum:

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

Autor: PittyJ (Gast)
Datum:

Bewertung
2 lesenswert
nicht 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ß.

Autor: Markus F. (mfro)
Datum:

Bewertung
-1 lesenswert
nicht 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
Autor: .bas (Gast)
Datum:

Bewertung
2 lesenswert
nicht 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.

Autor: Stefanus F. (stefanus)
Datum:

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

Autor: Dieter F. (jim_quakenbush)
Datum:

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

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

: Bearbeitet durch User
Autor: Stephan (Gast)
Datum:

Bewertung
-1 lesenswert
nicht 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.

Autor: Ralf (Gast)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Debugger starten und schauen wo es hackt.

Autor: asdf (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Ralf schrieb:
> Debugger starten und schauen wo es hackt.

Wo soll da eine Hacke sein?

Autor: Reinhard R. (reirawb)
Datum:

Bewertung
0 lesenswert
nicht 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
Autor: Lothar M. (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht 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:
 // Flanken erkennen und zählen
 If ((Flow1 = 1) and (Flow1Helper = 0)) then
    Flow1Counter = Flow1Counter + 1
 end if

 // Merker verwalten
 If ((Flow1 = 1) and (Flow1Helper = 0)) then
    Flow1Helper = 1
 end if
 
 If ((Flow1 = 0) and (Flow1Helper = 1)) then
    Flow1Helper = 0
 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):
 // Flanken erkennen und zählen
 If ((Flow1 = 1) and (Flow1Helper = 0)) then
    Flow1Counter = Flow1Counter + 1
 end if

 // Merker verwalten
 If (Flow1 = 1) then
    Flow1Helper = 1
 end if
 
 If (Flow1 = 0) then
    Flow1Helper = 0
 end if
Und damit kann man es auch so schreiben:
 // Flanken erkennen und zählen
 If ((Flow1 = 1) and (Flow1Helper = 0)) then
    Flow1Counter = Flow1Counter + 1
 end if

 // Merker verwalten
 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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.