DS1621 Temp-Sensor auflösung 0,1° / umsetzung Formel in C

Gast #4148561
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
}
#4149349
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.