thanks jinx, you lightup my mind, below my optimize sample coding after modified, looks better now, and i like the idea of 'moving averages' but difficult to added in., 8 analog split in 2 groups, Group_A : ext_vref=2.5v, 2.441mV/step, measure range 0~2.5v.. Group_B : ext_vref=2.5v, (2.441mV*16)/step, measure range up to 40v @ 39.056mv / step , use devided resister 150k//10k.. for i=1 to 10 raw_value=adc_read(an0) //: sub call, multiplx and select an0, read value put in raw_value an0_value=an0_value+raw_value raw_value=adc_read(an1) an1_value=an1_value+raw_value raw_value=adc_read(an2) an2_value=an2_value+raw_value raw_value=adc_read(an3) an3_value=an3_value+raw_value raw_value=adc_read(an4) an4_value=an4_value+raw_value raw_value=adc_read(an5) an5_value=an5_value+raw_value raw_value=adc_read(an6) an6_value=an6_value+raw_value raw_value=adc_read(an7) an7_value=an7_value+raw_value next i an0_value=(an0_value/10)*2441 / 1000 //: get back reading in mv range an1_value=(an1_value/10)*2441 / 1000 an2_value=(an2_value/10)*2441 / 1000 an3_value=(an3_value/10)*2441 / 1000 an4_value=(an4_value/10)*2441 / 1000 *16 //: get back reading in mv range and 16x an5_value=(an5_value/10)*2441 / 1000 *16 an6_value=(an6_value/10)*2441 / 1000 *16 an7_value=(an7_value/10)*2441 / 1000 *16 -- http://www.piclist.com PIC/SX FAQ & list archive View/change your membership options at http://mailman.mit.edu/mailman/listinfo/piclist