Hallo,
Ich Wandele mit der Routine den Gemessenen Wert vom DS18S20 in eine
Temperratur um.
Bei Plusgraden geht alles einwandfrei,Nur enben nicht bei Minusgraden.
ich habe jetz eine Temperratur von -0.5Grad Angezeigt bekomme ich aber
+0.-5 Grad.
wo mache ich nur den Fehler.
vielleicht kann mir von ihnen einer weiterhelfen.
mfg
1
// wandelt den Messwert, um.
2
voidDS18S20_convert_temperatur(void)
3
{
4
5
6
inttemp;
7
inttemp1;
8
int16_tVorkommastelle;
9
int16_tNachkommastelle;
10
11
if(id[1]){// Negativer Temperaturwert
12
id[0]^=0xFF;// Einer-Komplement
13
id[0]++;// inkrementieren
14
}
15
id[0]>>=1;// rechtes Bit für 0,5 °C rausschieben (durch 2 teilen)
kurt schrieb:> Hallo,> Ich Wandele mit der Routine den Gemessenen Wert vom DS18S20 in eine> Temperratur um.> Bei Plusgraden geht alles einwandfrei,Nur enben nicht bei Minusgraden.> ich habe jetz eine Temperratur von -0.5Grad Angezeigt bekomme ich aber> +0.-5 Grad.
Daraus folgt erst mal: ganz offensichtlich in der Ausgabe
> wo mache ich nur den Fehler.
Machs so:
Wenn der Wert negativ wird, dann malst du erst mal ein '-' hin und
machst den Wert positiv. Und den positiven Wert kannst du ja richtig
ausgeben
Hintergrund.
Der Rest einer Division kann auch negativ sein!
char Sign;
if( temp < 0 ) {
Sign = '-';
temp = -temp;
}
else
Sign = '+';
> Vorkommastelle = temp / 100;> Nachkommastelle = (temp1 % 100);> Nachkommastelle = (temp % 100);>
sprintf(msg, "%c%3d,%1d", Sign, Vorkommastelle, Nachkommastelle);
PS: Du bist sicher, dass dein temp Wert grundsätzlich korrekt ist? Ich
kann deine Berechnung da nicht wirklich nachvollziehen.
Es wird doch hier
if( id[1]) // Negativer Temperaturwert
{
temp *= -1;
}
Geprüft ob der Wert Negative ist,Wenn Negative dann wird temp *= -1;
auch Negativ.
Vor dem Prüfen habe ich mir ja den Temp Wert
temp = (int)id[0]*100 - 25 + (int)(id[7] - id[6]) * 100 / id[7];
temp1= temp;
kopiert in temp1 für die Nachkommastellen.
Dann sollte doch auch die Nachkomma stelle richtig angezeigt werden,
aber warum funktioniert das nicht.
ich habs jetzt mal nsch ihren Vorschlag umgesetzt aber die Teperatur
stimmt jetzt nicht mehr
1
// wandelt den Messwert, um.
2
voidDS18S20_convert_temperatur(void)
3
{
4
5
charSign;
6
inttemp;
7
inttemp1;
8
int16_tVorkommastelle;
9
int16_tNachkommastelle;
10
11
if(id[1]){// Negativer Temperaturwert
12
id[0]^=0xFF;// Einer-Komplement
13
id[0]++;// inkrementieren
14
}
15
id[0]>>=1;// rechtes Bit für 0,5 °C rausschieben (durch 2 teilen)
Die Lösung steht weiter oben schon: kbuchegg: Auch ein Rest kann negativ
sein.
kurt schrieb:> // Temperatur mit 0,1 °C Genauigkeit berechnen> temp = (int)id[0]*100 - 25 + (int)(id[7] - id[6]) * 100 / id[7];> temp1= temp;
temp1 ist hier negativ.
> if( temp < 0 ) {> Sign = '-';> temp = -temp;> }> else> Sign = '+';>> Vorkommastelle = temp / 100;
temp1 ist immer noch negativ.
> Nachkommastelle = (temp1 % 100);
also ist Nachkommastelle auch negativ.
> Nachkommastelle = (Nachkommastelle / 10);>>> sprintf(msg,"%3d,%1d", Sign, Vorkommastelle, Nachkommastelle);
Abgesehen davon, dass ich persönlich für 3 Variable auch dreimal "%"
genommen hätte, kommt es hier zu genau der von dir gezeigten Ausgabe:
Das Minuszeichen erscheint vor der Nachkommestelle.
kurt schrieb:> Hallo.> vielleicht kann mir noch einer Weiterhelfen>
Lass dir mal temp mit ausgeben. Ich denke, dass da schon was nicht
stimmt.
sprintf(msg,"%d %c%3d,%02d", temp, Sign, Vorkommastelle,
Nachkommastelle);
In C muss man da gar nichts umrechnen. Man steckt das Ergebniss direkt
in eine int16 Variable und hat dann automatisch plus und minus korrekt.
Wenn man es durch 16 teilt bekommt man die Temp in Grad. Macht man
VOHRHER noch mal 10 dann bekommt man sie in zehntel Grad. Bei -0,5 Grad
steht dann -5 in der Variablen. Ohne Umrechnen oder sonst was.
gruß cyblord
cyblord ---- schrieb:> In C muss man da gar nichts umrechnen.
Er will vom DS1820 auch die zusätzlichen Bytes benutzen um auf die
'erhöhte' Genauigkeit zu kommen. Dazu ist im Datenblatt eine Formel
angegeben.
Ist zwar in den meisten Fällen sowieso Schwachsinn, weil die Temperatur
eh nicht stimmen wird, aber des Menschen Wille ...
Ich denke allerdings, dass da beim zusammensetzen der Bytes schon was
nicht stimmt.
ich habe anstatt int16_t Nachkommastelle ein uint8_t Nachkommastelle
benutzt, so nun wird die Temperatur und das Vorzeichen auch korrekt
Ausgegeben.
Karl Heinz Buchegger schrieb:>> Ich denke allerdings, dass da beim zusammensetzen der Bytes schon was> nicht stimmt.
Wie macht mann das denn Richtig ihrer Ansicht nach.
mfg
1
voidDS18S20_convert_temperatur(void)
2
{
3
4
5
inttemp;
6
int16_tVorkommastelle;
7
uint8_tNachkommastelle;
8
9
if(id[1]){// Negativer Temperaturwert
10
id[0]^=0xFF;// Einer-Komplement
11
id[0]++;// inkrementieren
12
}
13
id[0]>>=1;// rechtes Bit für 0,5 °C rausschieben (durch 2 teilen)