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 | }
|