; first roll old data down a byte (17 byte stack of data);0x1aa - start of Oxydataroll
movlw (Oxydataroll+.15) ; decimal 15, last addy of (0-15) ,16 samples, 1 extra for 'overflow sample' => 17 bytes of sequential GPR.
movwf FSR ; setup indirect addr
;bsf STATUS,IRP ; bankswitch (if required) for FSR to banks 2&3
Rolldata
movf INDF,w ; get upper byte
; sum data on the fly.
addwf TempL,f
btfsc STATUS,C
incf TempH,f
; now continue data roll
incf FSR,f ; point to lower byte
movwf INDF ; move upper byte here.
decf FSR,f ; back to orig. upper byte
movlw Oxydataroll ; start of Oxydataroll
subwf FSR,w
btfsc STATUS,Z ; test if we have done all the 16 bytes.
goto Rolldone
decf FSR,f ; point to higher upper byte.
goto Rolldata ; keep going
Rolldone ; now push latest oxydata sample into top of oxy data roll stack.
banksel Oxydata
movf Oxydata,w ; current adc sample
movwf INDF ; top byte of stack
;bcf STATUS,IRP ; bankswitch (if req'd) for FSR to banks 0,1
movlw .16 ; # of bytes summed in TempL, TempH => total cannot exceed 12 bits of a 16bit #.
;Do a 12 bit divide by .16.
movlw b'11110000'
andwf TempL,f ; clr low nybble.
swapf TempL,f ; swap nybbles
swapf TempH,w ;swap nybbles
andlw b'11110000' ; clr the current lo nybble (was hi nybble b4 swap)
iorwf TempL,w ; unite nybbles to make = div by 16 result in wreg.
; Result of 16 element moving avg in wreg, recalc'd upon every new single sample for smooth averaging.