Forum: Mikrocontroller und Digitale Elektronik Problem mit einfacher Rechnung


von assi (Gast)


Lesenswert?

Hallo,

ich habe eine Schaltung gebaut die mehrer KTY Temperaturfühler 
auswertet.
Um die ADC-Werte in °C umzurechnen verwende ich die im folgenden Code zu 
sehende Formel.
Ich habe nun Probleme wenn ich Werte unter 0°C habe das die Funktion 
einfach -22°C ausgibt ich kann mir aber leider nicht erklären warum sie 
das macht.

Von der Hardware Seite her sollte alles in Ordung sein das Habe ich 
schon mehrfach überprüft und die anderen Fühler mit Temperaturen über 
40°C werden auch richtig ausgegeben.

1
int8_t umrechnung (uint16_t adc)
2
{
3
int8_t y=0;
4
5
6
y = ((adc-387)*20)/37;
7
8
  return y;
9
}
Gruß
assi
von MWS (Gast)


Lesenswert?

Teile dem Compiler per Cast auf das Zwischenergebnis mit, welchen 
Wertebereich er dafür verwenden soll, dann geht's.
von assi (Gast)


Lesenswert?

Hallo,
danke erstmal für die schnelle Antwort, jedoch weis ich nicht so richtig 
wie ich dieses Casten anstellen soll. Ich habe gerade mal nachgelesen 
aber eigentlich sollte doch alles int8_t sin oder???
von MWS (Gast)


Lesenswert?

Bzw. caste adc, das ist etwas sauberer.
von Karl H. (kbuchegg)


Lesenswert?

assi schrieb:
> Hallo,
> danke erstmal für die schnelle Antwort, jedoch weis ich nicht so richtig
> wie ich dieses Casten anstellen soll. Ich habe gerade mal nachgelesen
> aber eigentlich sollte doch alles int8_t sin oder???


Wie kann das int8_t sein, wenn du hier

int8_t umrechnung (uint16_t adc)

adc als unsigned übergibst?
von MWS (Gast)


Lesenswert?

assi schrieb:
> aber eigentlich sollte doch alles int8_t sin oder?

Nein, er rechnet zuerst auf Basis des Typen, der als Operand übergeben 
wird, deswegen geht ein negatives Ergebnis mit einem uint nicht. 
Außerdem würde auch ein 8Bit Integer falsch sein, da das 
Zwischenergebnis den Wertebereich eines int8 überschreiten kann.
von assi (Gast)


Lesenswert?

Ja habs Verstanden entweder adc schon als int16_t übergeben oder mit 
Cast sollte es dann so aussehen:

y = (((int16_t)adc-387)*20)/37;

So funktioniert es wunderbar vielen Dank!!!!
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.