Well, the way I achieve that is to take say 16 ADC readings, sort them in sequential order of value, junk the top and bottom four readings as being 'out-of-range', sum and average the middle eight... this makes ADC readings in industrial applications pretty much bomb-proof...
Now, whilst there's quite a few tricks and treats within this, here's a simple sort routine for doing just that (when you analyse it, it's pretty similar to your example Trent albeit a little more compact)... The Data to be sorted sits in an array called RawData, and when it falls out of the subroutine, RawData is in sequential order. Change DataA and RawData variables to WORDS if you need them. Those that know will notice that the additional variable DataA is only needed because PBP's SWAP command doesn't work with arrays.
CounterA var Byte DataA var Byte RawData var Byte [16] .. .. ' ' Sort Array ' ---------- SortArray: CounterA=0 SortLoop: If RawData(CounterA+1) < RawData(CounterA) then DataA=RawData(CounterA) RawData(CounterA)=RawData(CounterA+1) RawData(CounterA+1+0)=DataA If CounterA > 0 then CounterA=CounterA-2 endif CounterA=CounterA+1 If CounterA < 15 then goto SortLoop Return
;Initialize your hardware first A VAR WORD B VAR WORD TempA VAR WORD TempB VAR WORD LCDOUT $FE,1 For A = 0 to 65535 LCDOUT $FE,2,"A=",DEC A For B = 0 to 65535 TempA = A TempB = B TempA = TempA ^ TempB TempB = TempA ^ TempB TempA = TempA ^ TempB IF (TempA <> B) OR (TempB <> A) THEN ; Test Failed LCDOUT $FE,1,"Test Failed",$FE,$C0,"A=",DEC A,", B =",DEC B STOP ENDIF Next B Next A LCDOUT $FE,1,"Test Passed!" STOP
you would no doubt see the message "Test Passed!" on the LCD.
Only a half hour into it, but it's still passing. Kinda obvious what the result will be.
Update: 43hrs, Test Passed! (obviously)
Re: K42 and Timer Interrupts
Thanks for the explanation.
Ioannis - 28th April 2025, 19:28I misinterpreted these paragraphs. My understanding was to have ASYNC cleared and use Fosc/4.
Ioannis