DS1820 räkneproblem

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

DS1820 räkneproblem

Inlägg av v-g »

Om man räknar med bara en ½ grads onogranhet så är det ju inga problem då delar man bara med två (Rotate left) och vips så är det nästan klart. Men när man då kommer till minussidan så måste man dra bort -0,5 för att det ska stämma (se tabellen nedan) Jag kör xor på det negativa lägger på 0,5 (sänker alltså temperaturen) och delar med två sen klart.

Nu till det knixiga, ska man dra av de 0,5 när man kör med tiondelarna eller hur är det egentligen tänkt? Jag anser att man måste utgå från -0.5 när man räknar negativt.

Decimalerna är ju lite lustiga iom. att de omfattar ett värde på -0.2 -> 0.9 alltså måste ju tex -0,2°C tas från den "positiva" sidan samtidigt som -0.3°C tas från den "negativa" sidan. Alltså måste decimalerna (=COUNT_REMAIN) gå åt andra håller när det är minus, görs detta automagiskt i DS1820 eller är det något man måste programmera för?

Dvs ska denna "avvikelse" gå åt tvärtom håll mot vad det gör när man ligger på den positiva sidan eller är det som formeln säger: Temperature=-0,25+((16-COUNT_REMAIN)/16)

Kod: Markera allt

TEMPERATURE  DIGITAL OUTPUT  DIGITAL OUTPUT 
( C)    (BINARY)             (HEX) 
+85.0   0000 0000 1010 1010  00AAh 
+25.0   0000 0000 0011 0010  0032h 
+0.5    0000 0000 0000 0001  0001h 
0       0000 0000 0000 0000  0000h 
-0.5    1111 1111 1111 1111  FFFFh 
-25.0   1111 1111 1100 1110  FFCEh 
-55.0   1111 1111 1001 0010  FF92h
Har jag tänkt rätt eller är jag ute på tunn is? Ingen kanske ens fattar mitt dilemma :D

Edit:Databladet.
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Re: DS1820 räkneproblem

Inlägg av dangraf »

vad vill du göra?
Jag brukar rotera åt höger vid divition. 4/2 = 0b100>>1 = 0b10 = 2
enligt databladet så är nogrannheten +-0.5 grader, vart får du in 1/10 grad från?
Tänkte du intergrera ihop ett värde för att få högre noggranhet?
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Re: DS1820 räkneproblem

Inlägg av cyr »

Har du inte krånglat till det för mycket?

De där värdena i tabellen är väl vanlig 2-komplement, dvs samma sätt som "signed" värden alltid brukar hanteras (görs automatiskt av din kompilator om du har nån osv).

Det där med XOR och lägga till är något du bara ska behöva hålla på med om:

1) Du skriver i ren assembler
2) Du behöver konvertera till tecken + absolutvärde, t.ex. för att skriva ut det som text.

Så blir det inte korrekt om du bara glömmer bort ifall värdet är positivt eller negativt och kör som formeln säger?
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: DS1820 räkneproblem

Inlägg av v-g »

Ser att jag skrev fel i första inlägget -0,3->0,8 skulle spannet vara.

danei:Med hjälp av COUNT_REMAIN kan man få ut en noggrannhet på 1/16 av en grad, dock vill jag hålla det på 1/10 av en grad pga utrymmet. Kolla på sidan 3 längst ner ser du formeln.

cyr:Kodar både i assembler och VB men problemet är detsamma. Står ju inte i databladet vad jag uppfattat. Jag hoppas ju att det blir korrekt men kruxet är ju att det är lite svårt att kontrollera iom att jag inte vet vilka värden ds1820 skickar runt nollpunkten.

Själva uträkningen gör jag inte i PICen iom att det bara är 16 värden kör en lookuptable men det är än sålänge inte ett problem.

Troligen är det jag som har för mycket i skallen men måste få klarhet :D

Här är min tabell:
Bild

Det intressanta är 0 och -0,5 + värde vilka överlappar varandra ;)
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Re: DS1820 räkneproblem

Inlägg av cyr »

Är det kanske detta du missat?

" After reading the scratchpad, the TEMP_READ value is obtained by truncating the 0.5°C bit
(bit 0) from the temperature data (see Figure 2). "

Dvs, om du ska använda den metoden ska du skippa den lägsta biten (0.5-biten), och skapa
decimaldelen av talet enbart från COUNT_REMAIN.

Så tolkar jag det iaf.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: DS1820 räkneproblem

Inlägg av v-g »

Har hittat den biten i manualen också och det är den som ger huvudbry :?:

Det jag antar är att -0,5 är utgångspunkt för minussidan ändock trots ovanstående.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Re: DS1820 räkneproblem

Inlägg av cyr »

Om du trunkerar bort lägsta biten kan du ju aldrig få värdet -0.5.

Du tar 9-bits värdet, högerskifta ett steg så får du heltalet (eller dela med två med avrundning neråt, samma sak).

Sen lägger du till talet mellan -0.25 och +0.75 som du får ut från COUNT_REMAIN.

Klart! (?)
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: DS1820 räkneproblem

Inlägg av v-g »

Helt klart kan jag ju inte få 0,5 grader när jag trunkerar sista biten det är jag helt klar över detta värde skall ju stållet komma från COUNT_REMAIN.

MEN om du tittar på datatabellen i första inlägget så är den biten INTE satt (den är ju reverserad) och ändå ska det visa -0.5°C.

Dvs om man nu använder denna BIT så utgår det från -0.5°C vid värdet FALSK för att när den är -1°C när den är SANN. (dock är ju värdet som sagt inverterat när man ligger på minussidan).

Får helt enkelt ta och kyla en sensor för att se vilka värden den ger ut runt 0°C, det verkar vara det enda rätta :humm:

