📄 csd2x_1.asm
字号:
call CSD2X_1_EnableSensor ; Enable Sensor
M8C_SetBank1
or reg[MUX_CR0], 20h ; Connect P0[5]
M8C_SetBank0
; Set scanning speed
mov A, reg[CSD0_CR1] ; Read current register value
mov [CSD2X_1_bBitMask], A
mov A, [CSD2X_1_bSensorNumLeft]
index CSD2X_1_ScanSpeed_Table_Left ; A contains the scanning speed value
asl A ; Move to the right position
asl A
and [CSD2X_1_bBitMask], 0F3h ; Clear clock devider bits CSDCLK/1
or [CSD2X_1_bBitMask], A ; Set New scanning speed value
mov A, [CSD2X_1_bBitMask]
mov reg[CSD0_CR1], A ; Write new register value
; Configure multishot Left
mov [CSD2X_1_bBitMask], 10h
mov A, [CSD2X_1_bSensorNumLeft]
index CSD2X_1_ScanSpeed_Table_Left ; A contains the scanning speed value
jz .L1
.L0:
asl [CSD2X_1_bBitMask] ; Move to right position
dec A
jnz .L0
.L1:
mov A, [CSD2X_1_bBitMask]
mov X, A ; Store the old data
mov A, reg[CSD0_CR0]
and A, ~0F0h ; Clear M_SHOT bits
mov [CSD2X_1_bBitMask], A
mov A, X
or [CSD2X_1_bBitMask], A
mov A, [CSD2X_1_bBitMask]
mov reg[CSD0_CR0], A ; Set multishot
; Set resolution Left
IF (CSD2X_1_LEFT_PRECHARGE_SRC & CSD2X_1_PRECHARGE_PRS) ; PRS
mov A, [CSD2X_1_bSensorNumLeft];
index CSD2X_1_Resolution_Table_Left ; A contains the resolution value
asl A
inc A
mov X, A
index CSD2X_1_PRS_Poly_Table ; A contains the polynomial value LSB
mov reg[CSD0_DR1_L], A ; Write the polynomial value LSB
mov A, X
dec A
index CSD2X_1_PRS_Poly_Table ; A contains the polynomial value MSB
mov reg[CSD0_DR1_H], A ; Write the polynomial value MSB
ELSE ; Timer
mov A, [CSD2X_1_bSensorNumLeft]
index CSD2X_1_Resolution_Table_Left ; A contains the resolution number
index CSD2X_1_Timer_Res_Table ; A contains the resolution value
mov reg[CSD0_DR1_H], A
mov reg[CSD0_DR1_L], 0FFh ; Set new value
ENDIF
// Right Channel
cmp [CSD2X_1_bSensorNumRight], 0FFh ; Check is scan enabled
jnc .Scan ; Go to scan if only lefrt channel is enabled
.ScanRight:
mov A, [CSD2X_1_bSensorNumRight]
index CSD2X_1_RefValue_Table_Right ; A contains the reference value
call CSD2X_1_SetRightRefValue
; Set DAC values
IF (CSD2X_1_AUTOCALIBRATION)
mov A, [CSD2X_1_bSensorNumRight]
mov X, A ; Get array index
RAM_SETPAGE_IDX >CSD2X_1_baDACCodeBaselineR
mov A, [X+CSD2X_1_baDACCodeBaselineR] ; Get right DAC value from memory
call CSD2X_1_SetRightDACValue
ELSE
mov A, [CSD2X_1_bSensorNumRight]
index CSD2X_1_DACR_Table ; A contains the right DAC value from ROM table
call CSD2X_1_SetRightDACValue
ENDIF
mov A, [CSD2X_1_bSensorNumRight]
call CSD2X_1_wGetPortPinRight ; Get sensor pin and port
call CSD2X_1_EnableSensor ; Enable Sensor
M8C_SetBank1
or reg[MUX_CR0], 80h ; Connect P0[7]
M8C_SetBank0
; Set scanning speed
mov A, reg[CSD1_CR1] ; Read old register value
mov [CSD2X_1_bBitMask], A
mov A, [CSD2X_1_bSensorNumRight]
index CSD2X_1_ScanSpeed_Table_Right ; A contains the scanning speed value
asl A
asl A
and [CSD2X_1_bBitMask], 0F3h ; Clear clock devider bits CSDCLK/1
or [CSD2X_1_bBitMask], A ; Set New scanning speed value
mov A, [CSD2X_1_bBitMask]
mov reg[CSD1_CR1], A ; Write new register value
; Configure multishot Right
mov [CSD2X_1_bBitMask], 10h
mov A, [CSD2X_1_bSensorNumRight];
index CSD2X_1_ScanSpeed_Table_Right ; A contains the scanning speed value
jz .L3
.L2:
asl [CSD2X_1_bBitMask] ; Move to right position
dec A
jnz .L2
.L3:
mov A, [CSD2X_1_bBitMask]
mov X, A ; Store the data
mov A, reg[CSD1_CR0]
and A, ~0F0h ; Clear multishot bits
mov [CSD2X_1_bBitMask], A
mov A, X
or [CSD2X_1_bBitMask], A
mov A, [CSD2X_1_bBitMask]
mov reg[CSD1_CR0], A ; Write new multishot value
; Set resolution Right
IF (CSD2X_1_RIGHT_PRECHARGE_SRC & CSD2X_1_PRECHARGE_PRS) ; PRS
mov A, [CSD2X_1_bSensorNumRight];
index CSD2X_1_Resolution_Table_Right ; A contains the resolution value
asl A
inc A
mov X, A
index CSD2X_1_PRS_Poly_Table ; A contains the polynomial value LSB
mov reg[CSD1_DR1_L], A ; Write the polynomial value LSB
mov A, X
dec A
index CSD2X_1_PRS_Poly_Table ; A contains the polynomial value MSB
mov reg[CSD1_DR1_H], A ; Write the polynomial value MSB
ELSE ; Timer
mov A, [CSD2X_1_bSensorNumRight];
index CSD2X_1_Resolution_Table_Right ; A contains the resolution number
index CSD2X_1_Timer_Res_Table ; A contains the resolution value
mov reg[CSD1_DR1_H], A
mov reg[CSD1_DR1_L], 0FFh ; Write resolution
ENDIF
; Start CSD
.Scan:
cmp [CSD2X_1_bSensorNumLeft], 0FFh ; Check is scan enabled
jnc .N0
or reg[CSD0_CR0], 1 ; Enable CSD0
or [CSD2X_1_bfStatus_Left], CSD2X_1_SCAN_ACTIVE ; Set scan active flag
.N0: cmp [CSD2X_1_bSensorNumRight], 0FFh ; Check is scan enabled
jnc .N1
or reg[CSD1_CR0], 1 ; Enable CSD1
or [CSD2X_1_bfStatus_Right], CSD2X_1_SCAN_ACTIVE ; Set scan active flag
.N1:
; Start Scan
mov reg[INT_VC], 0 ; Clear pending interrupts
or reg[INT_MSK2], 60h ; Enable CSD0 and CSD1 Interrupts
; Wait for data
.waitforinterrupt:
tst [CSD2X_1_bfStatus_Left], CSD2X_1_SCAN_ACTIVE ; Check scan active flag
jnz .waitforinterrupt ; Go to check data complete flag if zero
tst [CSD2X_1_bfStatus_Right], CSD2X_1_SCAN_ACTIVE ; Check scan active flag
jnz .waitforinterrupt ; Go to check data complete flag if zero
; Data are complete
and reg[INT_MSK2], ~60h ; Disable CSD Interrupts
; Disconnect filter capacitors from BUS
M8C_SetBank1
and reg[MUX_CR0], ~A0h;
M8C_SetBank0
cmp [CSD2X_1_bSensorNumLeft], 0FFh ; Check is scan enabled
jnc .N2
mov A, [CSD2X_1_bSensorNumLeft];
call CSD2X_1_wGetPortPinLeft ; Get sensor pin and port
call CSD2X_1_DisableSensor ; Disable Sensor
.N2:
cmp [CSD2X_1_bSensorNumRight], 0FFh ; Check is scan enabled
jnc .N3
mov A, [CSD2X_1_bSensorNumRight];
call CSD2X_1_wGetPortPinRight ; Get sensor pin and port
call CSD2X_1_DisableSensor ; Disable Sensor
.N3:
and reg[CSD0_CR0],~1 ; Disable CSD Left
and reg[CSD1_CR0],~1 ; Disable CSD Right
RAM_EPILOGUE RAM_USE_CLASS_3
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: CSD2X_1_ScanAllSensors(void)
;
; DESCRIPTION:
; Scans all sensors to measure their raw count values
;
;-----------------------------------------------------------------------------
;
; ARGUMENTS: None.
; RETURNS: None
; SIDE EFFECTS:
; The A and X registers may be modified by this or future implementations
; of this function. The same is true for all RAM page pointer registers in
; the Large Memory Model. When necessary, it is the calling function's
; responsibility to perserve their values across calls to fastcall16
; functions.
;
CSD2X_1_ScanAllSensors:
_CSD2X_1_ScanAllSensors:
RAM_PROLOGUE RAM_USE_CLASS_3
mov A,CSD2X_1_TotalLeftSensorCount ; Loop through all left sensors
dec A
mov X,CSD2X_1_TotalRightSensorCount ; Loop through all right sensors
dec X
.ScanLoop: ; Synchronous scan both channels
push A ; Save current left sensor
push X ; Save current right sensor
call CSD2X_1_ScanSensor ; Scan both channels
pop X ; Restore right channel number
mov A, X
cmp A, 0FFh ; Are right sensor scan complete?
jnc .Dec0
dec X ; Decrement pointer to scan next sensor
.Dec0:
pop A ; Restore Left Sensor
cmp A, 0FFh ; Are left sensor scan complete?
jnc .Check
dec A ; Decrement pointer to scan next sensor
jnc .ScanLoop
.Check:
swap A, X ; Compare right cnahhel to end of scan
cmp A, 0FFh
jnc .End ; FO to end scan if left and right channels are FF
swap A, X
jmp .ScanLoop
.End:
RAM_EPILOGUE RAM_USE_CLASS_3
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: CSD2X_1_wReadSensor(BYTE bSensor)
;
; DESCRIPTION:
; Returns the sensor scan value in A (LSB) and X (MSB)
;-----------------------------------------------------------------------------
;
; ARGUMENTS:
; A = Sensor number
; RETURNS:
; Scan value of sensor LSB in A and MSB in X
; SIDE EFFECTS:
; The A and X registers may be modified by this or future implementations
; of this function. The same is true for all RAM page pointer registers in
; the Large Memory Model. When necessary, it is the calling function's
; responsibility to preserve their values across calls to fastcall16
; functions.
;
CSD2X_1_wReadSensor:
_CSD2X_1_wReadSensor:
RAM_PROLOGUE RAM_USE_CLASS_3
RAM_SETPAGE_IDX >CSD2X_1_waSnsResult
asl A ; Multiply by two since results are INTs
mov X,A
CSD2X_1_DisableInt_M_L
CSD2X_1_DisableInt_M_R
mov A,[X+(CSD2X_1_waSnsResult+LSB)]
mov X,[X+(CSD2X_1_waSnsResult+MSB)]
CSD2X_1_EnableInt_M_L
CSD2X_1_EnableInt_M_R
RAM_EPILOGUE RAM_USE_CLASS_3
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: CSD2X_1_SetLeftRefValue
; DESCRIPTION:
; Set Left Channel Reference Value
;-----------------------------------------------------------------------------
; ARGUMENTS: A = Reference value 0...7
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -