OK Adam, you asked for it... here it is... quickly thrown together for an 18F2420... (you can probably optimise it with a bit of thought, but it's a starter just to get going)...
The variables...
Code:
ADCValue var WORD ' Final ADC Result
CounterA var BYTE ' Just a BYTE Temporary working variable
DataW var WORD ' Just a WORD Temporary working variable
RawData var WORD [16] ' Array holding ADC Result
Some Initialisation Set-up's for the PIC....
Code:
ADCON1=%00001110 ' ADC Control 1
' 7=0 - 0 Unused
' 6=0 - 0 Unused
' 5=0 - VRef=Vss
' 4=0 - VRef=Vdd
' 3=1 )
' 2=1 ) RA0 set to Analogue
' 1=1 ) All others set to Digital
' 0=0 )
ADCON2=%10101001 ' ADC Control 2
' 7=1 - Right Justified - Read 10-Bits
' 6=0 - 0 Unused
' 5=1 )
' 4=0 ) TAD
' 3=1 )
' 2=0 )
' 1=0 ) Fosc/8
' 0=1 )
Now for the real program... First TAKE your SAMPLES...
Code:
'
' Stuff 16 Element WORD Array full of ADC values
' ----------------------------------------------
For CounterA=0 to 15
ADCON0=%00000001 ' Select Channel, Turn-On A/D
' 7=0 Unused
' 6=0 Unused
' 5=0 )
' 4=0 )
' 3=0 ) selects AN0
' 2=0 )
' 1=0 Go-done Bit
' 0=1 switch-On ADC Module
Pauseus 50 ' Wait for channel to setup
ADCON0.1 = 1 ' Start conversion
While ADCON0.1=1:Wend ' Wait for conversion
DataW.HighByte=ADRESH ' Read variable from ADC and save
DataW.LowByte=ADRESL
RawData(CounterA)=DataW
Next CounterA
Then SORT your RESULTS...
Code:
'
' Sort ADC Input
' --------------
CounterA=0
GetADCSortLoop:
If RawData(CounterA+1) < RawData(CounterA) then
DataW=RawData(CounterA)
RawData(CounterA)=RawData(CounterA+1)
RawData(CounterA+1)=DataW
If CounterA>0 then CounterA=CounterA-2
endif
CounterA=CounterA+1
If CounterA<15 then goto GetADCSortLoop
Finally EXTRACT SOMETHING USEFUL from what you've got...
Code:
'
' Quanticise discarding top and bottom FOUR elements
' ----------------------------------------------------
DataW=0
For CounterA=4 to 11
DataW=DataW+RawData(CounterA)
Next CounterA
ADCValue=DataW>>3 ' Divide Result by EIGHT
Ain't so difficult when you break it down into little steps is it?
Bookmarks