PIC matematiska uträkningar
PIC matematiska uträkningar
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
//Daniel A
> 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...
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...
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
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
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.
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.
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" !
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" !

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.
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.
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...

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...
