📄 csdhl.asm
字号:
;;*****************************************************************************
;; FILENAME: CSDHL.asm
;; @Version@
;; Generated by PSoC Designer ???
;;
;; DESCRIPTION: CSD User Module high level software
;; implementation file for the 21x34 PSoC family of devices.
;;-----------------------------------------------------------------------------
;; Copyright (c) Cypress Semiconductor 2000-2007. All Rights Reserved.
;;*****************************************************************************
;;*****************************************************************************
include "m8c.inc"
include "memory.inc"
include "CSD.inc"
;-----------------------------------------------
; Global Symbols
;-----------------------------------------------
export _CSD_UpdateSensorBaseline
export CSD_UpdateSensorBaseline
export _CSD_InitializeSensorBaseline
export CSD_InitializeSensorBaseline
export _CSD_bIsSensorActive
export CSD_bIsSensorActive
export _CSD_bIsAnySensorActive
export CSD_bIsAnySensorActive
export _CSD_SetDefaultFingerThresholds
export CSD_SetDefaultFingerThresholds
export _CSD_InitializeBaselines
export CSD_InitializeBaselines
export _CSD_UpdateAllBaselines
export CSD_UpdateAllBaselines
IF CSD_SLIDERS_EXIST
export _CSD_wGetCentroidPos
export CSD_wGetCentroidPos
ENDIF
;-----------------------------------------------
; Variable Allocation
;-----------------------------------------------
AREA InterruptRAM (RAM, REL, CON)
_CSD_bNoiseThreshold:
CSD_bNoiseThreshold: BLK 1
_CSD_bNegativeNoiseThreshold:
CSD_bNegativeNoiseThreshold: BLK 1
_CSD_bBaselineUpdateThreshold:
CSD_bBaselineUpdateThreshold: BLK 1
_CSD_bHysteresis:
CSD_bHysteresis: BLK 1
_CSD_bDebounce:
CSD_bDebounce: BLK 1
_CSD_bLowBaselineReset:
CSD_bLowBaselineReset: BLK 1
export _CSD_bNoiseThreshold
export CSD_bNoiseThreshold
export _CSD_bNegativeNoiseThreshold:
export CSD_bNegativeNoiseThreshold:
export _CSD_bBaselineUpdateThreshold:
export CSD_bBaselineUpdateThreshold:
export _CSD_bHysteresis:
export CSD_bHysteresis:
export _CSD_bDebounce:
export CSD_bDebounce:
export _CSD_bLowBaselineReset:
export CSD_bLowBaselineReset:
; Local variables
_CSD_bEndOfArray: ; Temp pointer variable
CSD_bEndOfArray: BLK 1
_CSD_fIsPressed: ; Temp variable for if any sensor is pressed
CSD_fIsPressed: BLK 1
_CSD_bCurPos: ; Temp position variable
CSD_bCurPos: BLK 1
_CSD_bSnsMaskPtr: ; Temp sensor mask pointer used in centroid calculation
CSD_bSnsMaskPtr: BLK 1
_CSD_bStartIndex: ; Temp Start index
CSD_bStartIndex: BLK 1
_CSD_wTmpBtnFThreshold: ; Temp Difference
CSD_wTmpBtnFThreshold: BLK 2
IF CSD_SLIDERS_EXIST
; Local slider variables
_CSD_wDenom: ; Denominator is also the Ctrd Pos
CSD_wDenom: BLK 2
_CSD_dNumer: ; Numerator also contains the Ctrd Pos
CSD_dNumer: BLK 2
_CSD_wCtrdPos: ; Ctrd Pos is LMSB and LLSB of the numerator
CSD_wCtrdPos: BLK 2
_CSD_dMultTempX: ; Temp multiplication register
CSD_dMultTempX: BLK 4
_CSD_dMultTempY: ; Temp multiplication register
CSD_dMultTempY: BLK 4
_CSD_bCurSlider:
CSD_bCurSlider: BLK 1
_CSD_bCurCtrdStartPos: ; Temp current centroid start position
CSD_bCurCtrdStartPos: BLK 1
_CSD_bCurCtrdSize: ; Temp current centroid size
CSD_bCurCtrdSize: BLK 1
_CSD_bBiggestCtrdStartPos: ; Temp biggest centroid start position
CSD_bBiggestCtrdStartPos: BLK 1
_CSD_bBiggestCtrdSize: ; Temp biggest centroid size
CSD_bBiggestCtrdSize: BLK 1
_CSD_wCurPkValue: ; Temp current peak
CSD_wCurPkValue: BLK 2
_CSD_bCurPkPos: ; Temp current slider pointer
CSD_bCurPkPos: BLK 1
_CSD_bDiplexInfo: ; Temp flag for diplex of current group
CSD_bDiplexInfo: BLK 1
_CSD_bDiplexMSB: ; Temp that contains the address of the rom diplex table
CSD_bDiplexMSB: BLK 1
_CSD_bDiplexLSB:
CSD_bDiplexLSB: BLK 1
_CSD_wDivBtwSns: ; Temp divisions between sensors
CSD_wDivBtwSns: BLK 2
ENDIF
AREA bss
; Global variables
_CSD_waSnsBaseline: ; Baseline, one entry for each sensor
CSD_waSnsBaseline: BLK (2*CSD_TotalSensorCount)
_CSD_waSnsDiff: ; ABS Diff of raw and and baseline, one entry for each sensor
CSD_waSnsDiff: BLK (2*CSD_TotalSensorCount)
_CSD_baSnsBucket: ; Baseline difference accumulator, one entry for each sensor
CSD_baSnsBucket: BLK CSD_TotalSensorCount
_CSD_baBtnFThreshold: ; Containing variable finger threshold for each button
CSD_baBtnFThreshold: BLK CSD_TotalSensorCount
_CSD_baSnsOnMask: ; Sensor mask array containing on/off state of sensors
CSD_baSnsOnMask: BLK ((CSD_TotalSensorCount-1)/8)+1
_CSD_baSnsDebounce:
CSD_baSnsDebounce: BLK CSD_TotalSensorCount
_CSD_baLowBaselineReset:
CSD_baLowBaselineReset: BLK CSD_TotalSensorCount
IF CSD_SLIDERS_EXIST
_CSD_waCtrdPkValue: ; Array containing peak value of centroid
CSD_waCtrdPkValue: BLK (2*CSD_SliderCount)
ENDIF
; Global variables
export _CSD_waSnsBaseline
export CSD_waSnsBaseline
export _CSD_waSnsDiff
export CSD_waSnsDiff
export _CSD_baBtnFThreshold
export CSD_baBtnFThreshold
export _CSD_baSnsOnMask
export CSD_baSnsOnMask
; Local variables
export _CSD_fIsPressed
export CSD_fIsPressed
export _CSD_bEndOfArray
export CSD_bEndOfArray
export _CSD_bCurPos
export CSD_bCurPos
export _CSD_bSnsMaskPtr
export CSD_bSnsMaskPtr
IF CSD_SLIDERS_EXIST
; Local slider variables
export _CSD_wDenom
export CSD_wDenom
export _CSD_wCtrdPos
export CSD_wCtrdPos
export _CSD_dNumer
export CSD_dNumer
export _CSD_dMultTempX
export CSD_dMultTempX
export _CSD_dMultTempY
export CSD_dMultTempY
export _CSD_bCurCtrdStartPos
export CSD_bCurCtrdStartPos
export _CSD_bCurCtrdSize
export CSD_bCurCtrdSize
export _CSD_bBiggestCtrdStartPos
export CSD_bBiggestCtrdStartPos
export _CSD_bBiggestCtrdSize
export CSD_bBiggestCtrdSize
export _CSD_wCurPkValue
export CSD_wCurPkValue
export _CSD_bCurPkPos
export CSD_bCurPkPos
export _CSD_bDiplexMSB
export CSD_bDiplexMSB
export _CSD_bDiplexLSB
export CSD_bDiplexLSB
export _CSD_wDivBtwSns
export CSD_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: CSD_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.
;
CSD_UpdateSensorBaseline:
_CSD_UpdateSensorBaseline:
RAM_PROLOGUE RAM_USE_CLASS_3
RAM_SETPAGE_CUR 0 ; direct access ram will always be in interrupt ram area
RAM_X_POINTS_TO_INDEXPAGE
mov [CSD_bSensorNum], A ; Save sensor index
asl A
mov X,A
; Get the difference counts
RAM_SETPAGE_IDX >CSD_waSnsResult
mov A, [X+CSD_waSnsResult+LSB]
RAM_SETPAGE_IDX >CSD_waSnsBaseline
sub A, [X+CSD_waSnsBaseline+LSB]
RAM_SETPAGE_IDX >CSD_waSnsDiff
mov [X+CSD_waSnsDiff+LSB], A
RAM_SETPAGE_IDX >CSD_waSnsResult
mov A, [X+CSD_waSnsResult+MSB]
RAM_SETPAGE_IDX >CSD_waSnsBaseline
sbb A, [X+CSD_waSnsBaseline+MSB]
RAM_SETPAGE_IDX >CSD_waSnsDiff
mov [X+CSD_waSnsDiff+MSB], A
tst [X+CSD_waSnsDiff+MSB], 80h ; Is difference negative?
jnz .IsNegative
IF (CSD_AUTORESET)
cmp [X+CSD_waSnsDiff+MSB], 0
jz .AddBucketLSB
mov A, 255
jmp .AddBucketConst
ELSE
; Compare to Noise Threshold
cmp [X+CSD_waSnsDiff+MSB], 0
jnz .InitLowBaselineReset
mov A, [CSD_bNoiseThreshold]
cmp A, [X+CSD_waSnsDiff+LSB]
jc .InitLowBaselineReset
ENDIF
; Add to the Bucket
.AddBucketLSB:
mov A, [X+CSD_waSnsDiff+LSB]
.AddBucketConst:
mov X, [CSD_bSensorNum]
add A, 0
rrc A ; For slower tracking
RAM_SETPAGE_IDX >CSD_baSnsBucket
add [X+CSD_baSnsBucket], A
jc .DoInc
mov A, [CSD_bBaselineUpdateThreshold]
cmp A, [X+CSD_baSnsBucket]
jnc .EndBucket
jz .EndBucket
.DoInc:
; Increment Baseline
mov [X+CSD_baSnsBucket], 0
mov A, X
asl A
mov X, A
RAM_SETPAGE_IDX >CSD_waSnsBaseline
add [X+CSD_waSnsBaseline+LSB], 1
adc [X+CSD_waSnsBaseline+MSB], 0
.EndBucket:
IF (CSD_AUTORESET)
mov A, [CSD_bSensorNum]
asl A
mov X, A
; Compare to Noise Threshold
cmp [X+CSD_waSnsDiff+MSB], 0
jnz .InitLowBaselineReset
mov A, [CSD_bNoiseThreshold]
cmp A, [X+CSD_waSnsDiff+LSB]
jc .InitLowBaselineReset
ELSE
ENDIF
jmp .SetDifferenceToZero
.IsNegative:
; Compare to Negative Noise Threshold
cmp [X+CSD_waSnsDiff+MSB], FFh
jnz .CheckLowBaseline
mov A, FFh
sub A, [CSD_bNegativeNoiseThreshold]
cmp A, [X+CSD_waSnsDiff+LSB]
jc .LowerBaseline
.CheckLowBaseline:
; Set difference to zero
RAM_SETPAGE_IDX >CSD_waSnsDiff
mov [X+CSD_waSnsDiff+LSB], 0
mov [X+CSD_waSnsDiff+MSB], 0
; Check Low Baseline Reset
mov A, X
asr A
mov X, A
RAM_SETPAGE_IDX >CSD_baLowBaselineReset
mov A, [X+CSD_baLowBaselineReset]
dec A
mov [X+CSD_baLowBaselineReset], A
push A
mov A, X
asl A
mov X, A
pop A
jnz .EndofUpdateSensorBaseline
.LowerBaseline:
RAM_SETPAGE_IDX >CSD_waSnsResult
mov A, [X+CSD_waSnsResult+LSB]
RAM_SETPAGE_IDX >CSD_waSnsBaseline
mov [X+CSD_waSnsBaseline+LSB], A
RAM_SETPAGE_IDX >CSD_waSnsResult
mov A, [X+CSD_waSnsResult+MSB]
RAM_SETPAGE_IDX >CSD_waSnsBaseline
mov [X+CSD_waSnsBaseline+MSB], A
.SetDifferenceToZero:
; Set difference to zero
mov A, [CSD_bSensorNum]
asl A
mov X,A
RAM_SETPAGE_IDX >CSD_waSnsDiff
mov [X+CSD_waSnsDiff+LSB], 0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -