//adc_sub.a51 $NOMOD51 $include (reg1210.inc) PUBLIC unipolar, bipolar, read_sum_regs PUBLIC deltasigma, _adc_win adc_sub SEGMENT CODE RSEG adc_sub ;;;;;;;;;;;;;;;;;;;;; ; moving average ADC conversion and window calc ; long int adc_win(unsigned char i); ; return adc - win[i] and update win[i] with adc ; i point to long int xdata array _adc_win: mov a, r7 ; r7*4-> DPTR swap a ; r7.7~6 -> dph.1~0 rr a rr a anl a,#03h mov dph,a mov a,r7 ; r7.5~0,0,0 -> dpl rl a rl a anl a,#0fch mov dpl,a call deltasigma ; adc -> r4~7 movx a,@dptr ; r0~3 <- win[i], win[i] <- adc mov r0,a mov a, r4 movx @dptr,a inc dptr movx a,@dptr mov r1,a mov a, r5 movx @dptr,a inc dptr movx a,@dptr mov r2,a mov a, r6 movx @dptr,a inc dptr movx a,@dptr mov r3,a mov a, r7 movx @dptr,a adcsub: clr c ; r4~7 <- r4~7(adc) - r0~3 (old win[i]) mov a,r7 subb a,r3 mov r7,a mov a,r6 subb a,r2 mov r6,a mov a,r5 subb a,r1 mov r5,a mov a,r4 subb a,r0 mov r4,a ret ;;;;;;;;;;;;;;;;;;;;; ; signed long deltasigma(void) ; return the 3 byte adres to R4567 (MSB~LSB) ; return signed long int with sign-extend R4 for bipolar ; and stuff 0 on R4 for unipolar ; ADCON0[7]=OSE ;P1.7 =0: Conversion with reversed ADMUX ; +-------------- reverse ADMUX (Last-ADC)/2 ; | +-------- default ADMUX ; | | +--- (ADC-Last)/2 ; V V V ;P1.7 -----|________|--------|_______ ; ; ; ; deltasigma: mov a,ADCON0 rlc a jnc ds_once ; if AZ=0 then ds once jb P1.7, ds_nosw ; default ADMUX setting mov a,ADMUX swap a mov ADMUX,a ds_nosw: call ds_once call ds_once call ds_once call ds_once call ds_once ; r4~7 <- new adc mov r3,DPL1 ; r0~3 <- last adc mov r2,DPH1 mov r1,BPL mov r0,BPH mov DPL1,r7 ; last <- new mov DPH1,r6 mov BPL,r5 mov BPH,r4 jb P1.7,ds_adcsub ; If set: (ADC-Last)/2 else (Last-ADC)/2 mov a,r7 ; XCH (r4~7, r0~3) xch a,r3 xch a,r7 mov a,r6 xch a,r2 xch a,r6 mov a,r5 xch a,r1 xch a,r5 mov a,r4 xch a,r0 xch a,r4 ds_adcsub: call adcsub ; adcsub: r4~7 -= r0~3 ; mov a,r4 ; r4~7 /= 2; 2's comp div rlc a ; c has sign mov a,r4 ; (c,r4)>>1->c rrc a mov r4,a mov a,r5 ; (c,r5)>>1->c rrc a mov r5,a mov a,r6 ; (c,r6)>>1->c rrc a mov r6,a mov a,r7 ; (c,r7)>>1->c rrc a mov r7,a jb P1.7, ds_done mov a,ADMUX swap a mov ADMUX,a ds_done: cpl P1.7 ret ds_once: mov a,AIE jnb acc.5,ds_once mov r4,#0 mov r5,adresh mov r6,adresm mov r7,adresl mov a,ADCON1 jb acc.6, ds_unipolar ; stuffed zero for unipolar mov a,r5 jnb acc.7,ds_positive ; sign-extend for bipolar mov r4,#0ffh ds_positive: ds_unipolar: cpl P1.4 ret ;;;;;;;;;;;;;;;;;;;;; ; unsigned long unipolar(void) ; return the 3 byte adres to R4567 (MSB~LSB) ; unsigned long int with R4=0 unipolar: mov r4,#0 mov r5,adresh mov r6,adresm mov r7,adresl ret ;;;;;;;;;;;;;;;;;;;;; ; signed long bipolar(void) ; return the 3 byte adres to R4567 (MSB~LSB) ; return signed long int with sign extendsion on R4 bipolar: mov r4,#0 mov a,adresh mov r5,a mov r6,adresm mov r7,adresl jnb acc.7,positive mov r4,#0ffh positive: ret ;;;;;;;;;;;;;;;;;;;;; ; signed long read_sum_regs(void) ; return the 4 byte sumr to R4567 (MSB~LSB) ; return signed long int, sign extension done by hardware read_sum_regs: mov r4, SUMR3; mov r5, SUMR2; mov r6, SUMR1; mov r7, SUMR0; ret end