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

📄 box_car.asm

📁 TI的digital motor control lib的源代码。了解TI的编程规范
💻 ASM
字号:
;=====================================================================================
; File name:        BOX_CAR.ASM                     
;                    
; Originator:	Digital Control Systems Group
;			Texas Instruments
;
; Description:   Averaging box car                                
; 
;=====================================================================================
; History:
;-------------------------------------------------------------------------------------
; 9-15-2000	Release	Rev 1.0
;================================================================================
; Applicability: F240,F241,C242,F243,F24xx.  (Peripheral Independent).
;================================================================================
; Routine Name: bc_calc 				  					    Type: C Callable
;  
;  C prototype : void bc_calc(struct BOXCAR *p);
;
;        The struct object is defined in the header file "box_car.h" as follows:
;
; typedef struct { int  BC_IN; 			/* Input: Box-Car input (Q15) */
;				   int  BC_PTR;			/* Variable: Box-car buffer pointer */			
;		 	 	   int  BC_BUFFER[64];	/* Variable: Box-car buffer (Q15) */
;				   int  BC_OUT;			/* Output: Box-car output (Q15) */
;				   int  bc_scaler;		/* Parameter: Box-car scaler (Q15) */
;		  	  	   int  (*calc)();	  	/* Pointer to calculation function */ 
;				 } BOXCAR;	      
;	 		 
;        Frame Usage Details:
;     step   |      a      |      b       |      c       |     d     
;____________|_____________|______________|______________|_____________
;     AR0  	 |   BC_PTR    |              | 			 |     
;
; NOTE: The AR0 here is keeping the buffer pointer value, BC_PTR, rather than the 
; frame pointer address, FR0, as usual.  
;
;================================================================================
                .def        _bc_calc
;================================================================================
BC_SIZE_			.set 64
; This BC_SIZE_ here is changed corresponding to the BC_SIZE in the header file 
; of BOX_CAR.H. Then, the module library (e.g., clib_010.lib) must be rebuilt to take
; the effect.

;================================================================================
__bc_calc_framesize .set 0000h
;================================================================================
_bc_calc:
 													; Assume now ARP=AR1
     	POPD	*+									; Keep return address
       	SAR  	AR0,*+								; Keep old frame pointer (FP)
       	SAR   	AR1,*								; Keep old stack pointer (SP)
       	LARK  	AR0,__bc_calc_framesize 			; Load AR0 with frame size	
       	LAR   	AR0,*0+,AR0							; AR0->FP0 (new FP), ARP=AR0

;================================================================================
		SBRK	#3		; ARP=AR0, AR0->FR0-3 (1st argument)		
;----------------------------------------------------------------------------------
		LAR		AR2,*	; ARP=AR0, AR0->BC_IN, AR2->BC_IN
;----------------------------------------------------------------------------------
		LAR		AR3,*	; ARP=AR0, AR0->BC_IN, AR2->BC_IN, AR3->BC_IN 								
;----------------------------------------------------------------------------------
		ADRK	#3		; ARP=AR0, AR0->FR0, AR2->BC_IN, AR3->BC_IN 
;----------------------------------------------------------------------------------
		MAR		*,AR2  	; ARP=AR2, AR0->FR0, AR2->BC_IN, AR3->BC_IN
;----------------------------------------------------------------------------------
		SETC 	SXM		; Turn sign extension mode on
						; ARP=AR2, AR0->FR0, AR2->BC_IN, AR3->BC_IN
;----------------------------------------------------------------------------------
		SETC	OVM		; Set overflow mode
						; ARP=AR2, AR0->FR0, AR2->BC_IN, AR3->BC_IN
;----------------------------------------------------------------------------------
 		SPM     0       ; Reset product mode
       					; ARP=AR2, AR0->FR0, AR2->BC_IN, AR3->BC_IN 
;----------------------------------------------------------------------------------
 		ADRK	#1		; ARP=AR2, AR0->FR0, AR2->BC_PTR, AR3->BC_IN 
;----------------------------------------------------------------------------------
		LAR		AR0,*+	; ARP=AR2, AR0=BC_PTR, AR2->BC_BUFFER[0], AR3->BC_IN					
