Sida 1 av 1

PIC matematiska uträkningar

Postat: 20 mars 2007, 09:57:09
av squiz3r
Hej, Jag skulle behöva räkna "delat med" och "gånger" med en PIC i ASM. Finns det några färdiga komandon för det? Det är 16F och 12F familjerna.

//Daniel A

Postat: 20 mars 2007, 10:03:45
av Icecap
"Färdiga kommandon": Nej! Detta alltså om du menar ASM-kommandon. Det lösas som på alla andra CPU utan matte-processor: via program.

Postat: 20 mars 2007, 12:05:57
av squiz3r
Något exempel?

Tack!
//Daniel A

Postat: 20 mars 2007, 12:11:57
av Icecap
Kolla PIClist.....

Postat: 20 mars 2007, 12:58:20
av sodjan
> Kolla PIClist.....

D.v.s t.ex :
http://www.piclist.com/techref/microchip/math/basic.htm

:-)

Notera också att det är *väldigt viktigt* att ordentligt tänka över sina beräkningar !!
Ofta kan man genom "smart" programmering se till att mult/div antingen
undviks helt eller begränsas till enkla operationer med 2-potenser (d.v.s
rena shift operationer). T.ex en liten justering av tiden för en mätning
kan göra stor skillnad. Det är inte alls säkert att man ska mäta under
exakt en sekund (bara för att ta ett exempel), man kanske ska mäta
under 0.468 sekunder (vilket råkar vara 1/128 dels minut och alltså är
väldigt enkelt att räkna om till <mätvärdet>/minut). Det beror helt på
vad man vill "ha ut" av beräkningen...

Postat: 20 mars 2007, 16:45:46
av squiz3r
Jag har en puls som kommer till PIC'en. Om den pulsen har kommit tex. 110ggr på en minut så ska PIC'en visa på en display hälften av det Dvs 55.
Jag har kollat på PIClist.com men jag kommer inte bra överens med den sidan. här är division: http://www.piclist.com/techref/microchi ... /index.htm

Men vilken av dem ska jag kolla på om jag vill dela min variabel till hälften?? Vad menar dem med tex. "24 bits by 24" eller "16 bits by 8" ??

Tack!
//Daniel A

Postat: 20 mars 2007, 17:01:40
av Andax
Dela med 2 är jätteenkelt med heltal i asm eftersom det är samma sak som att skifta en bit åt höger.
Det tar typ två instruktioner om du kör med 16-bitarstal. (en instruktion med 8-bitars tal).

>> Vad menar dem med tex. "24 bits by 24" eller "16 bits by 8" ??
Det är storleken på värderna som funktionerna hanterar eller rättare sagt förväntar sig.

t.ex. "24 bits by 24" förväntar sig två tal som är angivna med 24 bitar var, dvs 3 byte var.

Postat: 20 mars 2007, 17:18:00
av squiz3r
Okej, Tack så mycket! Har nu suttit med miniräknare o räknat runt i 1'or och 0'or och försäkrat mig att du har rätt :)

//Daniel A

Postat: 20 mars 2007, 20:41:09
av sodjan
Det är exakt samma sak som att shifta ett decimalt tal vänster eller höger
för att mult/div med jämna *10* potenser !!

T.ex :

Decimalt :

240 x 10 = 2400 : d.v.s shiftat ett steg till vänster.
35400 / 100 = 354 : d.v.s shiftat två steg till höger.

Binärt :

b'1000' / 2 = b'0100' : d.v.s shiftat ett steg till höger.
b'1000' / 4 = b'0010' : d.v.s shiftat *två* steg till höger.
o.s.v.

b'1000' x 2 = b'10000' : d.v.s shiftat ett steg till vänster.
b'1000' x 4 = b'100000' : d.v.s shiftat *två* steg till vänster.
o.s.v.

Rutinerna för 24x24, 16x8 o.s.v är generella rutiner för mul/div
med valfria tal. De blir betydligt mer komplicerade. Därför ska man
(så långt det är möjligt) hålla mattematiken på en nivå som effektivt
kan översättas till binära operationer.

Notera att inte enbart jämna potenser av 2 är enkla att implementera.
T.ex en multiplikation med 3 är nästan lika enkel. En shift och en addition.
Multiplikation med 5 är *två* shift och en addition (d.v.s x4 + x1 = x5)

Ex :

Var x 5 = (Var x 4 ) + (Var x 1) eller (Var x 4 ) + (Var)
Var x 7 = (Var x 8 ) - (Var x 1) eller (Var x 8 ) - (Var)

"x4" och "x8" är alltså bara enkla shifts (två resp tre steg).

Men, fortfarande har man mest att vinna på (med avseende på
kodstorlek och hastighet) att analysera sina beräkningsbehov ordentligt.
Även en table-lookup kan ibland vara bättre än att "räkna" ! :-)

Postat: 20 mars 2007, 22:33:13
av Andax
Analogin blir ännu tydligare om man skriver:

Binärt :

b'1000' / b'10' = b'0100' : d.v.s shiftat ett steg till höger.
b'1000' / b'100' = b'0010' : d.v.s shiftat *två* steg till höger.
o.s.v.

b'1000' x b'10' = b'10000' : d.v.s shiftat ett steg till vänster.
b'1000' x b'100' = b'100000' : d.v.s shiftat *två* steg till vänster.
o.s.v.

Det inne bär att man delar eller multiplicerar med "10" oavsett vilken bas man kör i...

...bra jämförelse Sodjan.

Postat: 21 mars 2007, 08:40:33
av sodjan
Sant... :-)

Eller, vilket också blir tydligare :

Binärt :

b'1000' delat med två = b'0100' : d.v.s shiftat ett steg till höger.
b'1000' delat med fyra = b'0010' : d.v.s shiftat *två* steg till höger.
o.s.v.

b'1000' gånger två = b'10000' : d.v.s shiftat ett steg till vänster.
b'1000' gånger fyra = b'100000' : d.v.s shiftat *två* steg till vänster.
o.s.v.

"två" = "två" oavsett vilken bas man kör i... :-)

Postat: 21 mars 2007, 09:28:25
av Andax
Tror du missförstår mig Sodjan.

Vad jag menade är att

'1000' delat med '10' är '100' oavsett basen.

Tar man t.ex oktalt så blir o'1000' delat med o'10' = o'100' osv
Vid hex är x'1000' delat med x'10' = x'100'...

basen kan ju vara vilket heltal som helst >= 2

Postat: 21 mars 2007, 11:13:51
av sodjan
> Tror du missförstår mig Sodjan.

Absolut inte !

Jag tyckte bara att det fungerarde lika bra med "delat med två" eftersom
det *också* fungerar oavsett bas...