Division på PIC mikrokontroller
Division på PIC mikrokontroller
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
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
Re: Division på PIC mikrokontroller
Du får se till att multiplicera/dividera med 2,4,8,16,32,64 osv, då räcker det med en rotate instruktion.
Re: Division på PIC mikrokontroller
Eller snarare en skift-instruktion.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.
Rotate stoppar väl in det som ramlar ut, i andra änden?
Re: Division på PIC mikrokontroller
Säg att jag vill dividera 4000 med 5000 .. 
Rotationstricket känner jag till.. men tror inte det löser problemet

Rotationstricket känner jag till.. men tror inte det löser problemet

Re: Division på PIC mikrokontroller
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.
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.
Re: Division på PIC mikrokontroller
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.
Re: Division på PIC mikrokontroller
> 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...
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...
Re: Division på PIC mikrokontroller
Finns andra trevliga µC:s med hederlig CISC teknik som har DIV och MUL, ala Freescale HC08.
Re: Division på PIC mikrokontroller
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.
Fast det lutar nog åt man måste köra någon form av subrutin för att klara det.
Re: Division på PIC mikrokontroller
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..
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..
Re: Division på PIC mikrokontroller
> 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.
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.
Re: Division på PIC mikrokontroller
Ä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.
Det är iaf snabbt nog åt mig och det går inte att lösa med shift osv då nämnaren är varierande.
Re: Division på PIC mikrokontroller
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.
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.
Re: Division på PIC mikrokontroller
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%
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%
Re: Division på PIC mikrokontroller
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.
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.