mikrocontroller.net

Forum: Compiler & IDEs Annäherungswert in While Schleife


Autor: Mos Kito (moscito)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mahlzeit zusammen,

ich bräuchte mal bitte etwas Unterstützung, da ich noch nicht ganz 
sattelfest bin in C.

Aufgabenstellung ist einen Motor mit Poti auf eine bestimmte Position zu 
fahren. Da beim Stoppen der Sollwert des Potis fast immer überfahren 
wird, würde ich es gerne mit einem Annäherungswert lösen.
Also: Fahre auf Position x +/- 10 ADC Einheiten.
Beim compilieren dieser while Anweisung streikt der GCC allerdings 
(...expected ')' before AND) :

//snip
void gotopos (uint8_t motor, uint16_t position)
  {
  while (((adcwert (motor)) < (position + 10)) AND (((adcwert (motor)) > position - 10)))
    {
                      // Motor fahren in die eine oder andere Richtung ...
    }
  }
//snap

"adcwert()" ist natürlich eine Funktion, der der ADC Kanal (motor) 
übergeben wird und die einen uint16_t zurück gibt. Position ist ein Wert 
zwischen 0 und 999.

Ich weiß, dass die AND Verknüpfung bei IF Abfragen funktioniert.
Bei While vielleicht nicht?

Für alle Hinweise zum Täter bin ich sehr dankbar.

Thx

Moscito

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AND ist meiner meinung  nach kein C Standard, oder bin ich jetzt 
verwirrt...

sondern && ist was du suchst...

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
„AND“ gips in C nicht.  Das heißt „&&“ (oder „&", wenn bitweise).

Autor: Mos Kito (moscito)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sackzement! Das ging aber schnell!

Es ist ein Kreuz mit den vielen "angefangenen" Programmiersprachen.

&& ist natürlich richtig und funzt auch (schäm).

Vielen Dank Euch!!!

Moscito

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mos Kito schrieb:
> Sackzement!

lol :D

Autor: Mos Kito (moscito)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für die Lateiner:

Das Wort Sackzement hat seinen Ursprung im mittelalterlichen 
Kirchenlatein und leitet sich von "sacrilegium cementalis" ab.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mos Kito schrieb:

> && ist natürlich richtig und funzt auch (schäm).

Wenn man es genau nimmt, solltest du allerdings den ADC nur einmal 
befragen. Ansonsten kann es sein, dass die erste Abfrage ein anderes 
Ergebnis liefert als die 2-te Abfrage.

Solche Abfragen kommen in der Gleitkommaprogrammierung häufig vor:
Sind 2 Werte bis auf eine bestimmte Epsilon Umgebung als gleich 
anzusehen?

Und programmiert wird das so:

bei Gleitkommawerten
  if( fabs( Wert - Vergleichswert ) < Epsilon )
bzw. bei Integer
  if( abs( Wert - Vergleichswert ) < Epsilon )

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im übrigen gibt es in C seit einiger Zeit tatsächlich ein 'and'.
Das schreibt sich aber klein und es muss der Header "iso646.h" 
includiert sein.

http://en.wikipedia.org/wiki/Iso646.h

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Im übrigen gibt es in C seit einiger Zeit tatsächlich ein 'and'.
> Das schreibt sich aber klein und es muss der Header "iso646.h"
> includiert sein.

Narf, aber schön ist das nicht...

Autor: Mos Kito (moscito)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Karl Heinz:

Der Ansatz mit dem Absolutwert ist natürlich um Längen eleganter gelöst. 
Da muss man erst mal draufkommen. Werd's gleich mal reinfriemeln.


#include "floskeln"

Danke ();

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.codeproject.com/KB/cpp/C___Code_Optimization.aspx

-> Boolean Expressions & Range checking

nur mal so neben bei...

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.