Behöver hjälp med formel (division) i assembler...

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
laban12
Inlägg: 1199
Blev medlem: 17 april 2008, 16:01:56
Ort: Stockholm

Behöver hjälp med formel (division) i assembler...

Inlägg av laban12 »

Jag har haft en extramätare/datalogger i bilen som jag tänkte blåsa lite liv i igen.
Det är i all enkelhet en ATmega163 med en 4x16 raders display, lite ingångar, en extern räknare, klocka, rs232-interface, tryckmätare och tempmätare.

Den visar bland annat varvtal och hastighet.

Nu känner jag att jag skulle vilja att den visar, och loggar, vilken växel som ligger i. Det kan ju enkelt(?) bestämmas genom att dividera varvtalet med hastigheten - kvoten motsvarar ju utväxlingen.

Jag har varvtalet i en byte (lägg två nollor till decimalvärdet i byten och du har varvtalet) och hastigheten i en byte (decimalt).

Min första tanke är att jag dividerar varvbyten med hastighetsbyten och använder kvoten för att plocka ur vilken växel jag kör på ur en lookup-tabell.

Dock är jag inte SÅ haj på assemblermatematik att jag kan klura ut hur man gör divisionen.
Någon som kan komma med lite input? Eller någon annan smart tanke runt hur jag kan lösa det?
Nerre
Inlägg: 27257
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Inlägg av Nerre »

Googlar man på "binary division" så får man som första träff den här länken:

http://courses.cs.vt.edu/~cs1104/Buildi ... e.010.html

Vet inte om det finns bättre metoder.

Men du bör ju tänka på att din beräkning kommer riskera att visa fel växel så fort man trampar ner kopplingen.
laban12
Inlägg: 1199
Blev medlem: 17 april 2008, 16:01:56
Ort: Stockholm

Inlägg av laban12 »

Hmm... ja det har du helt rätt i, ett vilkor är alltså att varvtalet är högre än tomgångsvarvet. Eller att det inte är drastiskt på väg nedåt.
Hmm... ska fundera mer på det sen, nu ska jag kolla din länk.
Användarvisningsbild
Rohan
Inlägg: 1065
Blev medlem: 7 april 2004, 08:24:39
Ort: Eksjö, Småland
Kontakt:

Inlägg av Rohan »

Sen har ju Atmel application notes på binär division också.

http://atmel.com/dyn/resources/prod_doc ... oc0936.pdf
laban12
Inlägg: 1199
Blev medlem: 17 april 2008, 16:01:56
Ort: Stockholm

Inlägg av laban12 »

Är det något probem att alla resultat kommer att bli mindre än 1?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Division *kan* vara väldigt enkelt, om divisiorn är en potens av 2 (2,4,8,16...).
Knepet är att fixa sina mätrutiner så att efterföljande beräkningar förenklas.
laban12
Inlägg: 1199
Blev medlem: 17 april 2008, 16:01:56
Ort: Stockholm

Inlägg av laban12 »

Japp Sodjan, det är precis så jag gjort för att räkna fram värdena från början. Valt tidsperioder och så för att få ut hastigheten och varvtalet med minimal matematik! :)

Så jag har redan bränt det tricket, kan man säga! ;)
spaderkung
Inlägg: 138
Blev medlem: 12 maj 2007, 11:24:24
Ort: Sjöbo

Inlägg av spaderkung »

Piclist har färdiga kodsnuttar för division av olika kombinationer av 8/16-bitas tal i täljare/nämnare mm.

Vill du använda tal < 1 är ett annat trick att ex låta 0.8 representeras av 8 i alla beräkningar. Enda gången det behöver vara "0.8" är för presentation.
Användarvisningsbild
babbage
Inlägg: 655
Blev medlem: 10 november 2004, 11:33:17
Ort: N-tälje

Inlägg av babbage »

Vad händer om du backar?

Istället för att dividera kan du kanske multiplicera. Du vet säkert vilka olika utväxlingar du har. Mulitplicera varvtalet med en i taget och när resultatet blir tillräckligt nära så har du hittat din växel.
laban12
Inlägg: 1199
Blev medlem: 17 april 2008, 16:01:56
Ort: Stockholm

Inlägg av laban12 »

Usch, backning blir ju ännu ett specialfall.

I övrigt handlar det ju om, som du skriver, att resultatet måste bli "tillräckligt nära". Jag får labba fram hur exakt resultatet ska utvärderas. Får man ingen tillräckligt noggrann träff så slirar man antagligen på kopplingen och då får den logga det.

Ska fundera lite på din ide, att göra det baklänges, med mulitplikation.
Skriv svar