Division på PIC mikrokontroller

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Division på PIC mikrokontroller

Inlägg av blueint »

Om man har två positiva heltal 16-bitars (8-bit kan gå också) och vill få division av dessa. Finns det någon färdig instruktion som t.ex MUL för multiplikation ..?

Divisionsrutin går, fast dessa har rätt lite plats så jag tänkte om man kan få ner kodutrymmet.

Tänkte om det går med någon av dessa:
PIC16F5x
PIC10F20x
PIC10F22x
PIC12F50x
Användarvisningsbild
AndLi
Inlägg: 18312
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Division på PIC mikrokontroller

Inlägg av AndLi »

Du får se till att multiplicera/dividera med 2,4,8,16,32,64 osv, då räcker det med en rotate instruktion.
Användarvisningsbild
ToB
Inlägg: 678
Blev medlem: 22 februari 2004, 10:32:58
Skype: tobias_bjork
Ort: Sollentuna

Re: Division på PIC mikrokontroller

Inlägg av ToB »

AndLi skrev:Du får se till att multiplicera/dividera med 2,4,8,16,32,64 osv, då räcker det med en rotate instruktion.
Eller snarare en skift-instruktion.
Rotate stoppar väl in det som ramlar ut, i andra änden?
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Division på PIC mikrokontroller

Inlägg av blueint »

Säg att jag vill dividera 4000 med 5000 .. :badgrin:
Rotationstricket känner jag till.. men tror inte det löser problemet ;)
Användarvisningsbild
AndLi
Inlägg: 18312
Blev medlem: 11 februari 2004, 18:17:59
Ort: Knivsta
Kontakt:

Re: Division på PIC mikrokontroller

Inlägg av AndLi »

ToB: Helt korrekt! Slarvfel av mig.

blueint: Om man kan vara lite flexibel i sitt delande så borde det gå att lösa, om jag inte missminner mig helt fel så finns det en sida som räknar ut just hur man utnyttjar skifttricket för olika multiplikationer/divisioner.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Division på PIC mikrokontroller

Inlägg av v-g »

Kolla piclist där finns färdiga rutiner för dividering av olika tal med vilken täljare/nämnare du vill. Ta den du finner mest lämplig då det finns allt från 8 till 24 BITars division.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Division på PIC mikrokontroller

Inlägg av sodjan »

> Finns det någon färdig instruktion som t.ex MUL för multiplikation ..?

Det är ca 35 instruktioner att kolla.
Exakt hur lång tid tar det för att konstatera att det *INTE* finns någon DIV instruktion ??
30 sekunder ? (Och det finns ingen MUL heller, för den delen.)
Så RTFM är nog tyvärr rätt svar i just detta fall...
Användarvisningsbild
psynoise
EF Sponsor
Inlägg: 7230
Blev medlem: 26 juni 2003, 19:23:36
Ort: Landvetter

Re: Division på PIC mikrokontroller

Inlägg av psynoise »

Finns andra trevliga µC:s med hederlig CISC teknik som har DIV och MUL, ala Freescale HC08.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Division på PIC mikrokontroller

Inlägg av blueint »

Sodjan, När jag kollade en pdf med instruktionsuppsättningen sist så vart det några MULxx instruktioner men inga DIV. Däremot hittade jag en del divisionsrutiner på webben, men tycker att det borde finnas enklare metoder.

Fast det lutar nog åt man måste köra någon form av subrutin för att klara det.
Användarvisningsbild
Marta
EF Sponsor
Inlägg: 7487
Blev medlem: 30 mars 2005, 01:19:59
Ort: Landskrona
Kontakt:

Re: Division på PIC mikrokontroller

Inlägg av Marta »

Divisionsinstruktioner skall inte övervärderas,. de är vanligtvis ganska begränsade.

Om den ger ett resultat i form av kvot samt rest så kan den hjälpa till att dividera en godtyckligt stor dividend, men är divisorn större än vad instruktionen kan hantera direkt så är den till föga nytta.

