INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Rechnen in C - Was ist denn nun richtig?
17.03.2016, 20:41 (Dieser Beitrag wurde zuletzt bearbeitet: 17.03.2016 21:26 von Stephan_56.)
Beitrag #1
Question Rechnen in C - Was ist denn nun richtig?
Hallo Forum,

ich habe folgende Formel als Basis, die ich dem Datenblatt des BMP180 Temperaturfühlers entnommen habe:
Code:
B3 = (((AC1 * 4 + X3) << oss) +2) / 4
das habe ich wie folgt umgesetzt (die 3 Wertezuweisungen davor wurden für alle Formeln verwendet bzw. berechnet):
Berechnung 1:
Code:
int ac1 = 8356
long x3 = 188
const unsigned char oss = 3
long b3 = (((ac1 * 4 + x3) << oss) + 2) / 4

Damit bekomme ich den Wert -63779 heraus.

mit
Berechnung 2:
Code:
if (oss == 3) b3 = ((int32_t) ac1 * 4 + x3 + 2) << 1
kommt 67296 (ohne -) heraus.

Es müßte doch auch so gehen:
Berechnung 3:
Code:
b3=(pow(ac1 * 4 + x3, oss ) + 2) / 4
Ergebnis: -2147483648

Korrekt müßte die Berechnung mit der IF-Zeile sein, weil, wenn damit weitergerechnet wird, ein brauchbares Endergebnis herauskommt.
Warum führen denn die anderen Berechnungen nicht zum gleichen Ergebnis?
Das "<<" schiebt doch die Bits um den Wert von "oss" oder?

Oops, da fällt mir etwas auf: In Excel würde das mit:
Code:
= (((ac1 * 4 + x3) *( 2 ^ oss)) +2) / 4
gerechnet.
In C umgesetzt:
Code:
b3=(((ac1 * 4 + x3)*pow(2,oss))+2) / 4;
Ergebnis: -63779
Also wie Berechnung 1.

So, ich denke, ich habe nun genug Verwirrung gestiftet. Steigt da noch einer durch und vor allem: Welche Berechnung ist richtig???? Huh

Grüße,
Stephan
------------------------------------------
Kinder betet, Papa lötet. Gott gebe, daß es klebe.
Satzzeichen können Leben retten: Komm wir essen Opa.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2016, 20:53
Beitrag #2
RE: Rechnen in C - Was ist denn nun richtig?
Hallo Stephan,
also die Verwirrung ist dir gelungen....
WEIl...was für Variablentypen hast du da eingesetzt ? Und liegen die Berechnungen im zulässigen Wertebereich der jeweiligen Variablen ? Weil wenn du das nicht beachtest gehts in die Hose...
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2016, 20:58 (Dieser Beitrag wurde zuletzt bearbeitet: 17.03.2016 21:01 von Stephan_56.)
Beitrag #3
RE: Rechnen in C - Was ist denn nun richtig?
So, hab die Deklaration oben eingefügt

Also die Deklarationen sollten schon passen. Der Compiler läuft problemlos durch. Hinsichtlich der Wertebereiche gebe ich dir natürlich Recht.
Für Berechnung 2 stimmt ja das Ergebnis
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2016, 21:11
Beitrag #4
RE: Rechnen in C - Was ist denn nun richtig?
(17.03.2016 20:58)Stephan_56 schrieb:  So, hab die Deklaration oben eingefügt

Also die Deklarationen sollten schon passen. Der Compiler läuft problemlos durch. Hinsichtlich der Wertebereiche gebe ich dir natürlich Recht.
Für Berechnung 2 stimmt ja das Ergebnis

...und das nächste ist das wenn du Variablen verschiedenen Typs miteinander verrechnest das du da hinter die Zahl noch den Datentyp z.B. ein "L" anhängen mußt das der Compiler weiß das er diesen Wert auf long erweitern muß....ist auch so ne Abseitsfalle...mußte mal in der Reference danach suchen...
lgbk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2016, 21:23
Beitrag #5
RE: Rechnen in C - Was ist denn nun richtig?
Hmmpf.

Ich bewundere Menschen, die ihr Handwerkszeug beherrschen, bkExclamation

Das sind Dinge, die ich bislang weder gelesen, noch erahnt habe. War bislang nur in VBA heimisch und habe C vermieden. Aber diese kleinen Microcontroller üben ihren Reiz auf mich aus. Am Anfang war es ja mit dem blink blink noch nicht so wild, aber so langsam geht es ans Eingemachte...