Borde ju räcka om jag pollar den yttre sensorn på kåken samtidigt som jag värmer den med handen :vissla:
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Re: DS1820 räkneproblem

Inlägg av cyr »

-0.5 1111 1111 1111 1111 FFFFh

Någon av oss är totalt vilse, vet inte vad du menar med att värdet är inverterat på minussidan.
Det binära talet ovan med alla bitar satta är -1 i vanlig 2-komplementform, och representerar
temperaturen i enheten 0.5 grader.

Om du nu sätter lägsta biten till 0 får du talet -2, vilket ger dig temperaturen -1 grad.
Istället kan du högerskifta (aritmetiskt) ett steg (samma sak, fast enheten blir nu 1 grad).

*Alla* tal kan behandlas exakt lika, både positiva och negativa.

+37.5 blir +37
+0.5 blir 0
-0.5 blir -1
-14.5 blir -15

osv osv...

Sen lägger du till värdet du får ut från COUNT_REMAIN (nu får du ta till flyttal eller liknande).

Ser fortfarande inget problem.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: DS1820 räkneproblem

Inlägg av v-g »

Menar att BITen är inverterad. Dvs för att få rätt värde på hela BYTEn så kör man XOR FF på den med rätt värde menar jag det jag vill visa på displayen.

Kör dock inte flyttal utan en enkel lookup table, enklare så :vissla:

Tror att vi säger samma sak på olika sätt bara :)
De talen du visar får jag korrekta värden på iom högershiften (=/2 trunkerat) redan där är inget problem än sålänge ;)


Om vi antar att COUNT_REMAIN ger ett avrundat värde på 0,6 som ska läggas till +15 då är ju resultatet +15,6 sålunda inget problem. Om vi istället tar -15 så hur blir det då? -14,4 eller -15,6 jag gissar ju på det senare!
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Re: DS1820 räkneproblem

Inlägg av cyr »

Att du kör XOR FF har bara att göra med att du måste få ut absolutbeloppet för att visa på displayen (du konverterar från 2-komplement).

Om du struntar i det när du ska göra själva beräkningarna så blir det jättelätt (och rätt, är jag ganska säker på).

Och det blir -14,4, jag lovar :)
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: DS1820 räkneproblem

Inlägg av v-g »

Nu har jag felsökt till tusen i både ASM och VB :jimmyhacker:

Hittat flera buggar som gjorde att det räknade fel. Bara för att kontrollera så fick utesensorn smaka på hårtorken :mrgreen:
och nu fungerar det som det ska runt nollan. Jag kan bara tillägga att det var som jag sa förrutom att man som cyr helt riktigt påpekade "utgår" från -1 sen lägger på värdet man får från avrundningen (dvs -14,4 är rätt). Dock var det inte det som var det huvudsakliga felet utan felet var att jag helt enkelt haft för mycket i skallen och kodat fel 8)

Här är en nästan komplett sanningstabell från min givare:
C_R=COUNT_REMAIN
+/-=vilken sida om nollan man är på enligt LSB

Kod: Markera allt

temp data  C_R  +/-
-2   D=252 CR=12 R=1
-1,9 D=252 CR=11 R=1
-1,9 D=252 CR=10 R=1
-1,8 D=252 CR=9 R=1
-1,8 D=252 CR=9 R=1
-1,8 D=253 CR=8 R=1
-1,7 D=253 CR=7 R=1
-1,5 D=253 CR=4 R=1
-1,5 D=253 CR=4 R=1
-1,4 D=253 CR=2 R=1
-1,3 D=253 CR=1 R=1
-1,2 D=254 CR=16 R=1
-1,2 D=254 CR=15 R=1
-1,1 D=254 CR=14 R=1
-1,1 D=254 CR=13 R=1
-1   D=254 CR=12 R=1
-0,9 D=254 CR=11 R=1
-0,8 D=254 CR=9 R=1
-0,8 D=254 CR=9 R=1
-0,8 D=255 CR=8 R=1
-0,7 D=255 CR=7 R=1
-0,6 D=255 CR=6 R=1
-0,6 D=255 CR=5 R=1
-0,4 D=255 CR=3 R=1
-0,4 D=255 CR=2 R=1
-0,3 D=255 CR=1 R=1
-0,3 D=255 CR=1 R=1
-0,3 D=255 CR=1 R=1
-0,2 D=0 CR=16 R=0
-0,2 D=0 CR=16 R=0
-0,1 D=0 CR=14 R=0
-0,1 D=0 CR=13 R=0
0,1 D=0 CR=11 R=0
0,1 D=0 CR=11 R=0
0,2 D=0 CR=9 R=0
0,2 D=0 CR=9 R=0
0,3 D=1 CR=7 R=0
0,4 D=1 CR=6 R=0
0,4 D=1 CR=5 R=0
0,5 D=1 CR=4 R=0
0,6 D=1 CR=3 R=0
0,6 D=1 CR=2 R=0
0,8 D=2 CR=16 R=0
0,8 D=2 CR=15 R=0
0,9 D=2 CR=14 R=0
0,9 D=2 CR=13 R=0
1   D=2 CR=12 R=0
1,1 D=2 CR=10 R=0
1,2 D=2 CR=9 R=0
1,2 D=3 CR=8 R=0
1,3 D=3 CR=7 R=0
1,4 D=3 CR=6 R=0
1,6 D=3 CR=3 R=0
1,6 D=3 CR=3 R=0
1,6 D=3 CR=2 R=0
1,8 D=4 CR=16 R=0
1,8 D=4 CR=16 R=0
1,9 D=4 CR=14 R=0
1,9 D=4 CR=13 R=0
2   D=4 CR=12 R=0
Tack och bock för hjälpen! Nu ska PICen få sig lite ny mjukvara :)
Skriv svar