📄 csa_1hl.asm
字号:
;;*****************************************************************************
;; FILENAME: CSA_1HL.asm
;; @Versions@
;; Generated by PSoC Designer ver 4.3 b1884 : 23 June, 2006
;;
;; DESCRIPTION: CSA User Module high level software
;; implementation file for the 20x34 PSoC family of devices.
;;-----------------------------------------------------------------------------
;; Copyright (c) Cypress Semiconductor 2000-2006. All Rights Reserved.
;;*****************************************************************************
;;*****************************************************************************
include "m8c.inc"
include "memory.inc"
include "CSA_1.inc"
;-----------------------------------------------
; Global Symbols
;-----------------------------------------------
export _CSA_1_UpdateSensorBaseline
export CSA_1_UpdateSensorBaseline
export _CSA_1_bIsSensorActive
export CSA_1_bIsSensorActive
export _CSA_1_bIsAnySensorActive
export CSA_1_bIsAnySensorActive
export _CSA_1_SetDefaultFingerThresholds
export CSA_1_SetDefaultFingerThresholds
export _CSA_1_InitializeBaselines
export CSA_1_InitializeBaselines
export _CSA_1_UpdateAllBaselines
export CSA_1_UpdateAllBaselines
IF CSA_1_SLIDERS_EXIST
export _CSA_1_wGetCentroidPos
export CSA_1_wGetCentroidPos
ENDIF
;-----------------------------------------------
; Variable Allocation
;-----------------------------------------------
AREA InterruptRAM (RAM, REL, CON)
IF CSA_1_SLIDERS_EXIST
; Global slider variables
_CSA_1_baCtrdStartPos: ; Array containing centroid starting position
CSA_1_baCtrdStartPos: BLK CSA_1_SliderCount
_CSA_1_baCtrdSize: ; Array containing centroid size
CSA_1_baCtrdSize: BLK CSA_1_SliderCount
_CSA_1_baCtrdPkPos: ; Array containing peak position of centroid
CSA_1_baCtrdPkPos: BLK CSA_1_SliderCount
ENDIF
; Local variables
_CSA_1_bEndOfArray: ; Temp pointer variable
CSA_1_bEndOfArray: BLK 1
_CSA_1_fIsPressed: ; Temp variable for if any sensor is pressed
CSA_1_fIsPressed: BLK 1
_CSA_1_bCurPos: ; Temp position variable
CSA_1_bCurPos: BLK 1
_CSA_1_bSnsMaskPtr: ; Temp sensor mask pointer used in centroid calculation
CSA_1_bSnsMaskPtr: BLK 1
_CSA_1_bStartIndex: ; Temp Start index
CSA_1_bStartIndex: BLK 1
_CSA_1_wTmpBtnFThreshold: ; Temp Difference
CSA_1_wTmpBtnFThreshold: BLK 2
IF CSA_1_SLIDERS_EXIST
; Local slider variables
_CSA_1_wDenom: ; Denominator is also the Ctrd Pos
CSA_1_wDenom: BLK 2
_CSA_1_dNumer: ; Numerator also contains the Ctrd Pos
CSA_1_dNumer: BLK 2
_CSA_1_wCtrdPos: ; Ctrd Pos is LMSB and LLSB of the numerator
CSA_1_wCtrdPos: BLK 2
_CSA_1_dMultTempX: ; Temp multiplication register
CSA_1_dMultTempX: BLK 4
_CSA_1_dMultTempY: ; Temp multiplication register
CSA_1_dMultTempY: BLK 4
_CSA_1_bCurSlider:
CSA_1_bCurSlider: BLK 1
_CSA_1_bCurCtrdStartPos: ; Temp current centroid start position
CSA_1_bCurCtrdStartPos: BLK 1
_CSA_1_bCurCtrdSize: ; Temp current centroid size
CSA_1_bCurCtrdSize: BLK 1
_CSA_1_bBiggestCtrdStartPos: ; Temp biggest centroid start position
CSA_1_bBiggestCtrdStartPos: BLK 1
_CSA_1_bBiggestCtrdSize: ; Temp biggest centroid size
CSA_1_bBiggestCtrdSize: BLK 1
_CSA_1_wCurPkValue: ; Temp current peak
CSA_1_wCurPkValue: BLK 2
_CSA_1_bCurPkPos: ; Temp current slider pointer
CSA_1_bCurPkPos: BLK 1
_CSA_1_bDiplexInfo: ; Temp flag for diplex of current group
CSA_1_bDiplexInfo: BLK 1
_CSA_1_bDiplexMSB: ; Temp that contains the address of the rom diplex table
CSA_1_bDiplexMSB: BLK 1
_CSA_1_bDiplexLSB:
CSA_1_bDiplexLSB: BLK 1
_CSA_1_wDivBtwSns: ; Temp divisions between sensors
CSA_1_wDivBtwSns: BLK 2
ENDIF
AREA bss
; Global variables
_CSA_1_waSnsBaseline: ; Baseline, one entry for each sensor
CSA_1_waSnsBaseline: BLK (2*CSA_1_TotalSensorCount)
_CSA_1_waSnsDiff: ; ABS Diff of raw and and baseline, one entry for each sensor
CSA_1_waSnsDiff: BLK (2*CSA_1_TotalSensorCount)
_CSA_1_baSnsBucket: ; Baseline difference accumulator, one entry for each sensor
CSA_1_baSnsBucket: BLK CSA_1_TotalSensorCount
_CSA_1_baBtnFThreshold: ; Containing variable finger threshold for each button
CSA_1_baBtnFThreshold: BLK CSA_1_TotalSensorCount
_CSA_1_baSnsOnMask: ; Sensor mask array containing on/off state of sensors
CSA_1_baSnsOnMask: BLK ((CSA_1_TotalSensorCount-1)/8)+1
IF CSA_1_SLIDERS_EXIST
_CSA_1_waCtrdPkValue: ; Array containing peak value of centroid
CSA_1_waCtrdPkValue: BLK (2*CSA_1_SliderCount)
ENDIF
; Global variables
export _CSA_1_waSnsBaseline
export CSA_1_waSnsBaseline
export _CSA_1_waSnsDiff
export CSA_1_waSnsDiff
export _CSA_1_baBtnFThreshold
export CSA_1_baBtnFThreshold
export _CSA_1_baSnsOnMask
export CSA_1_baSnsOnMask
IF CSA_1_SLIDERS_EXIST
; Global slider variables
export _CSA_1_baCtrdStartPos
export CSA_1_baCtrdStartPos
export _CSA_1_baCtrdSize
export CSA_1_baCtrdSize
export _CSA_1_baCtrdPkPos
export CSA_1_baCtrdPkPos
export _CSA_1_waCtrdPkValue
export CSA_1_waCtrdPkValue
ENDIF
; Local variables
export _CSA_1_fIsPressed
export CSA_1_fIsPressed
export _CSA_1_bEndOfArray
export CSA_1_bEndOfArray
export _CSA_1_bCurPos
export CSA_1_bCurPos
export _CSA_1_bSnsMaskPtr
export CSA_1_bSnsMaskPtr
IF CSA_1_SLIDERS_EXIST
; Local slider variables
export _CSA_1_wDenom
export CSA_1_wDenom
export _CSA_1_wCtrdPos
export CSA_1_wCtrdPos
export _CSA_1_dNumer
export CSA_1_dNumer
export _CSA_1_dMultTempX
export CSA_1_dMultTempX
export _CSA_1_dMultTempY
export CSA_1_dMultTempY
export _CSA_1_bCurCtrdStartPos
export CSA_1_bCurCtrdStartPos
export _CSA_1_bCurCtrdSize
export CSA_1_bCurCtrdSize
export _CSA_1_bBiggestCtrdStartPos
export CSA_1_bBiggestCtrdStartPos
export _CSA_1_bBiggestCtrdSize
export CSA_1_bBiggestCtrdSize
export _CSA_1_wCurPkValue
export CSA_1_wCurPkValue
export _CSA_1_bCurPkPos
export CSA_1_bCurPkPos
export _CSA_1_bDiplexMSB
export CSA_1_bDiplexMSB
export _CSA_1_bDiplexLSB
export CSA_1_bDiplexLSB
export _CSA_1_wDivBtwSns
export CSA_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 64h
NOISE_THRESHOLD: equ ah
BASELINE_UPDATE_THRESHOLD: equ 64h
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: CSA_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.
;
CSA_1_UpdateSensorBaseline:
_CSA_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 [CSA_1_bSensorNum], A ; Save sensor index
asl A
mov X,A
; Get the difference counts
RAM_SETPAGE_IDX >CSA_1_waSnsResult
mov A, [X+CSA_1_waSnsResult+LSB]
RAM_SETPAGE_IDX >CSA_1_waSnsBaseline
sub A, [X+CSA_1_waSnsBaseline+LSB]
RAM_SETPAGE_IDX >CSA_1_waSnsDiff
mov [X+CSA_1_waSnsDiff+LSB], A
RAM_SETPAGE_IDX >CSA_1_waSnsResult
mov A, [X+CSA_1_waSnsResult+MSB]
RAM_SETPAGE_IDX >CSA_1_waSnsBaseline
sbb A, [X+CSA_1_waSnsBaseline+MSB]
RAM_SETPAGE_IDX >CSA_1_waSnsDiff
mov [X+CSA_1_waSnsDiff+MSB], A
tst [X+CSA_1_waSnsDiff+MSB], 80h ; Is difference negative?
jnz .LowerBaseline
; Compare to Noise Threshold
cmp [X+CSA_1_waSnsDiff+MSB], 0
jnz .EndofUpdateSensorBaseline
cmp [X+CSA_1_waSnsDiff+LSB], NOISE_THRESHOLD
jnc .EndofUpdateSensorBaseline
jz .EndofUpdateSensorBaseline
; Add to the Bucket
mov A, [X+CSA_1_waSnsDiff+LSB]
mov X, [CSA_1_bSensorNum]
asr A ; For slower tracking
RAM_SETPAGE_IDX >CSA_1_baSnsBucket
add [X+CSA_1_baSnsBucket], A
cmp [X+CSA_1_baSnsBucket], BASELINE_UPDATE_THRESHOLD
jc .SetDifferenceToZeroShiftX
; Increment Baseline
mov [X+CSA_1_baSnsBucket], 0
mov A, X
asl A
mov X, A
RAM_SETPAGE_IDX >CSA_1_waSnsBaseline
add [X+CSA_1_waSnsBaseline+LSB], 1
adc [X+CSA_1_waSnsBaseline+MSB], 0
jmp .SetDifferenceToZero
.LowerBaseline:
RAM_SETPAGE_IDX >CSA_1_waSnsResult
mov A, [X+CSA_1_waSnsResult+LSB]
RAM_SETPAGE_IDX >CSA_1_waSnsBaseline
mov [X+CSA_1_waSnsBaseline+LSB], A
RAM_SETPAGE_IDX >CSA_1_waSnsResult
mov A, [X+CSA_1_waSnsResult+MSB]
RAM_SETPAGE_IDX >CSA_1_waSnsBaseline
mov [X+CSA_1_waSnsBaseline+MSB], A
jmp .SetDifferenceToZero
.SetDifferenceToZeroShiftX:
mov A, X
asl A
mov X, A
.SetDifferenceToZero:
; Set difference to zero
RAM_SETPAGE_IDX >CSA_1_waSnsDiff
mov [X+CSA_1_waSnsDiff+LSB], 0
mov [X+CSA_1_waSnsDiff+MSB], 0
.EndofUpdateSensorBaseline:
RAM_EPILOGUE RAM_USE_CLASS_3
ret
.ENDSECTION
.SECTION
;-----------------------------------------------------------------------------
; FUNCTION NAME: CSA_1_bIsSensorActive(BYTE bSensorNum)
;
; DESCRIPTION:
; Returns state of one sensor. Updates the baSnsOnMask array.
; Implements hysteresis based on the Hysteresis parameter.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -