📄 csd_1hl.asm
字号:
;;*****************************************************************************
;; FILENAME: CSD_1HL.asm
;; @Versions@
;; Generated by PSoC Designer ver 4.4 b1884 : 14 Jan, 2007
;;
;; DESCRIPTION: CSD User Module high level software
;; implementation file for the 21x34 PSoC family of devices.
;;-----------------------------------------------------------------------------
;; Copyright (c) Cypress Semiconductor 2000-2006. All Rights Reserved.
;;*****************************************************************************
;;*****************************************************************************
include "m8c.inc"
include "memory.inc"
include "CSD_1.inc"
;-----------------------------------------------
; Global Symbols
;-----------------------------------------------
export _CSD_1_UpdateSensorBaseline
export CSD_1_UpdateSensorBaseline
export _CSD_1_InitializeSensorBaseline
export CSD_1_InitializeSensorBaseline
export _CSD_1_bIsSensorActive
export CSD_1_bIsSensorActive
export _CSD_1_bIsAnySensorActive
export CSD_1_bIsAnySensorActive
export _CSD_1_SetDefaultFingerThresholds
export CSD_1_SetDefaultFingerThresholds
export _CSD_1_InitializeBaselines
export CSD_1_InitializeBaselines
export _CSD_1_UpdateAllBaselines
export CSD_1_UpdateAllBaselines
IF CSD_1_SLIDERS_EXIST
export _CSD_1_wGetCentroidPos
export CSD_1_wGetCentroidPos
ENDIF
;-----------------------------------------------
; Variable Allocation
;-----------------------------------------------
AREA InterruptRAM (RAM, REL, CON)
; Local variables
_CSD_1_bEndOfArray: ; Temp pointer variable
CSD_1_bEndOfArray: BLK 1
_CSD_1_fIsPressed: ; Temp variable for if any sensor is pressed
CSD_1_fIsPressed: BLK 1
_CSD_1_bCurPos: ; Temp position variable
CSD_1_bCurPos: BLK 1
_CSD_1_bSnsMaskPtr: ; Temp sensor mask pointer used in centroid calculation
CSD_1_bSnsMaskPtr: BLK 1
_CSD_1_bStartIndex: ; Temp Start index
CSD_1_bStartIndex: BLK 1
_CSD_1_wTmpBtnFThreshold: ; Temp Difference
CSD_1_wTmpBtnFThreshold: BLK 2
IF CSD_1_SLIDERS_EXIST
; Local slider variables
_CSD_1_wDenom: ; Denominator is also the Ctrd Pos
CSD_1_wDenom: BLK 2
_CSD_1_dNumer: ; Numerator also contains the Ctrd Pos
CSD_1_dNumer: BLK 2
_CSD_1_wCtrdPos: ; Ctrd Pos is LMSB and LLSB of the numerator
CSD_1_wCtrdPos: BLK 2
_CSD_1_dMultTempX: ; Temp multiplication register
CSD_1_dMultTempX: BLK 4
_CSD_1_dMultTempY: ; Temp multiplication register
CSD_1_dMultTempY: BLK 4
_CSD_1_bCurSlider:
CSD_1_bCurSlider: BLK 1
_CSD_1_bCurCtrdStartPos: ; Temp current centroid start position
CSD_1_bCurCtrdStartPos: BLK 1
_CSD_1_bCurCtrdSize: ; Temp current centroid size
CSD_1_bCurCtrdSize: BLK 1
_CSD_1_bBiggestCtrdStartPos: ; Temp biggest centroid start position
CSD_1_bBiggestCtrdStartPos: BLK 1
_CSD_1_bBiggestCtrdSize: ; Temp biggest centroid size
CSD_1_bBiggestCtrdSize: BLK 1
_CSD_1_wCurPkValue: ; Temp current peak
CSD_1_wCurPkValue: BLK 2
_CSD_1_bCurPkPos: ; Temp current slider pointer
CSD_1_bCurPkPos: BLK 1
_CSD_1_bDiplexInfo: ; Temp flag for diplex of current group
CSD_1_bDiplexInfo: BLK 1
_CSD_1_bDiplexMSB: ; Temp that contains the address of the rom diplex table
CSD_1_bDiplexMSB: BLK 1
_CSD_1_bDiplexLSB:
CSD_1_bDiplexLSB: BLK 1
_CSD_1_wDivBtwSns: ; Temp divisions between sensors
CSD_1_wDivBtwSns: BLK 2
ENDIF
AREA bss
; Global variables
_CSD_1_baSnsBucket: ; Baseline difference accumulator, one entry for each sensor
CSD_1_baSnsBucket: BLK CSD_1_TotalSensorCount
_CSD_1_baSnsDebounce:
CSD_1_baSnsDebounce: BLK CSD_1_TotalSensorCount
_CSD_1_baLowBaselineReset:
CSD_1_baLowBaselineReset: BLK CSD_1_TotalSensorCount
IF CSD_1_SLIDERS_EXIST
_CSD_1_waCtrdPkValue: ; Array containing peak value of centroid
CSD_1_waCtrdPkValue: BLK (2*CSD_1_SliderCount)
ENDIF
; Local variables
export _CSD_1_fIsPressed
export CSD_1_fIsPressed
export _CSD_1_bEndOfArray
export CSD_1_bEndOfArray
export _CSD_1_bCurPos
export CSD_1_bCurPos
export _CSD_1_bSnsMaskPtr
export CSD_1_bSnsMaskPtr
IF CSD_1_SLIDERS_EXIST
; Local slider variables
export _CSD_1_wDenom
export CSD_1_wDenom
export _CSD_1_wCtrdPos
export CSD_1_wCtrdPos
export _CSD_1_dNumer
export CSD_1_dNumer
export _CSD_1_dMultTempX
export CSD_1_dMultTempX
export _CSD_1_dMultTempY
export CSD_1_dMultTempY
export _CSD_1_bCurCtrdStartPos
export CSD_1_bCurCtrdStartPos
export _CSD_1_bCurCtrdSize
export CSD_1_bCurCtrdSize
export _CSD_1_bBiggestCtrdStartPos
export CSD_1_bBiggestCtrdStartPos
export _CSD_1_bBiggestCtrdSize
export CSD_1_bBiggestCtrdSize
export _CSD_1_wCurPkValue
export CSD_1_wCurPkValue
export _CSD_1_bCurPkPos
export CSD_1_bCurPkPos
export _CSD_1_bDiplexMSB
export CSD_1_bDiplexMSB
export _CSD_1_bDiplexLSB
export CSD_1_bDiplexLSB
export _CSD_1_wDivBtwSns
export CSD_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
FINGER_THRESHOLD: equ 1eh
NOISE_THRESHOLD: equ ah
NEGATIVE_NOISE_THRESHOLD: equ 5h
BASELINE_UPDATE_THRESHOLD: equ 14h
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: CSD_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.
;
CSD_1_UpdateSensorBaseline:
_CSD_1_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_1_bSensorNum], A ; Save sensor index
asl A
mov X,A
; Get the difference counts
RAM_SETPAGE_IDX >CSD_1_waSnsResult
mov A, [X+CSD_1_waSnsResult+LSB]
RAM_SETPAGE_IDX >CSD_1_waSnsBaseline
sub A, [X+CSD_1_waSnsBaseline+LSB]
RAM_SETPAGE_IDX >CSD_1_waSnsDiff
mov [X+CSD_1_waSnsDiff+LSB], A
RAM_SETPAGE_IDX >CSD_1_waSnsResult
mov A, [X+CSD_1_waSnsResult+MSB]
RAM_SETPAGE_IDX >CSD_1_waSnsBaseline
sbb A, [X+CSD_1_waSnsBaseline+MSB]
RAM_SETPAGE_IDX >CSD_1_waSnsDiff
mov [X+CSD_1_waSnsDiff+MSB], A
tst [X+CSD_1_waSnsDiff+MSB], 80h ; Is difference negative?
jnz .IsNegative
IF (CSD_1_AUTORESET)
cmp [X+CSD_1_waSnsDiff+MSB], 0
jz .AddBucketLSB
mov A, 255
jmp .AddBucketConst
ELSE
; Compare to Noise Threshold
cmp [X+CSD_1_waSnsDiff+MSB], 0
jnz .InitLowBaselineReset
cmp [X+CSD_1_waSnsDiff+LSB], NOISE_THRESHOLD
jnc .InitLowBaselineReset
jz .InitLowBaselineReset
ENDIF
; Add to the Bucket
.AddBucketLSB:
mov A, [X+CSD_1_waSnsDiff+LSB]
.AddBucketConst:
mov X, [CSD_1_bSensorNum]
add A, 0
rrc A ; For slower tracking
RAM_SETPAGE_IDX >CSD_1_baSnsBucket
add [X+CSD_1_baSnsBucket], A
jc .DoInc
cmp [X+CSD_1_baSnsBucket], BASELINE_UPDATE_THRESHOLD
jc .EndBucket
.DoInc:
; Increment Baseline
mov [X+CSD_1_baSnsBucket], 0
mov A, X
asl A
mov X, A
RAM_SETPAGE_IDX >CSD_1_waSnsBaseline
add [X+CSD_1_waSnsBaseline+LSB], 1
adc [X+CSD_1_waSnsBaseline+MSB], 0
.EndBucket:
IF (CSD_1_AUTORESET)
mov A, [CSD_1_bSensorNum]
asl A
mov X, A
; Compare to Noise Threshold
RAM_SETPAGE_IDX >CSD_1_waSnsBaseline
cmp [X+CSD_1_waSnsDiff+MSB], 0
jnz .InitLowBaselineReset
cmp [X+CSD_1_waSnsDiff+LSB], NOISE_THRESHOLD
jnc .InitLowBaselineReset
jz .InitLowBaselineReset
ELSE
ENDIF
jmp .SetDifferenceToZero
.IsNegative:
; Compare to Negative Noise Threshold
cmp [X+CSD_1_waSnsDiff+MSB], FFh
jnz .CheckLowBaseline
cmp [X+CSD_1_waSnsDiff+LSB], (FFh - NEGATIVE_NOISE_THRESHOLD)
jnc .LowerBaseline
.CheckLowBaseline:
; Set difference to zero
RAM_SETPAGE_IDX >CSD_1_waSnsDiff
mov [X+CSD_1_waSnsDiff+LSB], 0
mov [X+CSD_1_waSnsDiff+MSB], 0
; Check Low Baseline Reset
mov A, X
asr A
mov X, A
RAM_SETPAGE_IDX >CSD_1_baLowBaselineReset
mov A, [X+CSD_1_baLowBaselineReset]
dec A
mov [X+CSD_1_baLowBaselineReset], A
push A
mov A, X
asl A
mov X, A
pop A
jnz .EndofUpdateSensorBaseline
.LowerBaseline:
RAM_SETPAGE_IDX >CSD_1_waSnsResult
mov A, [X+CSD_1_waSnsResult+LSB]
RAM_SETPAGE_IDX >CSD_1_waSnsBaseline
mov [X+CSD_1_waSnsBaseline+LSB], A
RAM_SETPAGE_IDX >CSD_1_waSnsResult
mov A, [X+CSD_1_waSnsResult+MSB]
RAM_SETPAGE_IDX >CSD_1_waSnsBaseline
mov [X+CSD_1_waSnsBaseline+MSB], A
.SetDifferenceToZero:
; Set difference to zero
mov A, [CSD_1_bSensorNum]
asl A
mov X,A
RAM_SETPAGE_IDX >CSD_1_waSnsDiff
mov [X+CSD_1_waSnsDiff+LSB], 0
mov [X+CSD_1_waSnsDiff+MSB], 0
.InitLowBaselineReset:
mov A, X
asr A
mov X, A
RAM_SETPAGE_IDX >CSD_1_LowBaselineReset
mov [X+CSD_1_baLowBaselineReset], CSD_1_LowBaselineReset
.EndofUpdateSensorBaseline:
RAM_EPILOGUE RAM_USE_CLASS_3
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: CSD_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
;
; ARGUMENTS:
; A => sensor index
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -