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

📄 ex5.asm

📁 基于VC33的信号采集软件
💻 ASM
📖 第 1 页 / 共 2 页
字号:
        .sect    "init"
        .global  init,SINP
        .text
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;init start!!!
        .word   init
        .space  8
        .word   timer0
init:   ldp     0,dp
        ldi     @STCK,sp               ;INIT STACK
        ldi     1800H,st               ;INIT ST
        ldi     @MCTL,ar0              ;INIT MAIN BUS
        ldi     MBUS1,r0
        sti     r0,*ar0
        ldi     @MCTLS,ar0
        sti     r0,*ar0

        ldi     0,r0
        ldi     @TSDATA,ar0
        rpts    @SAMNUM
        sti     r0,*ar0++             
        ldi     @PORT232,ar1
        rpts    030h
        sti     r0,*ar1++

        ldi     0,r0
        ldi     @ADADER,ar0            ;SET A/D MODE A CHANNL 1 LU
        sti     r0,*ar0
        ldi     @ADADERM,ar0
        sti     r0,*ar0                ;RUN A/D
        ldi     @TNUM,ar0
        sti     r0,*ar0

        ldi     @TSDATA,ar0
        ldi     @SADDR,ar1
        sti     ar0,*ar1
    ;-------------------------DDS                         
        call    ddsinit
        ldf     11,r0
	ldi     @F1,ar0
	sti     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             
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;init end!!!
start:  ldi     @TNUM,ar0                   
        ldi     *ar0,r0
        absi    r0
        cmpi    2000h,r0
        blt     start   

        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

        call    msamp
        call    haming

        ldi     @INADDRD,ar0
        ldi     @INADDR,r0     
        sti     r0,*ar0
        ldi     @LOGFFT,ar0           
        ldi     SULOG,r0
        sti     r0,*ar0
        call    fft
  	
        ldi     400,ar0
        ldi     1000,ar1
        addi    @INADDR,ar0
        addi    @INADDR,ar1
        ldi     DLENTH,r0
        call    spc1
        call    sort                   ;you must write the program
        call    output
        br      start
;--------------------------------------------------------------comm_sub list
;  1: timer0  2: msamp   3: haming  4: spc1   5: initt0
;  6: invf    7: sqrt    8: wfreq   9: wamp  10: fft
;--------------------------------------------------------------comm sub list
;INTERRUPT SERVER;;;;;;;;;;;;;;;;;;;;;;comm sub1: timer0
timer0: push    st
        push    ar0
        push    ar1
        push    ar2
        push    ar3
        
        ldi     @MCTL,ar3              ;INIT MAIN BUS
        ldi     MBUS7,ar1
        sti     ar1,*ar3
        nop
        ldi     @ADADER,ar0
        ldi     *ar0,ar1
        addi    2000h,ar1
        and     3fffh,ar1       
        sti     ar1,*ar0

        ldi     @SADDR,ar0
        ldi     *ar0,ar0
        sti     ar1,*ar0++
        cmpi    @TSDATAM,ar0
        ldieq   @TSDATA,ar0
        ldi     @SADDR,ar1
        sti     ar0,*ar1

        ldi     @MCTL,ar3
        ldi     MBUS1,ar1
        sti     ar1,*ar3

        ldi     1,ar3
        ldi     @TNUM,ar0             
        addi3   ar3,*ar0,ar1
        sti     ar1,*ar0++

        ldi     @MCTL,ar3
        ldi     @MCTLS,ar0
        ldi     *ar0,ar0
        sti     ar0,*ar3

        pop     ar3
        pop     ar2
        pop     ar1
        pop     ar0
        pop     st
        reti                          
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm sub2: msamp
msamp:  ldi     @SAMNUM,BK
        ldi     @INADDR,ar2
        ldi     @SADDR,ar0            
        ldi     *ar0,ar1
        ldi     DLENTH,rc
        subi    2,rc
        float   *ar1++%,r0
        rptb    samp0
samp0:  float   *ar1++%,r0
||      stf     r0,*ar2++
        stf     r0,*ar2++

        ldf     0.0,r0                 
        ldi     DLENTH,rc              ;SET DATA LENGTH          
        subi    1,rc
        rptb    samp1
samp1:  stf     r0,*ar2++              ;IMAG PART CLEAR end
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm sub3: HAMING_windows
haming: ldi     @INADDR,ar0
        ldi     8192,ar7            
        ldi     @SINTAB,ar6            ;SET SINTAB ADDER
        addi    17ffh,ar6              ;97,11
        ldi     ar7,r5
        lsh     -1,r5
        subi    1,r5
        ldi     ar7,rc                 ;SET REPEAT LEN.
        subi    1,rc
        rptb    ham
        ldf     *ar0,r2              
        cmpi    r5,rc                  ;1fffh-1000h 1 part
        blt     part2
        beq     mid                    ;0fffh-0     2 part
        ldf     *ar6--,r6
        br      nom
mid:    nop     *ar6++
part2:  ldf     *ar6++,r6
nom:    addf    1.0,r6
    	mpyf    0.46,r6
        addf    0.08,r6
        mpyf    r6,r2
ham:    stf     r2,*ar0++        
    	rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;comm sub6: spc1
spc1:   ldi     @PWADDR,ar2            ;interface:ar0,ar1
        subi3   ar0,ar1,rc             ;          ar0:real part addr.
        addi3   r0,ar0,ar1             ;          output addr. PWADDR
        rptb    sends                  ;use:PWADDR DLENTH
        ldf     *ar1++,r1              ;use:ar0-ar2,r0,r1,rc
||      ldf     *ar0++,r0
        mpyf    r0,r0
        mpyf    r1,r1
        addf    r1,r0
sends:  stf     r0,*ar2++
        rets
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
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

        ldf     @FL,r0
        ldf     @FH,r1
        mpyf    @SINGFXS,r0
        addf    0.5,r0
        fix     r0
        mpyf    @SINGFXS,r1
        addf    0.5,r1
        fix     r1
        ldi     0fh,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

⌨️ 快捷键说明

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