Sub
Listing index
Vischk
Routine:        Visc    
Function:       Reads the absolute, uncalibrated viscosity, does a least squares best fit on the data
Called by:      Calib, meas
Calls:          Add, Divide, Equals, Fpint, Mult, Range, Read, Regld, Regsv, Sub
Entry:          HL points to address of viscosity variable
Exit:           C flag is set on error; viscosity is stored at HL
Preserved:      All


VISC    CALL    REGSV
        PUSH    HL
; Set the statistical variables initially equal to zero.
        LD      DE,STATXX
        LD      HL,ZERO
        CALL    EQUALS
        LD      DE,STATXY       
        CALL    EQUALS
        LD      DE,STATYY
        CALL    EQUALS
        LD      DE,STATX
        CALL    EQUALS
        LD      DE,STATY
        CALL    EQUALS
        CALL    RANGE
; Call subroutine Range to find the range of measurement.
        RET     C
        XOR     A
        OUT     (143),A
        LD      DE,NUM6
        LD      HL,NUM7
        LD      B,10
; Call read with ten revolutions at maximum speed.
        CALL    READ
        LD      B,10
; Use B as an index variable, to count the 10 readings.
VISC1   PUSH    BC
        LD      IX,RNGMIN
Convert Rngmin to integer and output this motor speed to the DAC.
        CALL    FPINT
        LD      A,L
        OUT     (142),A
        LD      A,H
        OUT     (143),A
        LD      DE,NUM6
        LD      HL,NUM7
        LD      B,10
; Take the reading, with 10 revolutions.
        CALL    READ
; Now compute the various statistical variables that are required for the best fit. See text for explanation.
        LD      BC,NUM7
        LD      DE,NUM7
        LD      HL,NUM8
        CALL    MULT
        LD      BC,STATXX
        LD      DE,NUM8
        LD      HL,STATXX
        CALL    ADD
        LD      BC,NUM7
        LD      DE,NUM6
        LD      HL,NUM8
        CALL    MULT
        LD      BC,STATXY
        LD      DE,NUM8
        LD      HL,STATXY
        CALL    ADD
        LD      BC,NUM6
        LD      DE,NUM6
        LD      HL,NUM8
        CALL    MULT
        LD      BC,STATYY
        ÖD      DE,NUM8
        LD      HL,STATYY
        CALL    ADD
        LD      BC,NUM7
        LD      DE,STATX
        LD      HL,STATX
        CALL    ADD
        LD      BC,NUM6
        LD      DE,STATY
        LD      HL,STATY
        CALL    ADD
        LD      BC,RNGMIN
        LD      DE,RNGINC
        LD      HL,RNGMIN
; Add the range increment to Rngmin to get the new motor speed.
        CALL    ADD
        POP     BC
; Loop if 10 readings have not yet been taken.
        DJNZ    VISC2
        JR      VISC3
VISC2   JP      VISC1
VISC3   LD      BC,STATX
; Final calculation of the best fit.
        LD      DE,STATX
        LD      HL,NUM8
        CALL    MULT
        LD      BC,NUM8
        LD      DE,TEN
        CALL    DIVIDE
        LD      BC,STATXX
        LD      DE,NUM8
        LD      HL,STATXX
        CALL    SUB
        LD      BC,STATX
        LD      DE,STATY
        LD      HL,NUM8
        CALL    MULT
        LD      BC,NUM8
        LD      DE,TEN
        CALL    DIVIDE
        LD      BC,STATXY
        LD      DE,NUM8
        LD      HL,STATXY
        CALL    SUB
        LD      BC,STATY
        LD      DE,STATY
        LD      HL,NUM8
        CALL    MULT
        LD      BC,NUM8
        LD      DE,TEN
        CALL    DIVIDE
        LD      BC,STATYY
        LD      DE,NUM8
        LD      HL,STATYY
        CALL    SUB
        LD      BC,STATXY
        LD      DE,STATXX
        POP     HL
; Viscosity now returned in HL.
        CALL    DIVIDE
        LD      A,255
        OUT     (143),A
        CALL    REGLD
        OR      A
        RET
 
Sub
Listing index
Vischk