Forum: Mikrocontroller und Digitale Elektronik Begrenzung eines Wertes auf 0


von Der Bastler (Gast)


Lesenswert?

Hallo
Mit diesem kleinen Programm möchte ich "wert" auf min. 0 begrenzen.
1
wert = 100;
2
if ( !(PINA & (1<<PINA7)) )
3
      {        
4
      if(wert > 0);
5
        {
6
        wert = wert - 10;
7
        }
8
      if(wert<=0)
9
        {
10
        wert = 5;
11
        }  
12
      _delay_ms(1);
13
      }
Mit dem drücken des Tasters wird wert um -10 gemacht. Stelle ich 
if(wert<11)
dann funktioniert es. Bei kleineren Zahlen geht es sofort in -.
Sorry, bin Anfänger und versuche es zu verstehen.
LG

von A. S. (Gast)


Lesenswert?

Vermutlich ist wert unsigned und wird später als signed angezeigt.

Bitte Code posten

von Udo S. (urschmitt)


Lesenswert?

Der Bastler schrieb:
> if(wert > 0);

was soll hier das Semikolon hinter der Bedingung?

von Der Bastler (Gast)


Lesenswert?

Der Code mit Anzeige und geänderten Namen.
1
if ( !(PINA & (1<<PINA7)) )
2
      {        
3
      if(OCR1B > 0);
4
        {
5
        OCR1B = OCR1B - 10;
6
        }
7
      if(OCR1B<0)
8
        {
9
        OCR1B = 5;
10
        }  
11
      _delay_ms(1);
12
      }  
13
      
14
     utoa(OCR1B,wert,10);        // Berechne wert von OCR1B
15
     lcd_printlc(3,2,"OCR1B =");    // Anzeige CCR1B
16
     lcd_printlc(3,11,"        ");    // lösche aleten Wert
17
     lcd_printlc(3,12,wert);      // Anzeige wert 
18
     
19
     grad = OCR1B / 16;
20
     utoa(grad,grade,10);        // Berechne Wert von OCR1B für Winkel
21
     lcd_printlc(4,3,"Grad =");
22
     lcd_printlc(4,11,"        ");  
23
     lcd_printlc(4,12,grade);
Die Anzeige der Werte erfolgt mit utoa korrekt, ebenfalls die Bgrenzung 
nach oben auf 2890. Wenn ich 0 erreiche geht es in den negativen 
Bereich.
OCR1B kann doch nur 0 -3999 haben (Timer 16 Bit mit 16MHz Quarz auf 
20ms)
Es geht dabei nur um die Begrenzung von OCR1B auf 0.

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


Lesenswert?

Der Bastler schrieb:
> if(OCR1B > 0);
Wie Udo S. schrieb:
> was soll hier das Semikolon hinter der Bedingung?

Mit dem Semicolon ist die if-Abfrage beendet. Da steht also eigentlich 
sowas:
1
 if ( !(PINA & (1<<PINA7)) )
