Dela med 10 utan matte-bibliotek
Re: Dela med 10 utan matte-bibliotek
gkar: hade jag en mul inbyggd hade jag gjort detta men som jag redan har skrivit finns det inte - i den µC jag primärt tänker på.
TomasL: vilket display?
Andax: sedär! Den ska jag pyssla med en del! Tack. Detta är faktisk användbart!
Generellt: Skulle jag göra denna utskrift på en Renesas RX210 hade jag inte haft några problem, den har FPU. När jag vill göra detta vill jag gärna att det kan ske snabbt, ta lite minne i anspråk och generellt vara lean-and-mean. Jag använder oftast denna funktion under debug-utskrifter till serieporten varför det kan vara förödande att plötsligt behöva kompilera in ett bibliotek mer.
Med double-dabble kan jag ganska säkert skapa den rätta funktion, då blir det nämligen enkelt att konvertera till decimalt system och det är det viktiga. att kasta in ett komma är inget problem heller, kruxet är att få värdet omvandlat till decimalt system.
TomasL: vilket display?
Andax: sedär! Den ska jag pyssla med en del! Tack. Detta är faktisk användbart!
Generellt: Skulle jag göra denna utskrift på en Renesas RX210 hade jag inte haft några problem, den har FPU. När jag vill göra detta vill jag gärna att det kan ske snabbt, ta lite minne i anspråk och generellt vara lean-and-mean. Jag använder oftast denna funktion under debug-utskrifter till serieporten varför det kan vara förödande att plötsligt behöva kompilera in ett bibliotek mer.
Med double-dabble kan jag ganska säkert skapa den rätta funktion, då blir det nämligen enkelt att konvertera till decimalt system och det är det viktiga. att kasta in ett komma är inget problem heller, kruxet är att få värdet omvandlat till decimalt system.
Re: Dela med 10 utan matte-bibliotek
Bearing skrev
Du svaradeAha, du menar när man ska ska skriva ut variabler på en display........
Exakt! .........
Re: Dela med 10 utan matte-bibliotek
Och sedan den delen du utelämnade: det sker seriellt, alltså MSB först.
Re: Dela med 10 utan matte-bibliotek
Förstår fortfarande inte problemet, det normala när man skickar data till överordnade system är att man skickar heltal, med fasta divisorer, vilka man lägger in i det överordnande systemet.
Vi skickar till exempel data till överordnade system med divisorerna (beroende på vilken typ av data det är) 100, 10, 1 och BIT. dvs Eftersom mottagaren vet vilka data den får, så är det lätt för mottagaren att hantera de olika divisorerna, dvs vi skickar alltid heltal, inget annat.
Huruvida man skickar det seriellt eller parallellt och huruvida man skickar LE eller BE eller blandningar därav spelar heller ingen roll.
Det finns som jag ser det ingen som helst anledning att skicka en massa flyttal och kommatecken, det stökar bara till det hela, internt använder vi dock en helt annan upplösning/representation.
Vi skickar till exempel data till överordnade system med divisorerna (beroende på vilken typ av data det är) 100, 10, 1 och BIT. dvs Eftersom mottagaren vet vilka data den får, så är det lätt för mottagaren att hantera de olika divisorerna, dvs vi skickar alltid heltal, inget annat.
Huruvida man skickar det seriellt eller parallellt och huruvida man skickar LE eller BE eller blandningar därav spelar heller ingen roll.
Det finns som jag ser det ingen som helst anledning att skicka en massa flyttal och kommatecken, det stökar bara till det hela, internt använder vi dock en helt annan upplösning/representation.
Re: Dela med 10 utan matte-bibliotek
TomasL: "data till överordnade system"???
Vad menar du? Jag skrev ganska tydligt "Jag använder oftast denna funktion under debug-utskrifter till serieporten..." varför det "överordnat system" är mina ögon.
Att låta två system kommunicera med varandra har jag gjort längre tid än jag vill minnas och att säkra att de fattar varandra är inte heller något problem alls, jag ser till att de olika system använder samma kommunikationsdefinitionfiler varför det inte blir några problem.
Men mina ögon vill ibland ha decimaler med i spelet.
Vad menar du? Jag skrev ganska tydligt "Jag använder oftast denna funktion under debug-utskrifter till serieporten..." varför det "överordnat system" är mina ögon.
Att låta två system kommunicera med varandra har jag gjort längre tid än jag vill minnas och att säkra att de fattar varandra är inte heller något problem alls, jag ser till att de olika system använder samma kommunikationsdefinitionfiler varför det inte blir några problem.
Men mina ögon vill ibland ha decimaler med i spelet.
Re: Dela med 10 utan matte-bibliotek
Ok, missade det där med debug, snabbast är väl ändå att stoppa in ett decimalkomma vid formateringen, eftersom du då ändå sannolikt måste skicka ascii till din terminal.
Själva använder vi lite specialskrivna formateringsrutiner, där vi kan speca radix, antal siffror och decimaler mm, likt de traditionella *printf funktionerna, dock är de något snabbare.
Själva använder vi lite specialskrivna formateringsrutiner, där vi kan speca radix, antal siffror och decimaler mm, likt de traditionella *printf funktionerna, dock är de något snabbare.
Senast redigerad av TomasL 31 januari 2014, 00:23:11, redigerad totalt 1 gång.
Re: Dela med 10 utan matte-bibliotek
Vad är formlerna för att komma fram till dessa konstanter t.ex 6554 och antal skiftningar osv?gkar skrev: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
Andax skrev:https://en.wikipedia.org/wiki/Double_dabble

