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

📄 ex4.asm

📁 VC33中通过pc输入改变其DDS发生器的频率
💻 ASM
字号:
        .sect    "init"
        .global  init
        .text
        .word	init
        .space	8
        .word   timer0
init:   ldp     0,dp
        ldi     @STCK,sp               ;INIT STACK
        ldi     1800H,st               ;INIT ST
    ;-------------------------UART
        ldi     @MCTL,ar0              ;降低总线速度适应双口RAM
        ldi     MBUS3,r0
        sti     r0,*ar0
        ldi     @MCTLS,ar0
        sti     r0,*ar0  
        
    	ldi     0,r0    
    	ldi	@PORT232,ar1 
    	sti	r0,*ar1    ;清除接收标志
    ;-------------------------UART	
        ldi     @MCTL,ar0              ;INIT MAIN BUS
        ldi     MBUS1,r0
        sti     r0,*ar0
        ldi     @MCTLS,ar0
        sti     r0,*ar0       

        ldi     0,r0
        ldi     @ADADER,ar0
        sti     r0,*ar0
        ldi     @ADADERM,ar0
        sti     r0,*ar0

        ldi     @TSDATA,ar0
        ldi     @SADDR,ar1
        sti     ar0,*ar1
 
    ;-------------------------DDS                         
        call    ddsinit
		ldf     11,r0
		ldi     @F1,ar0
		stf     r0,*ar0
		float   495,r0
		ldi     @FL,ar0
		stf     r0,*ar0
		float   605,r0
		ldi     @FH,ar0
		stf     r0,*ar0
        call    sinit
    ;-------------------------DDS                         
		call    initt0         ;timer0 init
        ldi     100H,IE                ;ACTIVE TIMER0
        or      2000h,st             

main:   ldi     @TNUM,ar0                   
        ldi     *ar0,r0
        absi    r0
        cmpi    666h,r0
        blt     main   
        ldi     0,r0
        sti     r0,*ar0
        ldi     @LEDS,ar0
        ldi     *ar0,r0
        cmpi    0,r0
        ldieq   1,r0 
        ldine   0,r0
        sti     r0,*ar0
        ldi     @LED,ar0
        sti     r0,*ar0
        
    ;-------------------------UART
        ldi     @MCTL,ar0              ;降低总线速度适应双口RAM
        ldi     MBUS3,r0
        sti     r0,*ar0
        ldi     @MCTLS,ar0
        sti     r0,*ar0  
        
    	ldi	@PORT232,ar1
    	ldi	*ar1,r0  
    	and		0ffh,r0
    	cmpi	55h,r0
    	bne	jump
    	
    	ldi	*+ar1(1),r0  
    	and		0ffh,r0

	cmpi	3,r0
	bne	FSKout    
	
        ldi     808h,ar0             
        lsh     12,ar0
        addi    30h,ar0
        ldi     0h,r0                  ;STOP TIMER1
        sti     r0,*ar0
 	ldi	*+ar1(2),r0 
 	and		0ffh,r0
 	ldi	*+ar1(3),r1 
 	and		0ffh,r1
 	lsh	8,r0
 	or	r1,r0
 	float	r0
    ;-------------------------DDS                         
	ldi     @FL,ar0
	stf     r0,*ar0
	ldi     @FH,ar0
	stf     r0,*ar0	
	
	ldi     @MCTL,ar0
        ldi     MBUS7,r0
        sti     r0,*ar0
        ldi     @MCTLS,ar0
        sti     r0,*ar0  
        
        ldi	@FL,ar0
        ldf	*ar0,r0
        ldi	@FH,ar0
        ldf	*ar0,r1
        mpyf    @SINGFXS,r0
        addf    0.5,r0
        fix     r0
        mpyf    @SINGFXS,r1
        addf    0.5,r1
        fix     r1
        ldi     0ffffh,r6
        lsh     16,r6
        and3    r6,r0,r5
        lsh     -16,r5
        ldi     @DDS_FREQ0H,ar0
        sti     r5,*ar0
        ldi     @DDS_FREQ0L,ar0
        sti     r0,*ar0
        and3    r1,r6,r5
        lsh     -16,r5
        ldi     @DDS_FREQ1H,ar0
        sti     r5,*ar0
        ldi     @DDS_FREQ1L,ar0
        sti     r1,*ar0

    	ldi     0,r0    
    	ldi	@PORT232,ar1
    	sti	r0,*ar1    ;清除接收标志
    	
        ;ldi     @MCTL,ar0 
        ;ldi     MBUS1,r0
        ;sti     r0,*ar0
        ;ldi     @MCTLS,ar0
        ;sti     r0,*ar0
        
        br	jump
        