Det är varken svårt, särskilt utrymmeskrävande eller extremt långsamt att utföra division med en PIC. Skall Du räkna mycket så bör Du däremot välja PIC18. Inte så mycket för dess 8x8 inbyggda multiplikator som för dess instruktionsset. Där finns add/sub with carry och det gör skillnad. Finns även en compare som kan vara till nytta- Dessutom 3 indexregister..
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Division på PIC mikrokontroller

Inlägg av sodjan »

> När jag kollade en pdf med instruktionsuppsättningen sist så vart det några MULxx instruktioner men inga DIV.

Helt omöjligt att kommentera om man inte vet vad du har läst för dokument.

Men de PIC10, -12 och -16 processorer som du gav exempel på i ditt första inlägg
saknar definitivt både MUL och DIV, så det var i alla fall inget dokument som är
rellevant för just dessa processorer som du läste.

PIC18 serien däremot har två MULxx instruktioner (8x8 multiplikation), dock saknas fortfarande DIV.

Men som sagt, detta är ju uppenbart om man kollar instruktionslistan
som finns i varje datablad för varje processortyp.

Sen är det en annan sak att det är "smart" att skriva sin applikation (och
att konstruera hela lösningen) så att man bara får divisioner med 2, 4, 8 o.s.v.
Eller att divisioner helt undviks.
v-g
EF Sponsor
Inlägg: 7875
Blev medlem: 25 november 2005, 23:47:53
Ort: Kramforce

Re: Division på PIC mikrokontroller

Inlägg av v-g »

Är det något tidskritiskt kanske det är problem men då ska det nog vara nåt i hästväg. Kör själv en 24BIT dividerat med 16BIT och jag testade tidtagning på den nyss (900000/9014) tog c:a 1/10 ms i 20MHz ~530 cykler.

Det är iaf snabbt nog åt mig och det går inte att lösa med shift osv då nämnaren är varierande.
blueint
Inlägg: 23238
Blev medlem: 4 juli 2006, 19:26:11
Kontakt:

Re: Division på PIC mikrokontroller

Inlägg av blueint »

Tanken är att skicka ett pulståg med bredden T och om pulsen ändrar sig efter T/2 är det "1" annars "0". Men huvudpoängen är att jämföra hurvida man fått en T eller T/2. Samt att använda senast uppmätta period för att synkronisera nästa bitsändning.
Tänkte jämföra hurvida det är T eller T/2 genom att kolla om längden är mellan 25% till 75% av T. Vilket med division blir t/T => 0,25 - 0,75.

Om man t.ex. skickar i hastigheten 10 kbps. Där T=100 µs och varje räknar tick är 1 µs. Så om förra T uppmättes till 81 tick. Och nuvarande puls uppmättes till 22 tick. Ska bearbetningen av 22/81 ge en "1". Avsikten är att minimera effekten av instabila klockor.
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Division på PIC mikrokontroller

Inlägg av Icecap »

Ja men det är ju ett HELT annat problem:
1: Shifta T höger 1 steg och spara i Var1 (Var1 = 50%)
2: Shift sedan höger en gång mer och spara i Var2 (Var2 = 25%)
3: Addera Var2 till Var1. (Var1 = 50% + 25% = 75%)

Var1 = 75%
Var2 = 25%
bearing
Inlägg: 11677
Blev medlem: 2 mars 2006, 01:01:45
Ort: Ängelholm

Re: Division på PIC mikrokontroller

Inlägg av bearing »

Icecap har gett dig lösningen. Jag tänkte ge dig ett svar på frågan. På processorer med inbyggd multiplikator kan fasta divisioner ske genom att multiplicera samt skifta höger.

T.ex. kan division med tre ske genom att multiplicera ett 8-bitars tal med 86 och sedan betrakta den höga delen av produkten som kvoten. Det blir alltså talet gånger 86 delat med 256 vilket är ungefär talet delat med tre.
Skriv svar