2
       {
3
       if(OCR1B > 0) {}; // hoppala
4
       OCR1B = OCR1B - 10;
5
       if(OCR1B<0)
6
       :

: Bearbeitet durch Moderator
von Der Bastler (Gast)


Lesenswert?

Udo S. schrieb:
> was soll hier das Semikolon hinter der Bedingung?

Danke, das war der Fehler. Brauche wohl doch bald eine Brille.

Beitrag #7092725 wurde von einem Moderator gelöscht.
von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Der Bastler schrieb:
> Brauche wohl doch bald eine Brille.
Könnte helfen. Dann findest du auch deinen alten Thread wieder und musst 
nicht jedesmal einen Neuen anfangen: 
Beitrag "Servo Einstellung und Anzeige in Grad"

von EAF (Gast)


Lesenswert?

Udo S. schrieb:
> was soll hier das Semikolon hinter der Bedingung?

Damit soll die IF Anweisung sofort beendet werden, damit der 
nachfolgende Code auf jeden Fall ausgeführt wird.
Und dieser Nachfolgenden Anweisungsblock solle einen eigenen unbenutzten 
Namensraum/Geltungsbereich öffnen.
(wozu auch immer)

von Udo S. (urschmitt)


Lesenswert?

EAF schrieb:
> Damit soll die IF Anweisung sofort beendet werden, damit der
> nachfolgende Code auf jeden Fall ausgeführt wird.

Ich weiss das, aber das "soll" war wohl eher ein "Uuups".

Der Bastler schrieb:
> Brauche wohl doch bald eine Brille.

Den Fehler hat jeder der meint C zu können schon gesucht. Und zwar mehr 
als einmal.
Ist also keine Schande

von Stefan F. (Gast)


Lesenswert?

Müsste die IDE nicht an dieser Stelle eine Warnung anzeigen?

von Hans (Gast)


Lesenswert?

Udo S. schrieb:
> was soll hier das Semikolon hinter der Bedingung?

Scharfer Blick, nicht schlecht!

Und ein schönes Beispiel für eine völlig verrückte Programmiersprache, 
die solchen Unfug zulässt.

Jeden Tag aufs Neue ein Wunder, dass unsere Welt noch immer 
zusammenhält, irgendwie zumindest, wenn man sich überlegt, mit welchen 
mistigen Sprachen Software gebaut wird. Wahnsinn.

von Ingo Less (Gast)


Lesenswert?

Seit wann kann ein OCR negativ werden?

Du solltest eine Dummy-Variable nutzen und nach der Versrbeitung dem
Register zuweisen, dubble-buffered oder in Software timersynchron

von EAF (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Müsste die IDE nicht an dieser Stelle eine Warnung anzeigen?

Anweisungen und auch Anweisungsblocks dürfen leer sein.
Also nein.

Kann/wird sich allerdings ändern.
z.B. while(1);

von Stefan F. (Gast)


Lesenswert?

EAF schrieb:
> Anweisungen und auch Anweisungsblocks dürfen leer sein.

Ist mir schon klar. Von einer zeitgemäßen IDE erwarte ich trotzdem 
solche Hilfestellungen.

von N. M. (mani)


Lesenswert?

Stefan ⛄ F. schrieb:
> Müsste die IDE nicht an dieser Stelle eine Warnung anzeigen?

Ein statisches Code Analyse Tool schaut nochmal ganz anders als ein 
Compiler.

Probier das Beispiel Mal hier aus:
https://www.gimpel.com/demo.html

Das kommt eine Warnung "If Statement has empty Body..." und ähnliches.

von Helge (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Von einer zeitgemäßen IDE erwarte ich trotzdem solche Hilfestellungen

ein compiler ist doch keine "Mutti" :-)

von A. S. (Gast)


Lesenswert?

Helge schrieb:
> ein compiler ist doch keine "Mutti" :-)

Wer solche Warnungen unterdrückt oder ignoriert ist von Mutti wohl zu 
heiß gebadet worden. Da muss dann der Compiler Ran.

von Rolf M. (rmagnus)


Lesenswert?

EAF schrieb:
> Stefan ⛄ F. schrieb:
>> Müsste die IDE nicht an dieser Stelle eine Warnung anzeigen?
>
> Anweisungen und auch Anweisungsblocks dürfen leer sein.
> Also nein.

Natürlich darf da trotzdem gewarnt werden. Es wird an vielen Stellen 
gewarnt, die zwar laut Sprachdefinition korrekt wären, aber so aussehen, 
als seien sie so nicht gedacht. Ein if ohne etwas, das dann auch 
abhängig von der Bedingung ausgeführt wird, gehört da eigentlich dazu, 
denn es gibt  keinen sinnvollen Grund, sowas zu machen.

> Kann/wird sich allerdings ändern.
> z.B. while(1);

Das ist aber was ganz anderes.

von Forist (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Müsste die IDE nicht an dieser Stelle eine Warnung anzeigen?

In C?
Warum sollte eine leere Anweisung verboten sein?
Die Syntax-Regeln erlauben soviel logische Sch..ße zu bauen ...
Warnungen sind der verzweifelte Versuch dem C die 
Assemblernähe/-freiheit auszutreiben

von J. S. (engineer) Benutzerseite


Lesenswert?

Kann es sein, dass das nicht ganz stimmt und man vorausschauen rechnen 
sollte?

IF ( (Wert-10) <0( THEN wert = 0
ELSE Wert = Wert - 10

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


Lesenswert?

Jürgen S. schrieb:
> und man vorausschauen rechnen sollte?
Nicht nötig, wenn man es hinterher wieder zurechtflickt:
1
if (wert<=0)
2
   wert = 5;
Aber richtig: sowas deutet darauf hin, dass woanders wahrscheinlich auch 
noch eigenartige Stellen im Code sind.

Ich hätte diesen Programmabschnitt annähernd funktionsgleich etwa so 
geschrieben:
1
      if (wert > 15)  wert -= 10;
2
      else            wert  = 5;

Und dann auch gleich das rechenzeitverschwendende _delay_ms() 
weggelassen.

von Rolf M. (rmagnus)


Lesenswert?

Jürgen S. schrieb:
> Kann es sein, dass das nicht ganz stimmt und man vorausschauen rechnen
> sollte?
>
> IF ( (Wert-10) <0( THEN wert = 0
> ELSE Wert = Wert - 10

Das unterscheidet sich vom vorherigen Code nicht wirklich, außer dass 
die Subtraktion jetzt zweimal durchgeführt wird. Welchen Vorteil hat das 
deiner Ansicht nach?
Beide Varianten haben den Nachteil, dass sie erfordern, dass wert 
vorzeichenbehaftet ist, obwohl es im Normalfall immer größer als 0 ist.
Deshalb würde ich diese Variante bevorzugen:

Lothar M. schrieb:
>       if (wert > 15)  wert -= 10;
>       else            wert  = 5;

Man könnte noch die magischen Werte ersetzen:
1
#define STEP_SIZE 10
2
#define WERT_MIN  5
3
4
if (wert > STEP_SIZE + WERT_MIN)
5
    wert -= STEP_SIZE;
6
else
7
    wert  = WERT_MIN;

: Bearbeitet durch User
von A. S. (Gast)


Lesenswert?

Rolf M. schrieb:
> Man könnte noch die magischen Werte ersetzen:

🎹 ... this is the road ...

von Stefan F. (Gast)


Lesenswert?

Helge schrieb:
>> Von einer zeitgemäßen IDE erwarte ich trotzdem solche Hilfestellungen
> ein compiler ist doch keine "Mutti" :-)

Ich habe "IDE" geschrieben, nicht "Compiler".

von Stefan F. (Gast)


Lesenswert?

Forist schrieb:
> Warum sollte eine leere Anweisung verboten sein?

Es geht nicht um "verboten", sondern um "wahrscheinlich so nicht 
gewollt". Von meinen Entwicklungsumgebungen bin ich entsprechende 
Warnhinweise gewohnt.

Auch z.B. wenn man einen switch/case schreibt, in dem ein wahrscheinlich 
case vergessen wurde. Oder wenn man eine Variable liest, bevor man sie 
beschrieben hat.

von Klaus H. (klummel69)


Lesenswert?

Stefan ⛄ F. schrieb:
> Müsste die IDE nicht an dieser Stelle eine Warnung anzeigen?

Mit der richtigen Option meckert der (gcc) Compiler
1
     if (x<0);
2
//src/main.cpp:16:13: warning: suggest braces around empty body in an 'if' statement [-Wempty-body]

von Rolf M. (rmagnus)


Lesenswert?

Stefan ⛄ F. schrieb:
> Auch z.B. wenn man einen switch/case schreibt, in dem ein wahrscheinlich
> case vergessen wurde. Oder wenn man eine Variable liest, bevor man sie
> beschrieben hat.

Gerade bei dem switch/case nervt es aber auch. Bei mir kommt es da schon 
mal öfters vor, dass nicht alle Werte abgefragt werden, weil es an der 
Stelle einfach keinen Sinn ergibt. Dann steht halt im Code sowas:
1
switch (...)
2
{
3
    ...
4
    default:
5
        ; // shut up stupid GCC warning
6
}

So ein nutzloser leerer default wäre dann eigentlich viel eher das, wo 
ich mir stattdessen eine Warnung wünschen würde.

Klaus H. schrieb:
> Stefan ⛄ F. schrieb:
>> Müsste die IDE nicht an dieser Stelle eine Warnung anzeigen?
>
> Mit der richtigen Option meckert der (gcc) Compiler
>      if (x<0);
> //src/main.cpp:16:13: warning: suggest braces around empty body in an
> 'if' statement [-Wempty-body]

Lustige Warnung. Der Inhalt klingt irgendwie unsinnig. Der Compiler 
schlägt also vor, das zu ändern in:
1
    if (x<0){;}
Warum ist das jetzt besser?

: Bearbeitet durch User
von rossi (Gast)


Lesenswert?

Rolf M. schrieb:
> Warum ist das jetzt besser?

Weil jetzt viel eher auffällt, dass der Anweisungsblock der if-Bedingung 
leer ist. Das Semikolon im ersten Beitrag des TO hab' ich auch erst 
nicht gesehen.

von Rolf M. (rmagnus)


Lesenswert?

rossi schrieb:
> Rolf M. schrieb:
>> Warum ist das jetzt besser?
>
> Weil jetzt viel eher auffällt, dass der Anweisungsblock der if-Bedingung
> leer ist. Das Semikolon im ersten Beitrag des TO hab' ich auch erst
> nicht gesehen.

Die Klammern machen das if aber auch nicht weniger überflüssig.

von Karl (Gast)


Lesenswert?

Der Bastler schrieb:
> Udo S. schrieb:
>> was soll hier das Semikolon hinter der Bedingung?
>
> Danke, das war der Fehler. Brauche wohl doch bald eine Brille.

Wäre mit Python nicht passiert.

von Klaus H. (klummel69)


Lesenswert?

Rolf M. schrieb:
> Die Klammern machen das if aber auch nicht weniger überflüssig.

Leutens, jetzt nicht am Thema vorbei diskutieren:

Es ging um das Aufdecken eines Semikolon zwischen if Bedingung und 
nachfolgender Klammerung.
1
  if(wert > 0);     // warning: suggest braces around empty body in an 'if' statement [-Wempty-body]
2
  {
3
    wert = wert - 10;
4
  }

von Stefan F. (Gast)


Lesenswert?

Rolf M. schrieb:
> if (x<0){;}
> Warum ist das jetzt besser?

Weil man so etwas nicht aus Versehen hin schreibt. Wenn das so im Code 
steht, war es mit Sicherheit Absicht.

von Rolf M. (rmagnus)


Lesenswert?

Mir ging es eigentlich darum, dass man das auch nicht mit Absicht 
hinschreibt. Also könnte der Compiler, statt zusätzlicher Klammern 
vorzuschlagen, einfach sagen, dass da ein if ohne Inhalt steht.

von Stefan F. (Gast)


Lesenswert?

Rolf M. schrieb:
> Also könnte der Compiler, ... vorzuschlagen

Ich sehe es wie Helge

Helge schrieb:
> ein compiler ist doch keine "Mutti"

Diese ganzen Checks gehören meiner Meinung nach in ein separates 
Programm ausgelagert welches in die IDE eingebunden ist. Die Zeiten wo 
mir mit Edlin programmierten sind nämlich vorbei.

von Ralf G. (ralg)


Lesenswert?

Rolf M. schrieb:
> Mir ging es eigentlich darum, dass man das auch nicht mit Absicht
> hinschreibt. Also könnte der Compiler, statt zusätzlicher Klammern
> vorzuschlagen, einfach sagen, dass da ein if ohne Inhalt steht.

Hat er ja ;-) - Als Bestätigung, dass man das so wollte, wurden die 
Klammern 'ausgemacht'.

Sowas ähnliches:
1
while ( PINA & 0x01 )
2
    ;
... da ist es Absicht.

: Bearbeitet durch User
von c-hater (Gast)


Lesenswert?

Rolf M. schrieb:

>
1
>     if (x<0){;}
2
>
> Warum ist das jetzt besser?

Weil damit angezeigt wird, dass dieser Schwachsinn, so schwachsinnig er 
auch ist (und immer bleiben wird) BEABSICHTIGT ist. Es ist schlicht sehr 
einfach, versehentlich ein ";" zu schreiben, aber schon sehr viel 
unwahrscheinlicher, versehentlich ein "{;}" zu schreiben.

Das eigentliche Ziel ist also, sehr wahrscheinlich nicht so gewollte 
Sachen nochmal zum Nachdenken vorzulegen. Und der Vorschlag dient dazu, 
für den unwahrscheinlichen Fall, dass der Schwachsinn doch beabsichtigt 
war, die Warning für die Zukunft nicht mehr erscheinen zu lassen. Der 
Schwachsin darf also Bestand haben, wenn es denn wirklich so gewollt 
ist. Wozu auch immer...

Aber wer würde sich mit den richtigen C-Cracks auf eine Sinndiskussion 
einlassen? Das ist genauso nutzlos, wie mit erz-islamischen Taliban über 
Frauenrechte zu streiten oder mit dem Papst über den Sinn des Zölibats.

Eiferer jeder Coleur, die ihren ganzen Lebensinhalt darin sehen, eine 
"Schrift" möglichst wortgenau zu befolgen, sind einfach keine dankbaren 
Diskussionspartner.

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.