Multiplikation (med 0.0625) utan flyttalsberäkning?
Postat: 31 maj 2011, 16:00:37
Hej,
sitter och knåpar med lite 1-wire och DS18B20 och måste ha hamnat i en tankevurpa när det gäller att konvertera "AD-värdet" till decimaltal, för jag får det inte att stämma. (Jag vill alltså undvika att använda flyttalsberäkningar i Atmel AT90USB128'an jag använder)
Jag får alltså ett 12-bitars resultat från DS18B20 där varje steg motsvarar 0.0625 grader celcius.
Jag får i detta exempel 0x017F från sensorn vilket skall mot svara ~23.94 grader enligt denna beräkning:
0x017F (383) * 0.0625 = 23,9375 grader.
Eftersom 0.0625 är en 16-del av 1 så borde jag alltså kunna skifta 0x017F till höger fyra steg för att dividera med 16:
0x017F >> 4 = 0x17 = 23 grader
Heltalsdelen är alltså inte så svår... problemet får jag när jag vill plocka fram decimalerna. Den initiala tanken var att helt enkelt maska ut dom bitar som jag skiftar bort i beräkningen ovan och sedan shifta dessa till vänster, men jag får inte det att stämma:
(0x017F & 15) << 4 = 240 (vilket inte alls stämmer med min flyttalsberäkning ovan).
Shiftar jag 6 bitar så kommer jag upp i 960, men även det är ju helt fel. (samt att jag inte ser logiken i att göra det)
Så, vad har jag missat?
/Croaton
sitter och knåpar med lite 1-wire och DS18B20 och måste ha hamnat i en tankevurpa när det gäller att konvertera "AD-värdet" till decimaltal, för jag får det inte att stämma. (Jag vill alltså undvika att använda flyttalsberäkningar i Atmel AT90USB128'an jag använder)
Jag får alltså ett 12-bitars resultat från DS18B20 där varje steg motsvarar 0.0625 grader celcius.
Jag får i detta exempel 0x017F från sensorn vilket skall mot svara ~23.94 grader enligt denna beräkning:
0x017F (383) * 0.0625 = 23,9375 grader.
Eftersom 0.0625 är en 16-del av 1 så borde jag alltså kunna skifta 0x017F till höger fyra steg för att dividera med 16:
0x017F >> 4 = 0x17 = 23 grader
Heltalsdelen är alltså inte så svår... problemet får jag när jag vill plocka fram decimalerna. Den initiala tanken var att helt enkelt maska ut dom bitar som jag skiftar bort i beräkningen ovan och sedan shifta dessa till vänster, men jag får inte det att stämma:
(0x017F & 15) << 4 = 240 (vilket inte alls stämmer med min flyttalsberäkning ovan).
Shiftar jag 6 bitar så kommer jag upp i 960, men även det är ju helt fel. (samt att jag inte ser logiken i att göra det)
Så, vad har jag missat?
/Croaton