FSKout:	ldi	*+ar1(2),r0   
	and		0ffh,r0
 	ldi	*+ar1(3),r1 
 	and		0ffh,r1
 	lsh	8,r0
 	or	r1,r0
 	ldi	*+ar1(4),r1 
 	and		0ffh,r1
 	ldi	*+ar1(5),r2 
 	and		0ffh,r2
 	lsh	8,r1
 	or	r2,r1
 	ldi	*+ar1(6),r2 
 	and		0ffh,r2
 	ldi	*+ar1(7),r3  
 	and		0ffh,r3
 	lsh	8,r2
 	or	r3,r2
 	float	r0
 	float	r1
 	float	r2
 	
	ldi     @F1,ar0
	stf     r2,*ar0
	ldi     @FL,ar0
	stf     r1,*ar0
	ldi     @FH,ar0
	stf     r2,*ar0
    	call    sinit

    	ldi     0,r0    
    	ldi	@PORT232,ar1
    	sti	r0,*ar1    ;清除接收标志
    	
    ;-------------------------UART
	
jump:	ldi     @MCTL,ar0              ;INIT MAIN BUS
        ldi     MBUS1,r0
        sti     r0,*ar0
        ldi     @MCTLS,ar0
        sti     r0,*ar0  
        
	call    msamp

        br      main
;------------------------------
timer0: push    st
        push    ar0
        push    ar1
        push    ar2
        push    BK
        ldi     SAMNUM,BK
        ldi     @MCTL,ar0            
        ldi     MBUS7,ar1
        sti     ar1,*ar0
        ldi     @ADADER,ar0
        ldi     *ar0++,ar2
        addi    2000h,ar2
        and     3fffh,ar2
        sti     ar2,*ar0
        ldi     @SADDR,ar0
        ldi     *ar0,ar0
        sti     ar2,*ar0++%
        ldi     @SADDR,ar2
        sti     ar0,*ar2
        ldi     @MCTL,ar1
        ldi     @MCTLS,ar0
        ldi     *ar0,ar0
        sti     ar0,*ar1

        ldi     @TNUM,ar0
        ldi     *ar0,ar1
        addi    1,ar1
        sti     ar1,*ar0        

        pop     BK
        pop     ar2
        pop     ar1
        pop     ar0
        pop     st
        reti                          
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
initt0: ldi     0,r0                  
        ldi     808h,ar0
        lsh     12,ar0
        addi    20h,ar0
        sti     r0,*+ar0(4)
        ldi     FS,r0
        sti     r0,*+ar0(8)
        ldi     3c1h,r0
        sti     r0,*ar0
        rets
;------------------------------                         
msamp:  ldi     SAMNUM,BK
        ldi     @INADDR,ar2
        ldi     @SADDR,ar0
        ldi     *ar0,ar1
        ldi     DLENTH0,rc
        subi    2,rc
        float   *ar1++%,r0
        rptb    samp0
samp0:  float   *ar1++%,r0
||      stf     r0,*ar2++
        stf     r0,*ar2++
        ;------------------below selelct
        ldf     0.0,r0
        ldi     DLENTH0,rc
        subi    1,rc
        rptb    samp1
