📄 trap_gen.asm
字号:
;===========================================================================
; File Name: trap_gen.asm
;
; Module Name: TRAPEZOIDAL_GEN
;
; Initialization Routine: TRAPEZOIDAL_GEN_INIT
;
; Originator: Digital Control Systems Group
; Texas Instruments
;
; Description: This module generates trapezoidal output of adjustable maximum,
; minimum and frequency.
;
; |~~~~~~~~~~~~~~~~~|
; trap_min o------>| |
; trap_max o------>| TRAPEZOIDAL_GEN |----->o trap_out
; trap_dly_max o------>| |
; |_________________|
;
;
;=====================================================================================
; History:
;-------------------------------------------------------------------------------------
; 11-03-2000 Release Rev 1.1
;===========================================================================
;(To use this Module, copy this section to main system file)
; .ref TRAPEZOIDAL_GEN, TRAPEZOIDAL_GEN_INIT ;Function call
; .ref trap_min, trap_max, trap_dly_max ;Inputs
; .ref trap_out ;Output
;===========================================================================
.def TRAPEZOIDAL_GEN, TRAPEZOIDAL_GEN_INIT ;Function call
.def trap_min, trap_max, trap_dly_max ;Inputs
.def trap_out ;Output
;===========================================================================
.include "x24x_app.h"
trap_min .usect "trap_gen",1
trap_max .usect "trap_gen",1
trap_dly_max .usect "trap_gen",1
trap_out .usect "trap_gen",1
trap_out_lo .usect "trap_gen",1
trap_min_tmp .usect "trap_gen",1
trap_max_tmp .usect "trap_gen",1
trap_dly_max_tmp .usect "trap_gen",1
trap_timer .usect "trap_gen",1
trap_delay_cntr .usect "trap_gen",1
trap_8192inv .usect "trap_gen",1
trap_flag .usect "trap_gen",1
trap_tmp1 .usect "trap_gen",1
TRAPEZOIDAL_GEN_INIT:
LDP #trap_timer
SPLK #0, trap_flag ; Starting point flag
SPLK #0, trap_timer ; Timer (Q15)
SPLK #0, trap_delay_cntr ; Delay counter (Q0)
SPLK #6, trap_dly_max ; Maximum delay counter (Q0)
SPLK #6, trap_dly_max_tmp ; Maximum delay counter (Q0)
SPLK #0004h, trap_8192inv ; Constant = 1/8192 (Q15)
SPLK #2000h, trap_min ; Initialize minimum trapezoidal (Q15)
SPLK #2000h, trap_max ; Initialize maximum trapezoidal (Q15)
RET
TRAPEZOIDAL_GEN:
SPM 0 ; Reset product mode
SETC SXM ; Sign extension mode
SETC OVM ; Set Overflow mode
; Updating the time delay
LDP #trap_delay_cntr
LACC trap_delay_cntr
ADD #1
SACL trap_delay_cntr
SUB trap_dly_max_tmp
BCND TRAP_EXIT, LT
; Updating the timer
LACC trap_timer ; ACC = trap_timer (Q15)
ADD #1
AND #7FFFh ; Force "wrap" around for positive Q15
SACL trap_timer
; Checking the timer to update trap_max at trap_timer = 0
LACC trap_timer ; ACC = trap_timer (Q15)
BCND SKIP_UPDATE_MAX, NEQ ; Branch to SKIP_UPDATE_MAX if trap_timer != 0
LACC trap_max ; ACC = trap_max (Q15)
SACL trap_max_tmp ; trap_max_tmp = trap_max (Q15)
LACC trap_dly_max ; ACC = trap_dly_max (Q0)
SACL trap_dly_max_tmp ; trap_dly_max_tmp = trap_dly_max (Q0)
SKIP_UPDATE_MAX
; Checking the timer to update trap_min at trap_timer = 0.50
LACC trap_timer ; ACC = trap_timer (Q15)
SUB #4000h ; ACC = trap_timer - 0.50 (Q15)
BCND SKIP_UPDATE_MIN, NEQ ; Branch to SKIP_UPDATE_MIN if trap_timer != 0.50
LACC trap_min ; ACC = trap_min (Q15)
SACL trap_min_tmp ; trap_min_tmp = trap_min (Q15)
SKIP_UPDATE_MIN
; Checking the timer
LACC trap_timer
SUB #2000h ; ACC = trap_timer - 0.25 (Q15)
BCND INCREASE_TRAP,LT ; Branch to INCREASE_TRAP if 0 < trap_timer < 0.25
LACC trap_timer
SUB #4000h ; ACC = trap_timer - 0.5 (Q15)
BCND MAX_TRAP,LT ; Branch to MAX_TRAP if 0.25 < trap_timer < 0.5
LACC trap_timer
SUB #6000h ; ACC = trap_timer - 0.75 (Q15)
BCND DECREASE_TRAP,LT ; Branch to DECREASE_TRAP if 0.5 < trap_timer < 0.75
B MIN_TRAP ; Branch to MIN_TRAP if 0.75 < trap_timer < 1
INCREASE_TRAP
LACC trap_max_tmp,15 ; ACC = trap_max (Q14)
SUB trap_min_tmp,15 ; ACC = trap_max - trap_min (Q14)
SACH trap_tmp1 ; trap_tmp1 = trap_max - trap_min (Q14)
LT trap_8192inv ; TREG = 1/8192 (Q15)
MPY trap_tmp1 ; PREG = (1/8192)*(trap_max-trap_min) (Q29)
PAC ; ACC = (1/8192)*(trap_max-trap_min) (Q29)
SFL ; ACC = (1/8192)*(trap_max-trap_min) (Q30)
SFL ; ACC = (1/8192)*(trap_max-trap_min) (Q31)
ADDS trap_out_lo ; ACC = trap_out+(1/8192)*(trap_max-trap_min) (Q31)
ADDH trap_out ; ACC = trap_out+(1/8192)*(trap_max-trap_min) (Q31)
SACH trap_out ; trap_out = trap_out+(1/8192)*(trap_max-trap_min) (Q31)
SACL trap_out_lo ; trap_out = trap_out+(1/8192)*(trap_max-trap_min) (Q31)
B RESET_DELAY
MAX_TRAP
LACC trap_max_tmp,16 ; ACC = trap_max (Q15)
SACH trap_out ; trap_out = trap_max (Q15)
SACL trap_out_lo
B RESET_DELAY
DECREASE_TRAP
LACC trap_max_tmp,15 ; ACC = trap_max (Q14)
SUB trap_min_tmp,15 ; ACC = trap_max - trap_min (Q14)
SACH trap_tmp1 ; trap_tmp1 = trap_max - trap_min (Q14)
LT trap_8192inv ; TREG = 1/8192 (Q15)
MPY trap_tmp1 ; PREG = (1/8192)*(trap_max-trap_min) (Q29)
PAC ; ACC = (1/8192)*(trap_max-trap_min) (Q29)
NEG ; ACC = -(1/8192)*(trap_max-trap_min) (Q29)
SFL ; ACC = -(1/8192)*(trap_max-trap_min) (Q30)
SFL ; ACC = -(1/8192)*(trap_max-trap_min) (Q31)
ADDS trap_out_lo ; ACC = trap_out-(1/8192)*(trap_max-trap_min) (Q31)
ADDH trap_out ; ACC = trap_out-(1/8192)*(trap_max-trap_min) (Q31)
SACH trap_out ; trap_out = trap_out-(1/8192)*(trap_max-trap_min) (Q31)
SACL trap_out_lo ; trap_out = trap_out-(1/8192)*(trap_max-trap_min) (Q31)
B RESET_DELAY
MIN_TRAP
LACC trap_min_tmp,16 ; ACC = trap_min (Q15)
SACH trap_out ; trap_out = trap_min (Q15)
SACL trap_out_lo
B RESET_DELAY
RESET_DELAY
SPLK #0,trap_delay_cntr ; reset delay counter (Q0)
TRAP_EXIT
RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -