📄 csd2x_1hl.asm
字号:
;;*****************************************************************************
;; FILENAME: CSD2X_1HL.asm
;; Version: 1.1, Updated on 2008/10/28 at 17:22:15
;; Generated by PSoC Designer ???
;;
;; DESCRIPTION: CSD2X User Module high level software
;; implementation file for the 22x45 PSoC family of devices.
;;-----------------------------------------------------------------------------
;; Copyright (c) Cypress Semiconductor 2007. All Rights Reserved.
;;*****************************************************************************
;;*****************************************************************************
include "m8c.inc"
include "memory.inc"
include "CSD2X_1.inc"
;-----------------------------------------------
; Global Symbols
;-----------------------------------------------
export _CSD2X_1_UpdateSensorBaseline
export CSD2X_1_UpdateSensorBaseline
export _CSD2X_1_InitializeSensorBaseline
export CSD2X_1_InitializeSensorBaseline
export _CSD2X_1_bIsSensorActive
export CSD2X_1_bIsSensorActive
export _CSD2X_1_bIsAnySensorActive
export CSD2X_1_bIsAnySensorActive
export _CSD2X_1_SetDefaultFingerThresholds
export CSD2X_1_SetDefaultFingerThresholds
export _CSD2X_1_InitializeBaselines
export CSD2X_1_InitializeBaselines
export _CSD2X_1_UpdateAllBaselines
export CSD2X_1_UpdateAllBaselines
IF CSD2X_1_SLIDERS_EXIST
export _CSD2X_1_wGetCentroidPos
export CSD2X_1_wGetCentroidPos
ENDIF
;-----------------------------------------------
; Variable Allocation
;-----------------------------------------------
AREA InterruptRAM (RAM, REL, CON)
_CSD2X_1_bNoiseThreshold:
CSD2X_1_bNoiseThreshold: BLK 1
_CSD2X_1_bNegativeNoiseThreshold:
CSD2X_1_bNegativeNoiseThreshold: BLK 1
_CSD2X_1_bBaselineUpdateThreshold:
CSD2X_1_bBaselineUpdateThreshold: BLK 1
_CSD2X_1_bHysteresis:
CSD2X_1_bHysteresis: BLK 1
_CSD2X_1_bDebounce:
CSD2X_1_bDebounce: BLK 1
_CSD2X_1_bLowBaselineReset:
CSD2X_1_bLowBaselineReset: BLK 1
export _CSD2X_1_bNoiseThreshold:
export CSD2X_1_bNoiseThreshold:
export _CSD2X_1_bNegativeNoiseThreshold:
export CSD2X_1_bNegativeNoiseThreshold:
export _CSD2X_1_bBaselineUpdateThreshold:
export CSD2X_1_bBaselineUpdateThreshold:
export _CSD2X_1_bHysteresis:
export CSD2X_1_bHysteresis:
export _CSD2X_1_bDebounce:
export CSD2X_1_bDebounce:
export _CSD2X_1_bLowBaselineReset:
export CSD2X_1_bLowBaselineReset:
; Local variables
_CSD2X_1_bEndOfArray: ; Temp pointer variable
CSD2X_1_bEndOfArray: BLK 1
_CSD2X_1_fIsPressed: ; Temp variable for if any sensor is pressed
CSD2X_1_fIsPressed: BLK 1
_CSD2X_1_bCurPos: ; Temp position variable
CSD2X_1_bCurPos: BLK 1
_CSD2X_1_bSnsMaskPtr: ; Temp sensor mask pointer used in centroid calculation
CSD2X_1_bSnsMaskPtr: BLK 1
_CSD2X_1_bStartIndex: ; Temp Start index
CSD2X_1_bStartIndex: BLK 1
_CSD2X_1_wTmpBtnFThreshold: ; Temp Difference
CSD2X_1_wTmpBtnFThreshold: BLK 2
IF CSD2X_1_SLIDERS_EXIST
; Local slider variables
_CSD2X_1_wDenom: ; Denominator is also the Ctrd Pos
CSD2X_1_wDenom: BLK 2
_CSD2X_1_dNumer: ; Numerator also contains the Ctrd Pos
CSD2X_1_dNumer: BLK 2
_CSD2X_1_wCtrdPos: ; Ctrd Pos is LMSB and LLSB of the numerator
CSD2X_1_wCtrdPos: BLK 2
_CSD2X_1_dMultTempX: ; Temp multiplication register
CSD2X_1_dMultTempX: BLK 4
_CSD2X_1_dMultTempY: ; Temp multiplication register
CSD2X_1_dMultTempY: BLK 4
_CSD2X_1_bCurSlider:
CSD2X_1_bCurSlider: BLK 1
_CSD2X_1_bCurCtrdStartPos: ; Temp current centroid start position
CSD2X_1_bCurCtrdStartPos: BLK 1
_CSD2X_1_bCurCtrdSize: ; Temp current centroid size
CSD2X_1_bCurCtrdSize: BLK 1
_CSD2X_1_bBiggestCtrdStartPos: ; Temp biggest centroid start position
CSD2X_1_bBiggestCtrdStartPos: BLK 1
_CSD2X_1_bBiggestCtrdSize: ; Temp biggest centroid size
CSD2X_1_bBiggestCtrdSize: BLK 1
_CSD2X_1_wCurPkValue: ; Temp current peak
CSD2X_1_wCurPkValue: BLK 2
_CSD2X_1_bCurPkPos: ; Temp current slider pointer
CSD2X_1_bCurPkPos: BLK 1
_CSD2X_1_bDiplexInfo: ; Temp flag for diplex of current group
CSD2X_1_bDiplexInfo: BLK 1
_CSD2X_1_bDiplexMSB: ; Temp that contains the address of the rom diplex table
CSD2X_1_bDiplexMSB: BLK 1
_CSD2X_1_bDiplexLSB:
CSD2X_1_bDiplexLSB: BLK 1
_CSD2X_1_wDivBtwSns: ; Temp divisions between sensors
CSD2X_1_wDivBtwSns: BLK 2
ENDIF
AREA bss
; Global variables
_CSD2X_1_waSnsBaseline: ; Baseline, one entry for each sensor
CSD2X_1_waSnsBaseline: BLK (2*CSD2X_1_TotalSensorCount)
_CSD2X_1_waSnsDiff: ; ABS Diff of raw and and baseline, one entry for each sensor
CSD2X_1_waSnsDiff: BLK (2*CSD2X_1_TotalSensorCount)
_CSD2X_1_baSnsBucket: ; Baseline difference accumulator, one entry for each sensor
CSD2X_1_baSnsBucket: BLK CSD2X_1_TotalSensorCount
_CSD2X_1_baBtnFThreshold: ; Containing variable finger threshold for each button
CSD2X_1_baBtnFThreshold: BLK CSD2X_1_TotalSensorCount
_CSD2X_1_baSnsOnMask: ; Sensor mask array containing on/off state of sensors
CSD2X_1_baSnsOnMask: BLK ((CSD2X_1_TotalSensorCount-1)/8)+1
_CSD2X_1_baSnsDebounce:
CSD2X_1_baSnsDebounce: BLK CSD2X_1_TotalSensorCount
_CSD2X_1_baLowBaselineReset:
CSD2X_1_baLowBaselineReset: BLK CSD2X_1_TotalSensorCount
IF CSD2X_1_SLIDERS_EXIST
_CSD2X_1_waCtrdPkValue: ; Array containing peak value of centroid
CSD2X_1_waCtrdPkValue: BLK (2*CSD2X_1_SliderCount)
ENDIF
; Global variables
export _CSD2X_1_waSnsBaseline
export CSD2X_1_waSnsBaseline
export _CSD2X_1_waSnsDiff
export CSD2X_1_waSnsDiff
export _CSD2X_1_baBtnFThreshold
export CSD2X_1_baBtnFThreshold
export _CSD2X_1_baSnsOnMask
export CSD2X_1_baSnsOnMask
; Local variables
export _CSD2X_1_fIsPressed
export CSD2X_1_fIsPressed
export _CSD2X_1_bEndOfArray
export CSD2X_1_bEndOfArray
export _CSD2X_1_bCurPos
export CSD2X_1_bCurPos
export _CSD2X_1_bSnsMaskPtr
export CSD2X_1_bSnsMaskPtr
IF CSD2X_1_SLIDERS_EXIST
; Local slider variables
export _CSD2X_1_wDenom
export CSD2X_1_wDenom
export _CSD2X_1_wCtrdPos
export CSD2X_1_wCtrdPos
export _CSD2X_1_dNumer
export CSD2X_1_dNumer
export _CSD2X_1_dMultTempX
export CSD2X_1_dMultTempX
export _CSD2X_1_dMultTempY
export CSD2X_1_dMultTempY
export _CSD2X_1_bCurCtrdStartPos
export CSD2X_1_bCurCtrdStartPos
export _CSD2X_1_bCurCtrdSize
export CSD2X_1_bCurCtrdSize
export _CSD2X_1_bBiggestCtrdStartPos
export CSD2X_1_bBiggestCtrdStartPos
export _CSD2X_1_bBiggestCtrdSize
export CSD2X_1_bBiggestCtrdSize
export _CSD2X_1_wCurPkValue
export CSD2X_1_wCurPkValue
export _CSD2X_1_bCurPkPos
export CSD2X_1_bCurPkPos
export _CSD2X_1_bDiplexMSB
export CSD2X_1_bDiplexMSB
export _CSD2X_1_bDiplexLSB
export CSD2X_1_bDiplexLSB
export _CSD2X_1_wDivBtwSns
export CSD2X_1_wDivBtwSns
ENDIF
;@PSoC_UserCode_INIT@ (Do not change this line.)
;---------------------------------------------------
; Insert your custom declarations below this banner
;---------------------------------------------------
;------------------------
; User Includes
;------------------------
;------------------------
; User Constant Definitions
;------------------------
;------------------------
; User Variable Allocation
;------------------------
;---------------------------------------------------
; Insert your custom declarations above this banner
;---------------------------------------------------
;@PSoC_UserCode_END@ (Do not change this line.)
;------------------------
; Constant Definitions
;------------------------
AREA UserModules (ROM, REL, CON)
; For using two byte variables
LSB: equ 1
MSB: equ 0
; For using four byte variables
MMSB: equ 0
MLSB: equ 1
LMSB: equ 2
LLSB: equ 3
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: CSD2X_1_UpdateSensorBaseline(BYTE bSensorNum)
;
; DESCRIPTION:
; Update baseline for one sensor. The algorithm is as follows:
; If difference count is negative baseline become raw count
; If difference count is above noise threshold do not update
; Else difference count is positive and within noise threshold so
; difference is halved and added to the bucket. When the bucket
; reaches the threshold the baseline increments and the bucket resets
;-----------------------------------------------------------------------------
; STACK USAGE: 0 BYTES
;
; ARGUMENTS:
; A => Sensor Number
;
; RETURNS:
; Nothing
;
; 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_UpdateSensorBaseline:
_CSD2X_1_UpdateSensorBaseline:
RAM_PROLOGUE RAM_USE_CLASS_4
RAM_PROLOGUE RAM_USE_CLASS_3
RAM_SETPAGE_CUR 0 ; direct access ram will always be in interrupt ram area
mov [CSD2X_1_bSensorNum], A ; Save sensor index
asl A
mov X,A
; Get the difference counts
RAM_SETPAGE_IDX >CSD2X_1_waSnsResult
mov A, [X+CSD2X_1_waSnsResult+LSB]
RAM_SETPAGE_IDX >CSD2X_1_waSnsBaseline
sub A, [X+CSD2X_1_waSnsBaseline+LSB]
RAM_SETPAGE_IDX >CSD2X_1_waSnsDiff
mov [X+CSD2X_1_waSnsDiff+LSB], A
RAM_SETPAGE_IDX >CSD2X_1_waSnsResult
mov A, [X+CSD2X_1_waSnsResult+MSB]
RAM_SETPAGE_IDX >CSD2X_1_waSnsBaseline
sbb A, [X+CSD2X_1_waSnsBaseline+MSB]
RAM_SETPAGE_IDX >CSD2X_1_waSnsDiff
mov [X+CSD2X_1_waSnsDiff+MSB], A
tst [X+CSD2X_1_waSnsDiff+MSB], 80h ; Is difference negative?
jnz .IsNegative
IF (CSD2X_1_AUTORESET)
cmp [X+CSD2X_1_waSnsDiff+MSB], 0
jz .AddBucketLSB
mov A, 255
jmp .AddBucketConst
ELSE
; Compare to Noise Threshold
cmp [X+CSD2X_1_waSnsDiff+MSB], 0
jnz .InitLowBaselineReset
mov A, [CSD2X_1_bNoiseThreshold]
cmp A, [X+CSD2X_1_waSnsDiff+LSB]
jc .InitLowBaselineReset
ENDIF
; Add to the Bucket
.AddBucketLSB:
mov A, [X+CSD2X_1_waSnsDiff+LSB]
.AddBucketConst:
mov X, [CSD2X_1_bSensorNum]
add A, 0
rrc A ; For slower tracking
RAM_SETPAGE_IDX >CSD2X_1_baSnsBucket
add [X+CSD2X_1_baSnsBucket], A
jc .DoInc
mov A, [CSD2X_1_bBaselineUpdateThreshold]
cmp A, [X+CSD2X_1_baSnsBucket]
jnc .EndBucket
jz .EndBucket
.DoInc:
; Increment Baseline
mov [X+CSD2X_1_baSnsBucket], 0
mov A, X
asl A
mov X, A
RAM_SETPAGE_IDX >CSD2X_1_waSnsBaseline
add [X+CSD2X_1_waSnsBaseline+LSB], 1
adc [X+CSD2X_1_waSnsBaseline+MSB], 0
.EndBucket:
IF (CSD2X_1_AUTORESET)
mov A, [CSD2X_1_bSensorNum]
asl A
mov X, A
; Compare to Noise Threshold
RAM_SETPAGE_IDX >CSD2X_1_waSnsDiff
cmp [X+CSD2X_1_waSnsDiff+MSB], 0
jnz .InitLowBaselineReset
mov A, [CSD2X_1_bNoiseThreshold]
cmp A, [X+CSD2X_1_waSnsDiff+LSB]
jc .InitLowBaselineReset
ELSE
ENDIF
jmp .SetDifferenceToZero
.IsNegative:
; Compare to Negative Noise Threshold
cmp [X+CSD2X_1_waSnsDiff+MSB], FFh
jnz .CheckLowBaseline
mov A, FFh
sub A, [CSD2X_1_bNegativeNoiseThreshold]
cmp A, [X+CSD2X_1_waSnsDiff+LSB]
jc .LowerBaseline
.CheckLowBaseline:
; Set difference to zero
RAM_SETPAGE_IDX >CSD2X_1_waSnsDiff
mov [X+CSD2X_1_waSnsDiff+LSB], 0
mov [X+CSD2X_1_waSnsDiff+MSB], 0
; Check Low Baseline Reset
mov A, X
asr A
mov X, A
RAM_SETPAGE_IDX >CSD2X_1_baLowBaselineReset
mov A, [X+CSD2X_1_baLowBaselineReset]
dec A
mov [X+CSD2X_1_baLowBaselineReset], A
push A
mov A, X
asl A
mov X, A
pop A
jnz .EndofUpdateSensorBaseline
.LowerBaseline:
RAM_SETPAGE_IDX >CSD2X_1_waSnsResult
mov A, [X+CSD2X_1_waSnsResult+LSB]
RAM_SETPAGE_IDX >CSD2X_1_waSnsBaseline
mov [X+CSD2X_1_waSnsBaseline+LSB], A
RAM_SETPAGE_IDX >CSD2X_1_waSnsResult
mov A, [X+CSD2X_1_waSnsResult+MSB]
RAM_SETPAGE_IDX >CSD2X_1_waSnsBaseline
mov [X+CSD2X_1_waSnsBaseline+MSB], A
.SetDifferenceToZero:
; Set difference to zero
mov A, [CSD2X_1_bSensorNum]
asl A
mov X,A
RAM_SETPAGE_IDX >CSD2X_1_waSnsDiff
mov [X+CSD2X_1_waSnsDiff+LSB], 0
mov [X+CSD2X_1_waSnsDiff+MSB], 0
.InitLowBaselineReset:
mov A, X
asr A
mov X, A
RAM_SETPAGE_IDX >CSD2X_1_baLowBaselineReset
mov A, [CSD2X_1_bLowBaselineReset]
mov [X+CSD2X_1_baLowBaselineReset], A
.EndofUpdateSensorBaseline:
RAM_EPILOGUE RAM_USE_CLASS_3
RAM_EPILOGUE RAM_USE_CLASS_4
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: CSD2X_1_bIsSensorActive(BYTE bSensorNum)
;
; DESCRIPTION:
; Returns state of one sensor. Updates the baSnsOnMask array.
; Implements hysteresis based on the Hysteresis parameter.
;-----------------------------------------------------------------------------
; STACK USAGE: 3 BYTES
;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -