⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csa_1hl.asm

📁 电容感应程序
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;;*****************************************************************************
;;  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 + -