Sida 1 av 1

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

Postat: 10 juni 2008, 12:45:42
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?

Postat: 10 juni 2008, 12:59:52
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.

Postat: 10 juni 2008, 13:09:53
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.

Postat: 10 juni 2008, 13:33:09
av Rohan
Sen har ju Atmel application notes på binär division också.

http://atmel.com/dyn/resources/prod_doc ... oc0936.pdf

Postat: 10 juni 2008, 14:06:34
av laban12
Är det något probem att alla resultat kommer att bli mindre än 1?

Postat: 10 juni 2008, 14:06:40
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.

Postat: 10 juni 2008, 14:07:55
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! ;)

Postat: 10 juni 2008, 20:23:56
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.

Postat: 15 juni 2008, 20:44:38
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.

Postat: 16 juni 2008, 09:35:54
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.