Forum: Compiler & IDEs DS1621 Temp-Sensor auflösung 0,1° / umsetzung Formel in C


von Matthias (Gast)


Lesenswert?

Hallo,

ich möchte einen DS1621 mit erhöhter Auflösung nutzen uns somit zehntel 
Grad anzeigen.

Ich kenne bereits diesen Beitrag, bin mir mit der Umsetzung aber noch 
nicht ganz sicher, z.b. warum COUNTS_PER_C immer 16 sein soll?
Beitrag "DS1621 höhere Auflösung"

Letztendlich möchte ich diese Formel in C möglichst einfach realisieren:

Temperatur=Temp_Read-0,25+((Count_Per_C-Count_Remain)/Count_Per_C)

Diese Temperatur soll zur Anzeige möglichst einfach in ASCII-Zeichen 
zerlegt werden können. Also kommt float wohl nicht in Frage.

Eventuell ist liegt ein Fehler in der Berechnung:
temp =temp+(((slope-count_remain)/slope) << 4);  //Berechnung*16 
addieren

Oder beim berechnen der 10-Tel Grad vor:
char temptenth=temp/16+0x30;

Ich denke bereits die einer-Stelle stimmt nicht, da sie von einem 2. 
Sensor (DS3231) in 0,5cm Entfernung > 2 Grad abweicht und ohne die 
verbesserte Rechenmethode sehr 0,5Grad ähnlich dem DS3231 war.

Wenn ich das Datenblatt Bisher habe ich dazu folgende Funktion:
1
void DS1621_Disp_Erg(char ergh, char ergl, char count_remain, char slope)
2
{
3
  uint16_t temp=ergh ; 
4
  temp =temp<< 4;  //Temperatur*16
5
  temp =temp-4;  //0,25°*16 abziehen
6
  temp =temp+(((slope-count_remain)/slope) << 4);  //Berechnung*16 addieren
7
  uint8_t ganz=temp>>4;  //Ganze Grad
8
  temp=temp-ganz << 4;  //Ganze Grad abziehen
9
  /*Resttemperatur * 16 ist im register*/
10
  if(ergh&0x80)      //Negative-Temp
11
  {
12
    unten[0]='-';
13
  }
14
  else
15
  {
16
    unten[0]='+';
17
    char temphun=ganz/100+0x30;
18
    ganz=ganz%100;
19
    char tempten=ganz/10+0x30;
20
    ganz=ganz%10;
21
    char tempone=ganz+0x30;
22
    
23
    char temptenth=temp/16+0x30;
24
    temp=temp%16;
25
    char temphund=temp+0x30;
26
27
    unten[1]=temphun;
28
    unten[2]=tempten;
29
    unten[3]=tempone;
30
    unten[4]=',';
31
    unten[5]=temptenth;
32
    unten[6]=temphund;
33
    unten[7]=' ';
34
  }
35
}

: Verschoben durch User
von Karl H. (kbuchegg)


Lesenswert?

Matthias schrieb:

> Diese Temperatur soll zur Anzeige möglichst einfach in ASCII-Zeichen
> zerlegt werden können. Also kommt float wohl nicht in Frage.

Welche anderen, lebenswichtig zeitkritischen Dinge muss denn der µC 
sonst noch machen.

>   if(ergh&0x80)      //Negative-Temp
>   {
>     unten[0]='-';
>   }
>   else
>   {
>     unten[0]='+';
>     char temphun=ganz/100+0x30;
>     ganz=ganz%100;
>     char tempten=ganz/10+0x30;
>     ganz=ganz%10;
>     char tempone=ganz+0x30;
>
>     char temptenth=temp/16+0x30;
>     temp=temp%16;
>     char temphund=temp+0x30;
>
>     unten[1]=temphun;
>     unten[2]=tempten;
>     unten[3]=tempone;
>     unten[4]=',';
>     unten[5]=temptenth;
>     unten[6]=temphund;
>     unten[7]=' ';
>   }
> }


Fang doch erst mal an, die irgendwelche vernünftigen grundlegende 
Ausgabefunktionen zu programmieren, wenn du das schon alles selbst 
machen willst.

Dann kannst du dir auch mal Zwischenergebnisse schnell und einfach 
ausgeben lassen, ohne dass das jedesmal ausartet.
Ein vernünftiger Satz an Basisfunktionen ist sein 'Geld' wert, weil er 
dir in der eigentlichen Entwicklung Zeit spart.

von chris (Gast)


Lesenswert?

temp =temp+(((slope-count_remain)/slope) << 4);
Ist sicher falsch.
Warscheilich richtig:
temp =temp+((slope-count_remain)<<4)/slope;

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.