C167 und µVision2 - Rechenproblem?

Gast #103858
Lesenswert?

Hallo zusammen,

ich unternehme gerade meine ersten Gehversuche mit dem C167CR-LM in
Verbindung mit dem µVision2-Compiler, und hoffe hier richtig zu sein.

Das C-Programm im Anhang liefert mir folgende Ausgabe:
Kanal: 0 ==> Wandlungsergebnis: 654 ==> Temperatur 13.9
Kanal: 0 ==> Min. -50, Max. 50,Differenz 100, Faktor 0.6
Kanal: 1 ==> Wandlungsergebnis: 654 ==> Temperatur 63.9
Kanal: 1 ==> Min. 0, Max. 100,Differenz 100, Faktor 0.6
Kanal: 2 ==> Wandlungsergebnis: 646 ==> Temperatur 63.1
Kanal: 2 ==> Min. 0, Max. 100,Differenz 100, Faktor 0.6
Kanal: 3 ==> Wandlungsergebnis: 322 ==> Temperatur 13.0
Kanal: 3 ==> Min. -50, Max. 150,Differenz 200, Faktor 0.3

Bis hierhin funktioniert alles. Wenn ich jetzt aber die Spannungen an
den Analogeingängen geringfügig erhöhe, erhalte ich folgende
Ergebnisse:
Kanal: 0 ==> Wandlungsergebnis: 667 ==> Temperatur -48.9
Kanal: 0 ==> Min. -50, Max. 50,Differenz 100, Faktor 0.7
Kanal: 1 ==> Wandlungsergebnis: 670 ==> Temperatur 1.4
Kanal: 1 ==> Min. 0, Max. 100,Differenz 100, Faktor 0.7
Kanal: 2 ==> Wandlungsergebnis: 665 ==> Temperatur 0.9
Kanal: 2 ==> Min. 0, Max. 100,Differenz 100, Faktor 0.7
Kanal: 3 ==> Wandlungsergebnis: 353 ==> Temperatur -45.0
Kanal: 3 ==> Min. -50, Max. 150,Differenz 200, Faktor 0.3

Hier stimmen die berechneten Temperaturwerte nicht mehr.
Warum ist das so? Wer kann/will mir helfen?

Gruß Markus
Angehängte Dateien:
Gast #103859
Lesenswert?

Hallo Markus,

Deine Bereichnung gehr schien weil einen unsigned int maximal denn wert
von 65535 haben kann.

aber:
(maxTemperatur[i] - minTemperatur[i]) * messwert[i]
100 * 667 = 66700 also solltest du mit unsigned long arbeiten.

versuche es mal mit:

istTemperatur[i] = (signed long)minTemperatur[i] + (((signed
long)maxTemperatur[i] - (signed long)minTemperatur[i]) * (unsigned
long)messwert[i] / 1023.0);

oder
unsigned long messwert[4];
signed long maxTemperatur[4]={50, 100, 100, 150};
signed long minTemperatur[4]={-50, 0, 0, -50};

Dann müßte es richtig laufen.

Grüße Mark,
Gast #103861
Lesenswert?

Hallo zusammen!

@Mark:
Danke für Deine Ausführungen. Das heißt, daß vor der Umwandlung in
FLOAT temporär der gültige Zahlenbereich überschritten wird. Das hab
ich nicht gewußt.
Deshalb habe ich richtiggestellt:
Statt
istTemperatur[i] = minTemperatur[i] + ((maxTemperatur[i] -
minTemperatur[i]) * messwert[i] / 1023.0);

einfach
istTemperatur[i] = minTemperatur[i] + ((maxTemperatur[i] -
minTemperatur[i]) / 1023.0 * messwert[i]);

und schon funzt es. Hat mich drei Tage gekostet :-(

@Gerhard:
signed int maxTemperatur[4]={50, 100, 100, 150};
signed int minTemperatur[4]={-50, 0, 0, -50};

Hier werden die Felder deklariert und mit Werten vorbelegt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren