PIC Microcontoller Math Method : Basic

Sections:

Increment / Decrement

General Purpose

; from David Cary: tested on PIC 16F877
; inc
	incf count0,f
	skpnz
	incf count1,f
	skpnz
	incf count2,f
	;... {repeat the last two lines for as wide a counter as is needed}
	; w is unchanged.
	; Status:Z is 1 if and only if counter is now all zeros.
	; rest of Status unchanged.
;from Dmitry Kiryashov
;inc
        movlw   1
        addwf   count0,F
        skpnc
        addwf   count1,F
;... {ed: repeat the last two lines for as wide a counter as is needed}
	; w is now 1
	; Status:Z and Status:C are 1 if and only if counter is now all zeros.

;dec
        movlw   1
        subwf   count0,F
        skpc
        subwf   count1,F
;... {ed: repeat the last two lines for as wide a counter as is needed}
	; w is now 1
	; Status:C is now 0 if and only if counter rolled over and is now all ones
	; Status:Z is set if the least significant byte of the counter is zero
	; (not necessarily all bytes !) and in certain other cases.

Wrap (modulus)

Often we have a value Y (like the index to a circular buffer) that normally increases by 1 each iteration, but that we want to make sure stays in the range 0 <= Y < End. by forcing Y back to zero when it runs off the end of its range.

; if( w <= Y ){ Y = 0; };
; Y is 8 bits
; by David Cary
; useful for circular buffers.
; Load the upper limit into w -- perhaps
; movlw End ; when End is a constant
; movfw End ; when End is a variable
  subwf Y,w
  skpnc
  clrf Y
; now 0 <= Y < End.

[FIXME: 16 bit version ?]

More sophisticated modulus routines are available (typically wrapped up in a routine that calculates both (A/B) and (A MOD B) at once).

Questions:

Code: