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