Dela med 10 utan matte-bibliotek
Re: Dela med 10 utan matte-bibliotek
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...
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
Behöver man dividera med 10 för att få temperaturen ur en DS18B20?
Re: Dela med 10 utan matte-bibliotek
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.
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
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
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
Eller så sätter man bara decimalkommat på lämpligt ställe...
Re: Dela med 10 utan matte-bibliotek
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.
* 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
Eh...
123 delat med 10 är 12.3
123 med en punkt mellan sista och näst sista siffran blir 12.3
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
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
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!
bearing: du har fattat helt korrekt!
Re: Dela med 10 utan matte-bibliotek
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
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
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.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.
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
Ha! Den algoritmen har jag nog (konstigt nog) aldrig sett.
Trevlig läsning, speciellt "Historical" på slutet...
Trevlig läsning, speciellt "Historical" på slutet...
- Swech
- EF Sponsor
- Inlägg: 4743
- Blev medlem: 6 november 2006, 21:43:35
- Ort: Munkedal, Sverige (Sweden)
- Kontakt:
Re: Dela med 10 utan matte-bibliotek
ditt tal = X (byte)
Y = X * 51 (word)
Z =Y*256 + Y (24 bit)
Z = Z / 65536 (8 bit)
Z = Z/2
Swech
Y = X * 51 (word)
Z =Y*256 + Y (24 bit)
Z = Z / 65536 (8 bit)
Z = Z/2
Swech