Aber zurück zum Thema. Hinsichtlich der Variablen habe ich lediglich ein anderes Programm "aufgebohrt", das sich an den Datenblatt-Deklarationen orientiert und damit kommen auch plausible und korrekte Ergebnisse heraus.

Beim Nachvollziehen des C-Codes und dem Vergleich mit dem Datenblatt stieß ich halt auf diese Unstimmigkeiten. Ursprünglich kann "oss" einen Wert von 0 bis 3 annehmen und der wird in o.a. 1. Berechnung gezeigt. Das "aufgebohrte" Programm hat dies mit 4 Zeilen Code gelöst, die ich wiederum vereinfachen wollte. Das Ergebnis siehst du im ersten Beitrag.

Grüße,
Stephan
------------------------------------------
Kinder betet, Papa lötet. Gott gebe, daß es klebe.
Satzzeichen können Leben retten: Komm wir essen Opa.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2016, 21:37
Beitrag #6
RE: Rechnen in C - Was ist denn nun richtig?
Hallo Stephan,
was ist den Sinn und Zweck dieser Übung?
Willst du die BMP180-Library meiden und es selbst versuchen?

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2016, 21:49
Beitrag #7
RE: Rechnen in C - Was ist denn nun richtig?
Hi Arne,

genau.
Hintergrund ist, daß der BMP180 mit anderen I2C-Sensoren an einem DUE betrieben werden soll. Nun hat ja SCL und SDA (19+20) bereits pullup-Widerstände. Die hat der BMP180 auch bereits und liefert dort falsche Werte.

Da der BMP180 ja üblicherweise über

Code:
SFE_BMP180 baro;
angesprochen wird, kann ich diese Funktion nicht auf Wire1 umleiten. In einem anderen Thread habe ich das angefragt und bislang keine Antwort erhalten.

Also wollte ich den BMP180 zu Fuß ansprechen und das dann über Wire1 gewährleisten. SDA1 und SCL1 sind beim DUE ohne pullups (anders als beim MEGA).

Hab ich das jetzt so ausgedrückt, daß man das verstehen kann oder denke ich zu kompliziert?

Grüße,
Stephan
------------------------------------------
Kinder betet, Papa lötet. Gott gebe, daß es klebe.
Satzzeichen können Leben retten: Komm wir essen Opa.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
17.03.2016, 22:07
Beitrag #8
RE: Rechnen in C - Was ist denn nun richtig?
Die Probleme mit dem DUE habe ich mitbekommen, aber auch keine Idee dazu. Dodgy

Weil der BMP180 sich am DUE nicht mit anderen Sensoren verträgt willst du den an die zweite Wire des DUE klemmen. Das geht zwar aber die Library lässt sich nicht auf die zweite Wire umbiegen. So habe ich jetzt das Problem verstanden.

Wenn es aber doch nur die Pullups sein sollten die stören, kannst du die doch rauslöten?
Versorgt wird der BMP180 aber mit 5V weil der einen 3,3V Regler auf der Platine hat?

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Rechnen mit float und unsigned long Rudi 3 307 03.06.2016 12:41
Letzter Beitrag: hotsystems
  Rechnen mit dem Arduino Rudi 15 1.075 30.03.2016 13:31
Letzter Beitrag: Rudi
  LCD schreibt mal richtig,mal Krickel? malsehen 14 994 21.03.2016 09:21
Letzter Beitrag: hotsystems
  Constrain-Befehl -wie gehts richtig? Nimes 8 954 14.03.2016 18:00
Letzter Beitrag: DL1AKP
  Über Pin43 den Pin42 steuern, ist das so richtig? arduinofan 5 493 01.02.2016 21:01
Letzter Beitrag: ardu_arne
  Arduino kann nicht rechnen?! Maxi290997 11 1.254 16.12.2015 16:26
Letzter Beitrag: amithlon
  C-Code für eine substring-Funktion: richtig ? HaWe 1 671 27.05.2015 14:01
Letzter Beitrag: HaWe
Information Rechnen mit variablen Jim 3 1.828 22.05.2015 16:44
Letzter Beitrag: Jim
  Eingang analog oder digital? Wie macht man es richtig? Gelegenheitsbastler 3 986 25.03.2015 15:45
Letzter Beitrag: Bitklopfer
  [gelöst:] A.Mega: Pin4 bei Programmstart richtig setzen HaWe 0 587 28.09.2014 09:53
Letzter Beitrag: HaWe

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste