PIC matematiska uträkningar

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

PIC matematiska uträkningar

Inlägg 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
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg av squiz3r »

Något exempel?

Tack!
//Daniel A
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Kolla PIClist.....
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg 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.
Användarvisningsbild
squiz3r
Inlägg: 5424
Blev medlem: 5 september 2006, 20:06:22
Ort: Lund
Kontakt:

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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" ! :-)
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg 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.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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... :-)
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Inlägg 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
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg 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...
Skriv svar