Forum: Mikrocontroller und Digitale Elektronik Verknüpfung zweier Bedingungen geht nicht


von Matze05 (Gast)


Lesenswert?

Hallo zusammen,

könnt ihr mir bitte sagen,

warum die else schleife im folgenden Fall nicht durchlaufen wird?


motorstrom=200;
motorstromalt=210;

nur wenn die beiden oberen Werte sich um mehr als 40 voneinander 
unterscheiden soll der neue Wert in der If Bedingung ausgegeben werden.

Zum Test habe ich die Variablen mit festen Werten 200 und 210 belegt, 
aber die If bedingung ist bei mir dennoch leider immer wahr.

Würdet ihr mir bitte sagen woran das liegt?
die Klammern um (motorstrom+40) habe ich auch schon testweise entfernt, 
natürlich bei beiden schleifen. habe es auch schon mit << und >> 
probiert

Viele Grüße,

Matthias.

if (motorstromalt < (motorstrom+40) || motorstromalt > (motorstrom+40))
    {
    lcd_gotopos(3,17); lcd_writezahl(motorstrom) ;   //AD_WErt ausgeben 
als Strom I=U/R
    //lcd_gotopos(1,1); lcd_writezahl(motorstromalt) ;
    }


  else
  {
  lcd_gotopos(1,1); lcd_writetext(" sdfsdfsdfsdfsdfsdfs  ") ;
  }

von Karl H. (kbuchegg)


Lesenswert?

> if (motorstromalt < (motorstrom+40) || motorstromalt > (motorstrom+40))


ich vereinfache das mal ein bischen in der Schreibweise. Dann sieht man 
den springenden Punkt besser.


   if (   a < b  ||  a > b  )


mit Ausnahme des Falles a gleich b ist es wohl immer der Fall, dass a 
entweder kleiner als b oder a größer als b ist. Unabhängig davon, welche 
Wetre a bzw b haben.

  if (motorstromalt < (motorstrom - 40) ||    // Minus !
      motorstromalt > (motorstrom + 40) )     // Plus !

oder aber:

Nimm die Differenz ziwschen den beiden Werten. Und wenn die kleiner als 
-40 oder größer als +40 ist, dann unterscheiden sich die beiden um 
mindestens 40

von J.-u. G. (juwe)


Lesenswert?

Matze05 schrieb:
> Würdet ihr mir bitte sagen woran das liegt?

Weil 210 < 200+40 ist.

von Oliver J. (skriptkiddy)


Lesenswert?

Deine Bedingung zieht immer, außer wenn
motorstromalt == (motorstrom+40)

Meinstest du vielleicht:
if (motorstromalt < (motorstrom-40) || motorstromalt > (motorstrom+40))


Ich hätte es so geschrieben:
if (abs(motorstrom-motorstromalt)>40)


Gruß Oliver

von Matze05 (Gast)


Lesenswert?

Karl Heinz Buchegger schrieb:
> if (motorstromalt < (motorstrom - 40) ||    // Minus !
>       motorstromalt > (motorstrom + 40) )     // Plus !
>
> oder aber:
>
> Nimm die Differenz ziwschen den beiden Werten. Und wenn die kleiner als
> -40 oder größer als +40 ist, dann unterscheiden sich die beiden um
> mindestens 40

vielen Dank Euch beiden für die Antwort. Es ist für mich schon spät und 
ich kann nicht mehr so klar denken.

Also hatte ich keinen Syntaxfehler in der Bedingung, sondern diese nur 
falsch gestellt.

wie kann ich den das nun mit der Differenz schreiben? Diesen Weg finde 
ich nämlich auch sehr gut.

Wie kann ich denn den Betrag von dem Ergebnis bilden z.B. 200-210

und dann schreibe ich daraus die Bedingung

if (( motorstromalt-motorstrom)>20 )   // ist es so korrekt, es fehlt 
aber noch die Betragsbildung, die kann ich noch nicht

Viele Grüße,

Matthias.

von Oliver J. (skriptkiddy)


Lesenswert?

Matze05 schrieb:
> if (( motorstromalt-motorstrom)>20 )   // ist es so korrekt, es fehlt
> aber noch die Betragsbildung, die kann ich noch nicht

abs(...) - diese Funktion findest du in der stdlib


Gruß Oliver

von J.-u. G. (juwe)


Lesenswert?

Matze05 schrieb:
> if (( motorstromalt-motorstrom)>20 )

Wieso plötzlich 20?

von Micha K. (Gast)


Lesenswert?

Ohne jetzt nachgeprüft zu haben:

Um Betrag zu bilden: abs()
Also:
if (abs(motorstromalt - motorstrom) > 20) ....

(Nicht getestet und ohne Garantie...)

von Matze05 (Gast)


Lesenswert?

danke,

ich teste die funktion in ruhe morgen und auch warum ich nicht selber 
auf die vergleichslösung gekommen bin.

Wieso 20?

das ist ein noch nicht weiter festgelegter wert

bei mir sprang die Stromanzeige immer zwischen 145 und  155 hin und her.

Es soll eine Konstanz herrschen und so genau muss das in meinem Fall 
nicht sein, da die Motorströme in einem Bereich von 150 bis 1A gemessen 
werden sollen.
auf 50mA genau ist mir daher völlig ausreichend.

Mir wird der Motorstrom nur zu oft im program abgefragt, unnötig hohe 
Prozessorbelastung und das LCD-wird unnötig oft beschrieben. Ich kann 
dann schwankende Motorstromwerte aufgrund der schnellen Anzeigewechsel 
auch gar nciht mehr erkennen.

Das muss ich morgen auch noch irgendwie stoppen. Es gibt da wohl im 
Tutorial von uC eine Multitaskinganleitung, da steht wohl drin wie man 
solche Abfragen begrenzt.


Viele Grüße,

Matthias.

von holger (Gast)


Lesenswert?

>Es soll eine Konstanz herrschen und so genau muss das in meinem Fall
>nicht sein, da die Motorströme in einem Bereich von 150 bis 1A gemessen
>werden sollen.
>auf 50mA genau ist mir daher völlig ausreichend.

50mA Auflösung bei 150A Meßbereich.
0.03% Nicht schlecht ;)

von H.Joachim S. (crazyhorse)


Lesenswert?

soll bestimmt 150mA-1A heissen :-)

von Matze05 (Gast)


Lesenswert?

ja, 150mA-1A

sorry, war leider gestern schon spät

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Matze05 schrieb:
> die else schleife
Ist das die Schwester der if-Schleife?
http://www.if-schleife.de

von Matze05 (Gast)


Lesenswert?

Lothar Miller schrieb:
> Matze05 schrieb:
>> die else schleife
> Ist das die Schwester der if-Schleife?
> http://www.if-schleife.de

:-)

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
Noch kein Account? Hier anmelden.