=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
    Date: Mon, 08 Nov 1999  11:23:51
    From: "Nikolai Golovchenko" 
      To: "pic microcontroller discussion list" 
 Subject: Re: Doing percentage or ratio
--------------------------------------------------------------------------------

Hello!
This message may be a little bit late :)
The topic was about how to divide a 16 bit number by 255 and round the
result. I only now clarified for myself the way to do this. Better later
than never..

There was a suggestion to take higher byte and add one if MSB of lower byte
is set. This method is not correct for every number. For example 383/255
(~=2) will give 1.
1/255 In binary form  is 0.0000 0001 0000 0001 0000 0001....
This means that for 16 bit divident and rounded result two values should be
added:
b15b14b13b12b11b10b9b8.b7b6b5b4b3b2b1b0 and
0.b15b14b13b12b11b10b9b8.
You can see that the division and rounding result is b15b14b13b12b11b10b9b8
+ e, where e=0, 1, or 2 depending on sum of fractional parts.

The correct way is:
    cblock
    RegH    ;higher byte
    RegL    ;lower byte
    endc
;*******Divide by 255****************
;RegL, RegH - input
;RegL, RegH - output
;***************************************
    movf RegH, w
    addwf RegL, f
    clrw
    btfsc _C
    movlw 1
    btfsc RegL, 7
    addlw 1
    addwf RegH, w
    movwf RegL
    clrf RegH
    rlf RegH, f
;***************************************
_

Nikolai Golovchenko, Electrical Engineering Student
National Mining University of Ukraine www.nmuu.dp.ua
Dnepropetrovsk, Ukraine
E-mail: golovchenko@mail.ru