[gelöst]Berechnung ergibt = 0

Ich stehe total auf dem Schlauch mit einer Funktion. Ich weiß nicht, wie ich eine Berechnung so durchführe, dass das Ergebnis nicht immer Null ist. Wenn ich newValue nur in eine andere Variable schiebe geht das noch. Aber wenn ich den Wert umrechnen möchte, kommt nur 0 heraus. Mit Sicherheit liegts an mir - ich weiß nur nicht wo...

Geht nicht:
void onFuelQty1000Change(unsigned int newValue) {
unsigned int t = newValue;
t = abs((t/65535)*1000);
display.setCursor(50,10);
display.print(t);
display.display();
}DcsBios::IntegerBuffer fuelQty1000Buffer(0x10d0, 0xffff, 0, onFuelQty1000Change);

Geht:
void onFuelQty100Change(unsigned int newValue) {
unsigned int h = newValue;
display.setCursor(70,10);
display.print(h);
display.display();

}DcsBios::IntegerBuffer fuelQty100Buffer(0x10d2, 0xffff, 0, onFuelQty100Change);

t/65535 : das da ist immer 0 und nur wenn t==65535 ist's 1

Hallo,

es wird von links nach rechts gerechnet vermutlich ist t/65535 schon < 1 und damit als int 0

ich würde das umdrehen,

Frage wozu absolut Wert, unsigned Int sind immer positiv.

void onFuelQty1000Change(unsigned int newValue) {
   // unsigned int t = newValue;
   uint32_t t = newValue *1000/65535;  // ist falsch 
      display.setCursor(50,10);
    display.print(t);
    display.display();
}DcsBios::IntegerBuffer fuelQty1000Buffer(0x10d0, 0xffff, 0, onFuelQty1000Change);

Heinz

Nachrtag meine Lösung ist auch falsch siehe #3 :sob:

Hallo Heinz, rechts vom Gleichheitszeichen brauchst Du mehr Bits, nicht links, also irgendwie so:

unsigned int t = newValue *1000UL/65535;
void setup(void)
{
  Serial.begin(9600);
  Serial.println("\nStart");
  unsigned int newValue = 555;
  uint32_t heinz = newValue * 1000 / 65535;
  Serial.print("heinz:\t"); Serial.println(heinz);
  unsigned int t = newValue * 1000UL / 65535;
  Serial.print("t:\t"); Serial.println(t);
}

void loop(void) {}
[sup]13:22:50.836 -> Start
13:22:50.836 -> heinz: 0
13:22:50.905 -> t: 8
[/sup]

Hallo,

up´s stimmt , hätte ich besser mal erst getestet

Heinz

Danke Jungs, Ihr öffnet mir die Augen :slight_smile:
Ich muss mit allem ein doofes Problem lösen: Auf einer Anzeige muss ich einen Gesamtwert ausgeben, bekomme aber für die Zehntausender, Tausender und Hunderter-Stelle jeweils einen Wert zwischen 0 und 65535 geliefert. Daraus muss ich die Gesamtanzeige zusammenbasteln :frowning:
Jetzt setze ich mich nochmal hin... :slight_smile:

Micha

Beschreib doch besser mal dein ganzes Problem

ElEspanol:
Beschreib doch besser mal dein ganzes Problem

Das Problem war mein Kopf. agmü hat erkannt, dass ich meine Division umkehren muss. Mit:
t = abs((t/65535)*1000); kommt immer Null heraus.
Jetzt ist es:
t = ((newValue) * 10UL / 65535)*10000;
Jetzt stimmen auch die Ergebnisse.

Danke Allen die sich meinen Kopf zerbrochen haben :wink:
Micha

bigopus:
agmü hat erkannt, dass ich meine Division umkehren muss.

Fremde Federn stehen mir nicht, es war Heinz. Ich habe nur ein paar Bits rechts vom Gleichheitszeichen ergänzt.

Hallo,

@agmue ich sehe das ehr als eine Teamleistung, ich war halt etwas schneller, dafür hatte ich mir einen anderen Bock eingefangen.

Gruß , & schonen Abend noch Heinz

Rentner:
@agmue ich sehe das ehr als eine Teamleistung, ...

So sei es :smiley:

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.