samp1:  stf     r0,*ar2++
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ddsinit:ldi     @MCTL,ar0
        ldi     MBUS7,r0
        sti     r0,*ar0
        ldi     4000h,r0
        lsh     4,r0
        rpts    r0
        nop

        ldi     0,r0
        ldi     @DDS_PHASE0,ar0
        sti     r0,*ar0
        ldi     @DDS_PHASE1,ar0
        sti     r0,*ar0
        ldi     @DDS_PHASE2,ar0
        sti     r0,*ar0
        ldi     @DDS_PHASE3,ar0
        sti     r0,*ar0
        ldi     @MCTL,ar0
        ldi     MBUS1,r0
        sti     r0,*ar0
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
sinit:  ldi     @F1,ar0
        ldf     *ar0,r0
        call    initt1
        
        ldi     @MCTL,ar0
        ldi     MBUS7,r0
        sti     r0,*ar0
        
        ldi		@FL,ar0
        ldf		*ar0,r0
        ldi		@FH,ar0
        ldf		*ar0,r1
        mpyf    @SINGFXS,r0
        addf    0.5,r0
        fix     r0
        mpyf    @SINGFXS,r1
        addf    0.5,r1
        fix     r1
        ldi     0ffffh,r6
        lsh     16,r6
        and3    r6,r0,r5
        lsh     -16,r5
        ldi     @DDS_FREQ0H,ar0
        sti     r5,*ar0
        ldi     @DDS_FREQ0L,ar0
        sti     r0,*ar0

        and3    r1,r6,r5
        lsh     -16,r5
        ldi     @DDS_FREQ1H,ar0
        sti     r5,*ar0
        ldi     @DDS_FREQ1L,ar0
        sti     r1,*ar0

        ldi     @MCTL,ar0 
        ldi     MBUS1,r0
        sti     r0,*ar0
        ldi     @MCTLS,ar0
        sti     r0,*ar0
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;subE: initt1
initt1: call    invf                   ;input data R0 float
        ldf     @FT15M,r4
        mpyf    r0,r4
        addf    0.5,r4
        fix     r4

        ldi     0h,r0                  ;r4=FS
        ldi     808h,ar0               ;INIT TIMER1
        lsh     12,ar0
        addi    30h,ar0
        sti     r0,*+ar0(4)            ;COUNTER CLEAR
        sti     r4,*+ar0(8)            ;15000000/FS
        ldi     3c1h,r0                ;RUN TIMER1
        sti     r0,*ar0
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm subE: invf
invf:   ldf     r0,r3                  ;use r0,r1,r2,r3
        absf    r0                     ;input & output use r0
        pushf   r0
        pop     r1
        ash     -24,r1
        negi    r1
        subi    1,r1
        ash     24,r1
        push    r1
        popf    r1
        mpyf    r1,r0,r2
        subrf   2.0,r2
        mpyf    r2,r1
        mpyf    r1,r0,r2
        subrf   2.0,r2
        mpyf    r2,r1
        mpyf    r1,r0,r2
        subrf   2.0,r2
        mpyf    r2,r1
        mpyf    r1,r0,r2
        subrf   2.0,r2
        mpyf    r2,r1
        rnd     r1
        mpyf    r1,r0,r2
        subrf   1.0,r2
        mpyf    r1,r2
        addf    r2,r1
        rnd     r1,r0
        negf    r0,r2
        ldf     r3,r3
        ldfn    r2,r0
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;subE: initt1
            .data
TNUM        .word    7000H
LEDS        .word    7001H
MCTLS       .word    7002H
SADDR       .word    7003H
F1          .word    7004H
FL          .word    7005H
FH          .word    7006H

TSDATA      .word    10000H
INADDR      .word    800000H
MCTL        .word    808064H
STCK        .word    809E00H
ADADER      .word    0810000H
ADADERM     .word    0810001H
LED         .word    0810003H
PORT232     .word    0C00200H     

SIMVECT		.word	 0809FC1H

;------------------------------                         
FS          .set     727H
DLENTH0     .set     8192
SAMNUM      .set     2000H
MBUS1       .set     0001038H
MBUS3       .set     0001098H
MBUS7       .set     00010F8H

;------------------------------ 
SINGFXS         .FLOAT   178.95697     ;2^32/24000000
FT15M           .FLOAT   15000000.0    ;FT15M=F0/FS/8=120000000/8/FS=15000000/FS
;--------------------------------------------------------------------------
DDS_FREQ0L      .WORD    0810008H
DDS_FREQ0H      .WORD    0810009H
DDS_FREQ1L      .WORD    081000AH
DDS_FREQ1H      .WORD    081000BH
DDS_PHASE0      .WORD    081000CH
DDS_PHASE1      .WORD    081000DH
DDS_PHASE2      .WORD    081000EH
DDS_PHASE3      .WORD    081000FH
            .end

⌨️ 快捷键说明

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