Sida 2 av 6

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 15:27:02
av Icecap
Om det hade varit sommar ute kontinuerligt är vi överens men för tillfället är det så pass kallt att värdet är negativt.

Och ja, i detta sammanhang (DS18B20) är det i grunden utan värde att ha en så pass snabb dela-med-10 rutin för att visa temperaturen med decimaler - men det är en grej jag har letat efter ett tag, mest för att om det nu var enkelt och snabbt...

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 15:32:47
av bearing
Behöver man dividera med 10 för att få temperaturen ur en DS18B20?

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 16:45:20
av Icecap
Såklart inte! Men vill man visa värden som xx,x°C är det ganska bra att kunde dela med 10.

Denna delning med 10 är mest tänkt som en generell grej, det är ofta att jag vill visa värden på det vis och det har inte alltid med temperaturer att göra.

I en DS18B20 kan man ju läsa temperaturen med en bra bit finare upplösning än 0,5°C - att den sedan inte är kalibrerat ordentligt så att det har rimligt värde är en annan sak - men relativ mätning är bra också om man letar tendens.

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 16:51:32
av bearing
Aha, du menar när man ska ska skriva ut variabler på en display, eller på typ serieporten. Ja det är klart, då behöver man ju alltid dividera med 10 några gånger, oavsett om det ska visas som decimaltal eller inte.

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 16:56:07
av Icecap
Exakt! Och hade man en snitsig lite o snabb rutin ville det vara kul. Men det är tydligen mest att glömma detta.

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 18:18:13
av ie
Eller så sätter man bara decimalkommat på lämpligt ställe...

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 18:25:34
av Icecap
ie: Helt klart en möjlighet - men i en µC med få resurser behöver man då att antingen:
* Skriva ut till minnet och sedan dumpa ut på korrekt sätt.
* Eller dela med 10 och skriva kommat mellan heltalet av div/10 och remainder.

Båda delar är inte helt resurssnåla, varför det då är lika bra (eller bättre) att faktisk använda divisionslibbet.

Så nej, inget bra förslag heller.

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 19:12:09
av Nerre
Eh...

123 delat med 10 är 12.3

123 med en punkt mellan sista och näst sista siffran blir 12.3

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 19:22:10
av bearing
Men alltså om du har en variabel som ska skickas i klartext över UART, då måste du ju dividera med rest för varje siffra som ska skickas. Jag antar att det är detta tråden handlar om. Sen kan man ju skicka med ett kommatecken på lämplig plats, ifall man önskar.

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 20:26:12
av Icecap
Nerre: Nej! 123 / 10 ger 12,3 - i Sverige iaf. Är du i USA eller andra inkontinenta ställen med konstiga värden kan det bli 12.3

bearing: du har fattat helt korrekt!

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 20:40:26
av gkar
Vill du verkligen dividera snabbt och har en snabb mul så kan du göra det med en multiplikation istället i lämpliga intervall.

a = (a * 6554) >> 16;
Ta ARM tex som saknar HW division men har en mycket snabb multiplikation, då rockar detta!


Ännu mycket mer tokfort är att använda en tabell.
Skapa en tabell som innehåller alla tal du vill skicka.

Låt data lite Motorola 68020+ idag för omväxlingsskull.

; Lägg data i d0.w
snabbprint:
lea tab(pc,d0.w*8),a0 ; Ta adressen på tabellen relativt PC, lägg på PC, ta d0.w och multiplicera med 8 och lägg ihop allt i a0. *2 eller *4 för småtabeller.
bsr.s uart_send_null_termed_string ;a0 innehåller adressen att skriva ut från.
rts

Detta tar alltså en assemblerinstruktion att skapa informationen som printrutinen behöver!



tab:
'0', NULL, NULL, NULL, NULL, NULL, NULL, NULL
'1', NULL, NULL, NULL, NULL, NULL, NULL, NULL
...
'4','2', NULL, NULL, NULL, NULL, NULL, NULL

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 20:48:41
av Andax

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 21:01:14
av TomasL
Icecap skrev:ie: Helt klart en möjlighet - men i en µC med få resurser behöver man då att antingen:
* Skriva ut till minnet och sedan dumpa ut på korrekt sätt.
* Eller dela med 10 och skriva kommat mellan heltalet av div/10 och remainder.

Båda delar är inte helt resurssnåla, varför det då är lika bra (eller bättre) att faktisk använda divisionslibbet.

Så nej, inget bra förslag heller.
Det där förstår jag faktiskt inte, eftersom du ändå måste formatera utskriften till displayen, så, tar det knappast några resurser att placera decimalkommat på rätt ställe.
Samma gäller att skicka värdena med via serieport, det är väl en smart sak att låta mottagaren få hantera eventuella decimaler, bara man skickar konsekvent, dvs alltid med samma mängd decimaler.
Dessutom tjänar man på det då man kan använda heltalsaritmetik överallt.

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 21:07:54
av sodjan
Ha! Den algoritmen har jag nog (konstigt nog) aldrig sett.
Trevlig läsning, speciellt "Historical" på slutet...

Re: Dela med 10 utan matte-bibliotek

Postat: 30 januari 2014, 22:58:08
av Swech
ditt tal = X (byte)

Y = X * 51 (word)
Z =Y*256 + Y (24 bit)
Z = Z / 65536 (8 bit)
Z = Z/2

Swech