We choose to go to the moon. We choose to go to the moon in this decade and do the other things,
not because they are easy, but because they are hard, because that goal will serve to organize and measure the best of our energies and skills, because that challenge is one that we are willing to accept, one we are unwilling to postpone, and one which we intend to win, and the others, too.
John F. Kennedy

Notice in the image that all spurious samples were rejected.
And where the samples changed from 6798 to 3899, the average caught up after 2 samples (adjustable with a constant). 
Code:
DEFINE OSC 20
DEFINE LCD_DREG PORTB 'LCD data port
DEFINE LCD_DBIT 0 'LCD data starting bit 0 or 4
DEFINE LCD_RSREG PORTB 'LCD register select port
DEFINE LCD_RSBIT 4 'LCD register select bit
DEFINE LCD_EREG PORTB 'LCD enable port
DEFINE LCD_EBIT 5 'LCD enable bit
DEFINE LCD_BITS 4 'LCD bus size 4 or 8
DEFINE LCD_LINES 2 'Number lines on LCD
DEFINE LCD_COMMANDUS 2000 'Command delay time in us
DEFINE LCD_DATAUS 50 'Data delay time in us
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 129 ' 9600 Baud @ 20MHz, 0.16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically
'----[Averaging Options]------------------------------------------------------------------
AvgCount CON 16 ' Number of samples to average
FAspread CON 50 ' Fast Average threshold +/-
Reject CON 2 ' Spurious Rejection level
;----[Variables]--------------------------------------------------------------------------
Value VAR WORD
RejCount VAR BYTE
ADavg VAR WORD
;----[Initialize]-------------------------------------------------------------------------
RejCount = 0
ADavg = 0
;----[Main Program Loop]------------------------------------------------------------------
Main:
HSERIN [wait($FF),DEC Value] ; get a sample
HSEROUT ["Smpl= ",DEC Value]
LCDOUT $FE,$80,"Smpl= ",DEC Value," "
GOSUB Average ; average it
HSEROUT [" Avg= ",DEC ADavg] ; ," Avg2= ",DEC ADavg2,13,10]
IF RejCount > 0 THEN HSEROUT [" Rejected"] ; indicate if rejected
HSEROUT [13,10]
LCDOUT $FE,$C0,"Avg = ",DEC Value," "
LCDOUT $FE,$94,"FC = ",DEC RejCount," "
GOTO Main
' -=-=-=-=-=-= Average Sample values -=-=-=-=-=-=-=-=-=-=
Average:
IF Value = ADavg Then RejCount = 0 : RETURN ; NoChange
IF ABS (Value - ADavg) > FAspread OR Value < AvgCount Then FastAvg
IF ABS (Value - ADavg) < AvgCount Then RealClose
ADavg = ADavg - (ADavg/AvgCount)
ADavg = ADavg + (Value/AvgCount)
RejCount = 0
GoTo AVGok
FastAvg:
RejCount = RejCount + 1
IF RejCount = Reject + 1 THEN
ADavg = Value
RejCount = 0
ENDIF
GoTo AVGok
RealClose:
RejCount = 0
ADavg = ADavg - (ADavg/(AvgCount/4))
ADavg = ADavg + (Value/(AvgCount/4))
AVGok:
Value = ADavg ' Put Average back into Value
NoChange:
Return
Bookmarks