please dont rip this site

PIC Microcontoller Input / Ouput Method

Averaging A2D results

From Tony Nixon [sales at picnpoke.com] and Scott Dattalo

Tony says:

Heres a simple setup using the FSR. Averages for 8 readings though.
        CBLOCK
Average: 8h
tempH
tempL
        ENDC

        movlw Average   ; initialise FSR
        movwf FSR

        ...
;
; PLACE A2D RESULTS INTO A ROTATING BUFFER
;
        movf ADRES,W
        movwf INDF
        incf FSR
        movlw Average + 8h
        xorwf FSR,W
        btfss STATUS,Z
        goto NFSR

        movlw Average
        movwf FSR

NFSR    ...
;Scott Dattalo interjects:
;If you have only 8 samples, and you were willing to align the array on a mod 8
;boundary, then advancing the pointer could be done easily:

   incf   fsr,w
   andlw  7
   addlw  Average
   movwf  fsr


;if you don't wish to align the array, then try this instead:

   incf   fsr,w
   addlw  -Average
   andlw  7
   addlw  Average
   movwf  fsr


;
; AVERAGE OUT THE 8 STORED VALUES WHEN A RESULT IS NEEDED
;
        movlw Average
        movwf FSR
        clrf tempH
        clrf tempL

avLoop  movf INDF,W             ; add up 8 word values
        addwf tempL
        btfsc STATUS,C
        incf tempH

        incf FSR
        movlw Average +8h
        xorwf FSR,W
        btfss STATUS,Z
        goto avLoop

        movlw Average
        movwf FSR
        bcf STATUS,C            ; div result by 8
        rrf tempH
        rrf tempL
        bcf STATUS,C
        rrf tempH
        rrf tempL
        bcf STATUS,C
        rrf tempH
        rrf tempL

        ....

And Scott also says:

Again, I think the best way to maintain a running average is by subtracting the oldest value and adding in the newest. Here's something I'll whip out as fast as I can type it - which means there's a good chance for a thinko.
; avg_lo:avg_hi - 16bit cumulative sum of last 8 samples
; samples - a circular array that holds the last 8 samples
; assume that samples and avg_lo:avg_hi are initialized to zero
;
; FSR is initialized to the start of samples
;
; W = newest sample

AVERAGE:

    addwf  avg_lo,f    ;add newest sample to the average
    skpnc
     incf  avg_hi,f

    xorwf  indf,f      ; swap oldest and newest samples
    xorwf  indf,w
    xorwf  indf,f

    subwf  avg_lo,f    ;remove the oldest sample from the average
    skpc
     decf  avg_hi,f

    incf   fsr,w       ;advance the sample pointer
    addlw  -sample
    andlw  7
    addlw  sample
    movwf  fsr

    return

There - no more looping through all of the data after every sample is acquired.

Now, I'm assuming that the division is not needed at every iteration. I tend to
put off the difficult stuff as long as possible - often times, the intermediate
calculations are more than sufficient.

But, if you want, then this is how I'd do it:

    rrf   avg_hi,w
    movwf temp_hi
    rrf   avg_lo,w
    movwf temp_lo
    rrf   temp_hi,f
    rrf   temp_lo,f
    rrf   temp_hi,f
    rrf   temp_lo,w

and if you wanted rounding:

    skpnc
     addlw 1

(You don't need to worry about clearing the carry because the average is
guranteed to be less than or equal to 255.)


PWM@

See:

Questions:


file: /Techref/microchip/avga2d.htm, 8KB, , updated: 2006/1/24 12:17, local time: 2024/12/24 09:39,
TOP NEW HELP FIND: 
3.15.203.195:LOG IN

 ©2024 These pages are served without commercial sponsorship. (No popup ads, etc...).Bandwidth abuse increases hosting cost forcing sponsorship or shutdown. This server aggressively defends against automated copying for any reason including offline viewing, duplication, etc... Please respect this requirement and DO NOT RIP THIS SITE. Questions?
Please DO link to this page! Digg it! / MAKE!

<A HREF="http://linistepper.com/techref/microchip/avga2d.htm"> PIC Microcontoller Input / Ouput Method Averaging A2D results</A>

After you find an appropriate page, you are invited to your to this massmind site! (posts will be visible only to you before review) Just type a nice message (short messages are blocked as spam) in the box and press the Post button. (HTML welcomed, but not the <A tag: Instead, use the link box to link to another page. A tutorial is available Members can login to post directly, become page editors, and be credited for their posts.


Link? Put it here: 
if you want a response, please enter your email address: 
Attn spammers: All posts are reviewed before being made visible to anyone other than the poster.
Did you find what you needed?