Re: Dela med 10 utan matte-bibliotek
TomasL: du har fortfarande inte fattat...
Förklara gärna för mig hur jag kan presentera t.ex. en short i decimal form utan att dela med 10.
Förklara gärna för mig hur jag kan presentera t.ex. en short i decimal form utan att dela med 10.
Re: Dela med 10 utan matte-bibliotek
Du vill, skicka tecken till ett terminalprogram, typ.
Du vill att det skall presenteras med decimaler.
Enklast är ju "sprintf"
Alternativt fixar du till en egen sprintfunktion, vilken stoppar in hela din till text omvandlade short i en sträng med lämplig längd, i detta fallet minst 8 byte lång, om /n skall få plats också.
Om din short är mindre än 0, så stoppar du in ett minustecken i första positionen, skall du ha 10-delar, så ett komma i sjätte positionen, 100-delar så hamnar kommat på femte positionen.
Förstår fortfarande inte varför du måste dividera.
Du vill att det skall presenteras med decimaler.
Enklast är ju "sprintf"
Alternativt fixar du till en egen sprintfunktion, vilken stoppar in hela din till text omvandlade short i en sträng med lämplig längd, i detta fallet minst 8 byte lång, om /n skall få plats också.
Om din short är mindre än 0, så stoppar du in ett minustecken i första positionen, skall du ha 10-delar, så ett komma i sjätte positionen, 100-delar så hamnar kommat på femte positionen.
Förstår fortfarande inte varför du måste dividera.
Re: Dela med 10 utan matte-bibliotek
Om han måste göra en egen sprintf så kommer ju den funktionen behöva dividera med 10 (implicit eller explicit) på något sätt. Och det är lösningen på det som han efterfrågade.
Re: Dela med 10 utan matte-bibliotek
TomasL: *suck*
sprintf kräver ju ett bibliotek (stdio.h) som det kanske inte finns plats för - eller hur?
Att utföra funktionen på ett resursstarkt system är inget problem alls! Då brukar printf-biblioteket (stdio.h) ju ändå vara implementerat men när man sitter och måste snåla för att µC'n har minne nog att utföra jobbet men det blir omöjligt att lägga in t.ex. stdio.h för att använda sprintf.
Och den egna sprintf-funktion kräver en dela-med-10 för att kunde fungera eller hur?
Så ska vi komma över denna ring-argumentation och hitta en lösning eller kan du inte förstå att allt beror på en dela-med-10 i grunden?
sprintf kräver ju ett bibliotek (stdio.h) som det kanske inte finns plats för - eller hur?
Att utföra funktionen på ett resursstarkt system är inget problem alls! Då brukar printf-biblioteket (stdio.h) ju ändå vara implementerat men när man sitter och måste snåla för att µC'n har minne nog att utföra jobbet men det blir omöjligt att lägga in t.ex. stdio.h för att använda sprintf.
Och den egna sprintf-funktion kräver en dela-med-10 för att kunde fungera eller hur?
Så ska vi komma över denna ring-argumentation och hitta en lösning eller kan du inte förstå att allt beror på en dela-med-10 i grunden?
Re: Dela med 10 utan matte-bibliotek
Jag har letat upp funktioner som jag använde för en massa år sedan för att skicka 16-bit och 8-bit tal över serieporten. Detta kan kanske få poletten att trilla ned. Här har jag dividerat med 10000, 1000, o.s.v. för att få ut siffrorna i rätt ordning utan att mellanspara dem innan de ska läggas på serieporten. Om man mellansparar i en array går det att enbart dela (med rest) med 10 i varje steg.
Double-dabble metoden ser ju väldigt lovande ut. Ska nog prova den, när jag får tid.
Kod: Markera allt
void sendDec16(unsigned int u16, unsigned char comma)
{
char c, i;
unsigned int denom = 10000;
for (i=0; i<5; i++)
{
if (comma)
if (i == comma) sendChar('.');
c = u16/denom;
sendChar(c+'0');
u16 %= denom;
denom /= 10;
}
}
void sendDec8(unsigned char c)
{
unsigned char i,j,siffra;
siffra='0';
if (c>=200){siffra='2';c-=200;}
if (c>=100){siffra='1';c-=100;}
sendChar(siffra);
j='9';
for(i=90;;i-=10,j--)
{
if (c>=i) {siffra=j;c-=i;break;}
}
sendChar(siffra);
sendChar(c+'0');
}
Re: Dela med 10 utan matte-bibliotek
Jag har tappat bort mig lite i tråden. Har något av alla lösningsförslag löst ditt problem?
Annars undrar jag om länken jag postade på förstasidan var till hjälp? Längs ner står hur man delar utan division och multiplikation i hårdvaran.
Annars undrar jag om länken jag postade på förstasidan var till hjälp? Längs ner står hur man delar utan division och multiplikation i hårdvaran.