;----------------------------------------------------------------------------------
		MAR		*0+,AR2 ; ARP=AR2, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_IN
;----------------------------------------------------------------------------------
		MAR		*,AR3	; ARP=AR3, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_IN
;----------------------------------------------------------------------------------
		LACL	*+,AR2	; ACC = BC_IN  (Q15)
			            ; ARP=AR3, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR, ARP=AR2
;----------------------------------------------------------------------------------
		SACL	*,AR3	; BC_BUFFER[BC_PTR] = BC_IN  (Q15)
						; ARP=AR2, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR, ARP=AR3	
;----------------------------------------------------------------------------------
       	LACL	*		; ACC = BC_PTR
       					; ARP=AR3, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR
;----------------------------------------------------------------------------------
      	ADD		#0001h 	; ACC = BC_PTR + 1
      					; ARP=AR3, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR
;----------------------------------------------------------------------------------
      	AND		#003Fh 	; ACC = BC_PTR + 1
      					; ARP=AR3, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR
;----------------------------------------------------------------------------------
       	SACL	*		; BC_PTR = BC_PTR + 1
       					; ARP=AR3, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR
;----------------------------------------------------------------------------------
      	LACL	#0000h  ; ACC = 0  (Q15)
      					; ARP=AR3, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR
;----------------------------------------------------------------------------------
        MAR		*,AR2 	; ARP=AR2, AR0=BC_PTR, AR2->BC_BUFFER[BC_PTR], AR3->BC_PTR
;----------------------------------------------------------------------------------
		MAR		*0-,AR2 ; ARP=AR2, AR0=BC_PTR, AR2->BC_BUFFER[0], AR3->BC_PTR
;----------------------------------------------------------------------------------
      	RPT		#(BC_SIZE_-1) ; Repeat next instruction 64 times (BC_SIZE_ = 64)
      					; ARP=AR2, AR0=BC_PTR, AR2->BC_BUFFER[0], AR3->BC_PTR
;----------------------------------------------------------------------------------
		ADD		*+ 		; ACC = sum of BC_BUFFER[0...63]  
						; ARP=AR2, AR0=BC_PTR, AR2->BC_BUFFER[0...63], AR3->BC_PTR   	
;----------------------------------------------------------------------------------
      					; **** # of SFR's is log2(BC_SIZE_) ****
      	SFR				; ACC = sum of BC_BUFFER[0...63]/2
      					; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR 
;----------------------------------------------------------------------------------
      	SFR				; ACC = sum of BC_BUFFER[0...63]/4
      					; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
      	SFR				; ACC = sum of BC_BUFFER[0...63]/8
      					; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
      	SFR				; ACC = sum of BC_BUFFER[0...63]/16
      					; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
      	SFR				; ACC = sum of BC_BUFFER[0...63]/32
      					; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
      	SFR				; ACC = sum of BC_BUFFER[0...63]/64
      					; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
		SACL	*		; BC_OUT = sum of BC_BUFFER[0...63]/64
						; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR	
;----------------------------------------------------------------------------------
    	LT		*+		; TREG = BC_OUT  (Q15)
    					; ARP=AR2, AR0=BC_PTR, AR2->bc_scaler, AR3->BC_PTR
;----------------------------------------------------------------------------------
      	MPY		*-		; PREG = BC_OUT*bc_scaler  (Q30)
      					; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR	
;----------------------------------------------------------------------------------
     	PAC				; ACC = BC_OUT*bc_scaler  (Q30)
     					; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR
;----------------------------------------------------------------------------------
		SACH	*,1,AR1	; BC_OUT = BC_OUT*bc_scaler  (Q31)
						; ARP=AR2, AR0=BC_PTR, AR2->BC_OUT, AR3->BC_PTR, ARP=AR1
;----------------------------------------------------------------------------------
_bc_calc_exit:
       	;; MAR     *,AR1   ; can be removed if this condition is met on
       	                ; every path to this code. (i.e., ARP=AR1 here)

        CLRC	OVM
        CLRC	SXM

    	SBRK 	#(__bc_calc_framesize +1)
        LAR  	AR0,*-
        PSHD	*
        
        RET



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -