PIC Microcontoller Math Method

Reciprocal 32768/x

from by Nikolai Golovchenko

Don't know how to explain its operation, but what it does is approximate calculation of 32768/x using linear interpolation between points where x=1,2,4,8,16,32,64,128,256.

The routine can be extended for other number of bits in x.

;test
        cblock
        x, yh, yl
        endc

        clrf x
;       movlw 129
;       movwf x
again
        call Reciprocal8
        nop
        incf x, f
        goto again

;****************************************************
;
; Approximate calculation of 32768/x
; Input: x
; Output: y = 256 * yh + yl ~= 32768/x
;
; To calculate reciprocal, linear interpolation
; is used between points, where x=1,2,4,8,16,32,64,128
;
; Size: 19 instructions
; Execution speed(worst case including return):
;  6+4*8-1+4+4+2=47
;
; 4 Aug 2000 by Nikolai Golovchenko
;****************************************************
Reciprocal8
        movf x, w
        skpnz
         retlw 1        ;error - division by zero
        movwf yh
        clrf yl
        setc
Reciprocal8a
        rrf yl, f
        rlf yh, f
        skpc
         goto Reciprocal8a

        clrc
        rrf yh, w
        clrf yh
        subwf yh, f
Reciprocal8b
        rrf yh, f
        rrf yl, f
        skpc
         goto Reciprocal8b
        retlw 0         ;ok
;****************************************************