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日 13:17, local time: 2025年9月2日 01:14,
40.74.122.252:LOG IN

©2025 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://techref.massmind.org/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?

Welcome to massmind.org!

Welcome to techref.massmind.org!

.

AltStyle によって変換されたページ (->オリジナル) /