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

📄 csdhl.asm

📁  PSoC(可编程片上系统)是Cypress半导体公司生产的包含有8位微处理器核和数字与模拟混合的信号阵列芯片
💻 ASM
📖 第 1 页 / 共 3 页
字号:
;;*****************************************************************************
;;  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 + -