4285|5

5

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

MSP430的汇编代码,求翻译成C语言代码 [复制链接]

谢谢   各位大神 ,这是基于MSP430的玻璃破碎代码,小弟想把算法移植。求大神帮忙翻译谢谢‘   我qq292883168’; --COPYRIGHT--,BSD;  Copyright (c) 2012, Texas Instruments Incorporated
;  All rights reserved.
;
;  Redistribution and use in source and binary forms, with or without
;  modification, are permitted provided that the following conditions
;  are met:
;
;  *  Redistributions of source code must retain the above copyright
;     notice, this list of conditions and the following disclaimer.
;
;  *  Redistributions in binary form must reproduce the above copyright
;     notice, this list of conditions and the following disclaimer in the
;     documentation and/or other materials provided with the distribution.
;
;  *  Neither the name of Texas Instruments Incorporated nor the names of
;     its contributors may be used to endorse or promote products derived
;     from this software without specific prior written permission.
;
;  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
;  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
;  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
;  PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
;  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
;  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
;  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
;  OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
;  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
;  OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
;  EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
; --/COPYRIGHT--
;******************************************************************************
;   MSP430x2274 Glasbreakage Detector
;
;
;                             MSP430x2274
;                        -----------------------
;               JTAG <--|SBWTCK/TEST    P1.7/TDO|-->
;                    <--|DVcc           P1.6/TDI|--> SFD
;                    <--|P2.5/Rosc      P1.5/TMS|--> CCA
;                    <--|DVSS           P1.4/TCK|--> FIFOP
;               Xout <--|P2.7           P1.3    |--> FIFO
;               Xin  <--|P2.6           P1.2    |--> VREG_EN
;                    <--|RST/SBWTDIO    P1.1    |--> RESETCC
;              OA0I0 -->|P2.0           P1.0    |--> LED
;              OA0O  <--|P2.1           P2.4    |--> VREF+/OFFSET
;              OA0I1 -->|P2.2           P2.3    |-->   
;              CSN   <--|P3.0           P3.7    |--> BUZZER
;              SI    <--|P3.1           P3.6    |-->
;              SO    <--|P3.2           P3.5    |--> UCA0BXD
;              SCLK  <--|P3.3           P3.4    |--> UCA0TXD
;                    <--|AVss           P4.7    |-->
;                    <--|AVcc           P4.6    |<-- OA1I3
;            Vcc_Mic <--|P4.0           P4.5    |-->
;                    <--|P4.1           P4.4    |--> OA1O
;                    <--|P4.2           P4.3    |-->
;                        -----------------------
;   R.Kammel
;   Texas Instruments Inc.
;   September 2006
;   Built with IAR Embedded Workbench Version: 3.41A
;   Code Version 1.001
;******************************************************************************

#include  
;-------------------------------------------------------------------------------
;        Defines and Equals                                                       -                                                                       
;-------------------------------------------------------------------------------

TACCR0_2ms  EQU     20                      ; TACCR0 = 20 @ VLO=12khz
trigger_lvl_high EQU 90                     ; signal input level
trigger_lvl_low  EQU -40                    ; signal input level

#define     integ_total R15                 
#define     avg_temp_1  R14
#define     res_avg R13
#define     delay1  R12
#define     inp13   R11
#define     inp11   R10
#define     INPUT   R9                     
#define     avg_1   R8
#define     avg_2   R7
#define     avg_3   R6
#define     temp2   R5
#define     temp1   R4

;-------------------------------------------------------------------------------
;        Variables                                                       -                                                                       
;-------------------------------------------------------------------------------
            RSEG     DATA16_Z               

OUTP        DS      2                       ; allocate 2 Byte
inp21       DS      2
outp11      DS      2
outp21      DS      2
inp23       DS      2
outp13      DS      2
outp23      DS      2
inp15       DS      2
inp25       DS      2
outp15      DS      2
outp25      DS      2
p11         DS      2
p13         DS      2
p15         DS      2
delay2      DS      2
delay3      DS      2
delay4      DS      2

avg_temp_2   DS     2                       ; averaging result n-2

peaks        DS     2                       ; captures number of peaks
zeros        DS     2                       ; captures number of zero crossings

integ_total_2  DS   2                       ; result integral total signal
integ_HPB    DS     2                       ; result integral high pass signal

sample_count DS     2                       ; captures number of samples
sample_count_2 DS   2

div_count_1  DS     2                       ; overflow count if integ_total            
div_count_2  DS     2                       ; overflow count if integ_HPB

ratio_false  DS     2                       ; count failure ratio rule
peak_false   DS     2                       ; count failure peaks rule
zero_false   DS     2                       ; count failure zero crossing rule

AAF_select   DS     2                       ; select anti aliasing filter
;-------------------------------------------------------------------------------
;            Main                                                                                                                       
;-------------------------------------------------------------------------------
            RSEG    CSTACK                  ; define stack segment
;-------------------------------------------------------------------------------
            RSEG    CODE                    ; assemble to Flash memory
;-------------------------------------------------------------------------------

RESET       mov.w   #SFE(CSTACK),SP         ; initialize stackpointer
StopWDT     mov.w   #WDTPW+WDTHOLD,&WDTCTL  ; stop WDT

SetupBC_    call    #SetDCO_8Mhz

SetupP1     mov.b   #0FFh,&P1DIR            ; all P1.x outputs            
            clr.b   &P1OUT                  ; all P1.x reset

SetupP2     mov.b   #0FFh,&P2DIR            ; all ports output, P2.0 don't care, P2.2 don't care,
            mov.b   #BIT0+BIT1+BIT2, &ADC10AE0
                                            ; P2.0 OA0I0, P2.1 OA0O (ADC IN)
                                            ; P2.2 OA0I1

            clr.b   &P2OUT                  ; all P2.x reset                                
SetupP3     mov.b   #0FFh,&P3DIR            ; all P3.x outputs
            clr.b   &P3OUT                  ; all P3.x reset
SetupP4     mov.b   #0FFh,&P4DIR            ; all P4.x output, P4.6 don't care, P4.4 don't care
            clr.b   &P4OUT                  ; all P4.x reset

            mov.w   #0, AAF_select          ; select AAF, "0" off else "on"           
            cmp.w   #1, AAF_select
            jlo     no_AAF                  ; unsigned           
SetupADC10  
            call    #SetupADC10_wakeup_AAF
            jmp     SetupOP0
no_AAF      call    #SetupADC10_wakeup_no_AAF

SetupOP0    call    #SetupOP1_2            
SetupTA_    call    #SetupTA

            call    #INITMEM                ; clear all variables

            bis.w   #MC_1, TACTL            ; up mode, TA start
            mov.b   #LPM3+GIE, SR           ; enable LPM3 mode and global interrupts

Mainloop    jmp     Mainloop
;------------------------------------------------------------------------------
TA0_ISR;   
;------------------------------------------------------------------------------
            bic.w   #MC_1, TACTL            ; TA stop

            bis.b   #BIT0, P4OUT            ; microphone on
            bis.b   #BIT4, P2OUT            ; offset on

            bis.w   #OAPM_3,&OA0CTL0_       ; start OP0 fast mode, amplifier

            cmp.w   #1, AAF_select
            jlo     cont_4                  ; jump if no AAF selected
            bis.w   #OAPM_3,&OA1CTL0_       ; start OP1 fast mode, start filter
            call    #delay_8MHz_AAF         ; OP settling time
            jmp     cont_5

cont_4      call    #delay_8MHz_no_AAF      ; OP settling time

cont_5      bis.w   #ADC10ON,&ADC10CTL0
            bis.w   #ENC+ADC10SC,&ADC10CTL0 ; enable ADC10 + start conversion

wait_IFG    bit.w   #ADC10IFG, &ADC10CTL0   ; ADC10IFG set?
            jz      wait_IFG                ; jump if ADC10IFG not set
            bic.w   #ADC10IFG, &ADC10CTL0

            mov.w   &ADC10MEM, temp1        ; save ADC10MEM to a working register
            sub.w   #520, temp1             ; subtract 520 because of 520 Offset

            cmp.w   #trigger_lvl_low, temp1 ; compare trigger level with input level
            jl      trigger                 ; temp1 < trigger level?
            cmp.w   #trigger_lvl_high, temp1; compare trigger level with input level  
            jge     trigger                 ; temp1 > trigger level?
            jmp     no_trigger

trigger     call    #SetDCO_12Mhz   
            bic.w   #ENC, &ADC10CTL0        ; disable ADC10
            bit.w   #BIT3, &OA1CTL0_
            jz      cont_9                  ; jump if AAF off
            call    #SetupADC10_cont_AAF    ; execute if AAF on
            jmp     cont_10
cont_9      call    #SetupADC10_cont_no_AAF
cont_10     bis.w   #ENC+ADC10SC,&ADC10CTL0 ; enable ADC10 + start conversion
            bic.b   #LPM3, 0(SP)            ; disable LPM3 mode
            reti

no_trigger  
            bic.w   #OAPM0+OAPM1,&OA0CTL0_  ; OP0 off
            bic.w   #OAPM0+OAPM1,&OA1CTL0_  ; OP1 off
            bic.w   #ENC,&ADC10CTL0         ; disable ADC10
            bic.w   #ADC10ON, &ADC10CTL0    ; ADC10 off
            bic.b   #BIT0, P4OUT            ; microphone off
            bic.b   #BIT4, P2OUT            ; offset off
            bis.w   #MC_1, TACTL            ; up mode, TA start
            reti

;------------------------------------------------------------------------------
ADC10_ISR;  
;------------------------------------------------------------------------------           
            mov.w   &ADC10MEM, temp1        ; save ADC10MEM to a working register
            sub.w   #512, temp1             ; subtract 512 because of 512 Offset                     
            inc     sample_count
            call    #signal_analysis
            reti
;------------------------------------------------------------------------------
signal_analysis;    analysing input signal 60ms = 2336 samples at fs=38961Hz
;------------------------------------------------------------------------------

           ; begin averaging of input signal

            clr     res_avg
            add.w   temp1, res_avg
            add.w   avg_1, res_avg
            add.w   avg_2, res_avg
            add.w   avg_3, res_avg

            mov.w   avg_2, avg_3
            mov.w   avg_1, avg_2
            mov.w   temp1, avg_1            ; save active sample

            rra.w   res_avg                 ; divide result by 2
            rra.w   res_avg                 ; divide result by 2

            ; end averaging of input signal

            ; begin integration of samples

            cmp.w   #0, temp1            
            jl      break_1                 ; jump if temp1 < 0, signed
            bic.w   #C, SR
            add.w   temp1, integ_total
            jnc     break_1                 ; jump if no overflow
            inc.w   div_count_1             ; count shift/div by 2 events           

            ; end integration of samples

            ; begin peak count

break_1     cmp.w   avg_temp_1, res_avg
            jge     break_2                 ; jump if res_avg > avg_temp_1, signed
            cmp.w   avg_temp_1, avg_temp_2   
            jge     break_2                 ; jump if avg_temp_2 > avg_temp_1, signed
            inc.w   peaks

            ; end peak count

break_2     ; begin zero count

            cmp.w   #0, avg_temp_1
            jl      test_2                  ; jump if avg_temp_1 < 0, signed
            cmp.w   #0, res_avg            
            jge     break_3                 ; jump if res_avg > 0, signed
            jmp     count
test_2      cmp.w   #0, res_avg
            jl      break_3                 ; jump if res_avg < 0, signed
count       inc     zeros

break_3     ; end zero count

            mov.w   avg_temp_1, avg_temp_2  ; save previous averaging results, avg_temp_2 holds result(n-2)
            mov.w   res_avg, avg_temp_1     ; save previous averaging results, avg_temp_1 holds result(n-1)

            mov.w   temp1, INPUT            ; temp1 holds current sample
            call    #WDF

            ; begin integration of samples of WDF output

            mov.w   OUTP, temp1
test_1      cmp.w   #0, temp1            
            jl      break_4                 ; jump if temp1 < 0
            bic.w   #C, SR
            add.w   temp1, integ_HPB  
            jnc     break_4
            inc.w   div_count_2             ; count shift/div by 2 events           

            ; end integration of samples of WDF output

break_4     ; begin ratio HP band/total band

            cmp.w   #2336, sample_count     ; 2336 samples reached (60ms)?
            jlo     end_analyz              ; if sample_count < 2336, unsigned
ADC_off     bic.w   #ENC+ADC10IE, &ADC10CTL0; disable ADC10
            bic.w   #OAPM0+OAPM1,&OA0CTL0_  ; OP0 amplifier off
            bic.w   #OAPM0+OAPM1,&OA1CTL0_  ; OP1 filter off
            bic.b   #BIT0, P4OUT            ; mic off
            bic.b   #BIT4, P2OUT            ; offset off

            ; begin pre-scaling

            mov.w   div_count_1, temp1
            mov.w   div_count_2, temp2

            cmp.w   temp2, temp1            
            jlo     ratio_f_1               ; jump if div_count_1 < div_count_2           
            sub.w   #0, temp1               ; begin shift values equal to their overflows
            jz      break_5                 ; jump if div_count_1 = 0 -> if no overflow at integ_total occured           
loop_1      cmp.w   #1, temp2                 
            jlo     rrc_C_0                 ; jump if div_count_2=0 and div_count_1!=0
            bis.w   #C, SR        
            rrc.w   integ_HPB               ; shifts integ_HPB through carry=1
            dec.w   temp2                   ; decrement div_count_2 number once per shift operation
            jmp     cmp_temp1               ; finish div_count_2 test
rrc_C_0     bic.w   #C, SR               
            rrc.w   integ_HPB               ; shifts integ_HPB through carry=0  

cmp_temp1   bis.w   #C, SR
            rrc.w   integ_total              
            dec.w   temp1                   ; sets carry while div_count_1!=0
            cmp.w   #1, temp1
            jge     loop_1                  ; end shift values equal to their overflows

            ; end pre-scaling

break_5    ; begin division quotient=dividend/divisor

            bit.w   #8000, integ_HPB
            jz      cont_11                 ; jump if integ_HPB(divisor) MSB="0"

            bic.w   #C, SR
            rrc.w   integ_HPB               ; MSB="0" required
            bic.w   #C, SR
            rrc.w   integ_total             ; shift to keep ratio konstant

cont_11     cmp.w   #0,integ_HPB            ; prevent division by zero
            jeq     ratio_f_1               

            mov.w   integ_total, R15        ; R15 has dividend, R15 holds result
            mov.w   integ_HPB, R14          ; R14 has divisor
            mov.w   #16,R11                 ; counter 16bit register = 16shifts
            clr.w   R13                            ; A, R13 finaly holds the remainder       
start       rla.w   R15                            ; shift left by one       
            rlc.w   R13                            ; catches first bit of shiftet dividend               
            bis.w   #1, R15                    ; set last bit of dividend
            sub.w   R14,R13                    ; A-divisor=A
            jge     loc1                    ; A>=0 ?
            add.w   R14,R13
            bic.w   #1, R15                    ; clear last bit depending on result of A-divisor=A
                                            ; A<0 bit one of dividend=1, A>0 bit one of dividend=0
loc1        dec.w   R11
            cmp.w   #0,R11
            jnz     start

            ; end division quotient=dividend/divisor

            ; begin floating point of division

            clr     R12
            rra     R14                     ; divider/4
            rra     R14
loop_2      sub.w   R14, R13      
            cmp.w   #0, R13
            jl      cont_test;
            inc     R12                     ; counter, how often is divider/4 in remainder           
            cmp     #3, R12                 ; if more than 3 loops
            jge     cont_test
            jmp     loop_2

            ; end floating point of division

cont_test   ; begin data interpretation

            cmp.w   #7, R15
            jge     ratio_f_1
            cmp.w   #1, R15
            jl      ratio_f_1
            jne     check_peaks
            cmp     #3, R12                 ; check decimal point, 3=0.75
            jl      ratio_f_1
            jmp     check_peaks

check_peaks cmp.w   #160, peaks            
            jlo     peakfalse
            cmp.w   #320, peaks            
            jge     peakfalse

check_zeros cmp.w   #95, zeros
            jlo     zerofalse
            cmp.w   #300, zeros
            jge     zerofalse
            jmp     check

ratio_f_1   inc.w   ratio_false             ; set ratio false flag
            jmp     check_peaks
peakfalse   inc.w   peak_false              ; set peak false flag
            jmp     check_zeros
zerofalse   inc.w   zero_false              ; set zero crossing false flag

check       cmp.w   #1, ratio_false
            jge     break_6
            cmp.w   #1, peak_false
            jge     break_6
            cmp.w   #1, zero_false
            jge     break_6

            ; end data interpretation

glass_break bis.b   #BIT0,&P1OUT            ; set P1.0 = 1, turn led on
            bis.b   #BIT7,&P3OUT            ; set P3.7 = 1, turn buzzer on
            call    #delay_12Mhz            ; delay led/buzzer active time
            bic.b   #BIT0,&P1OUT            ; set P1.0 = 0, turn led off
            bic.b   #BIT7,&P3OUT            ; set P3.7 = 0, turn buzzer off

break_6     bit.w   #BIT3, &OA1CTL0_
            jz      cont_7                  ; jump if AAF off
            call    #SetupADC10_wakeup_AAF  ; execute if AAF on
            jmp     cont_8
cont_7      call    #SetupADC10_wakeup_no_AAF
            call    #INITMEM
cont_8      call    #SetDCO_8Mhz
            bis.w   #MC_1, TACTL            ; up mode, TA start

            mov.b   #LPM3+GIE, SR           ; enable LPM3 mode and global interrupts

end_analyz  ret
;-------------------------------------------------------------------------------
SetupADC10_wakeup_AAF; Setup ADC10 comparator                                                                                                                               
;-------------------------------------------------------------------------------
            mov.w   #ADC10SHT_1+ADC10SR, &ADC10CTL0
                                            ; 8 ADC10CLK S&H, max 50ksps                                       
            mov.w   #INCH_13+ADC10DIV_2+ADC10SSEL_3+CONSEQ_0, &ADC10CTL1
                                            ; Channel A13, ADC10CLK=SMCLK/3
                                            ; Single Channel Conversion                       
            ret
;-------------------------------------------------------------------------------
SetupADC10_wakeup_no_AAF; Setup ADC10 comparator                                                                                                                               
;-------------------------------------------------------------------------------
            mov.w   #ADC10SHT_1+ADC10SR, &ADC10CTL0
                                            ; 8 ADC10CLK S&H, max 50ksps                                       
            mov.w   #INCH_1+ADC10DIV_2+ADC10SSEL_3+CONSEQ_0, &ADC10CTL1
                                            ; Channel A1, ADC10CLK=SMCLK/3
                                            ; Single Channel Conversion                    
            ret
;-------------------------------------------------------------------------------
SetupADC10_cont_AAF;    Setup ADC10 signal analysis                                                                                                                               
;-------------------------------------------------------------------------------
            mov.w   #ADC10SHT_3+ADC10SR+MSC+ADC10ON+ADC10IE, &ADC10CTL0
                                            ; Ref: VR+ = Vcc and VR- = Vss
                                            ; 64 ADC10CLK S&H, max 50ksps
                                            ; Multi S&C, ADC on, ADC IE
            mov.w   #INCH_13+ADC10DIV_3+ADC10SSEL_3+CONSEQ_2, &ADC10CTL1
                                            ; Channel A13, ADC10CLK=SMCLK/4
                                            ; Repeat Single Channel Conversion                                 
            ret
;-------------------------------------------------------------------------------
SetupADC10_cont_no_AAF;    Setup ADC10 signal analysis                                                                                                                               
;-------------------------------------------------------------------------------
            mov.w   #ADC10SHT_3+ADC10SR+MSC+ADC10ON+ADC10IE, &ADC10CTL0
                                            ; Ref: VR+ = Vcc and VR- = Vss
                                            ; 64 ADC10CLK S&H, max 50ksps
                                            ; Multi S&C, ADC on, ADC IE
            mov.w   #INCH_1+ADC10DIV_3+ADC10SSEL_3+CONSEQ_2, &ADC10CTL1
                                            ; Channel A1, ADC10CLK=SMCLK/4
                                            ; Repeat Single Channel Conversion        
            ret
;-------------------------------------------------------------------------------
SetupOP1_2;         Setup OP1 & OP2                                                                                                                               
;-------------------------------------------------------------------------------
OP0         mov.b   #OAFBR_6+OAFC_6+OANEXT,&OA0CTL1_
                                            ; Inverting PGA, gain=-7
                                            ; inv input external available
            mov.b   #OAN_1+OAP_0+OAPM_0+OAADC1,&OA0CTL0_
                                            ; inv input OA0I1 P2.2
                                            ; non inv input OA0I0 P2.0   
                                            ; off mode, OA0O at A13 & P2.1

OP1         mov.b   #OAFC_2,&OA1CTL1_       ; Unity gain buffer                                             
            mov.b   #OAP_3+OAPM_0+OAADC0,&OA1CTL0_
                                            ; non inv input OA1I1 P4.6   
                                            ; off mode, OA1O at A13 & P4.4
            bis.b   #0f0h,&ADC10AE1         ; P4.4 OA1O, P4.6 OA1I3  
            ret
;-------------------------------------------------------------------------------
SetupTA;            Setup TA wake up                                                                                                                        
;-------------------------------------------------------------------------------
            mov.w   #TASSEL0, TACTL         ; TACLK=ACLK=VLO
            mov.w   #OUTMOD_4+CCIE, TACCTL0 ; toggle mode @ P1.1, CCRO IE
            mov.w   #TACCR0_2ms, TACCR0     ;
            ret
;-------------------------------------------------------------------------------
SetDCO_12Mhz;       Set DCO to 12Mhz and ACLK = VLO                                                                                                                      
;-------------------------------------------------------------------------------
            mov.b   &CALBC1_12MHZ,&BCSCTL1  ; set range
            mov.b   &CALDCO_12MHZ,&DCOCTL   ; set DCO step + modulation
            mov.b   #LFXT1S_2, &BCSCTL3     ; ACLK = VLO

            ret
;-------------------------------------------------------------------------------
SetDCO_8Mhz;        Set DCO to 8Mhz and ACLK = VLO                                                                                                                      
;-------------------------------------------------------------------------------
            mov.b   &CALBC1_8MHZ,&BCSCTL1   ; set range
            mov.b   &CALDCO_8MHZ,&DCOCTL    ; set DCO step + modulation
            mov.b   #LFXT1S_2, &BCSCTL3     ; ACLK = VLO

            ret
;------------------------------------------------------------------------------
delay_12Mhz;        
;------------------------------------------------------------------------------
            clr     R14
            clr     R13
incr_R13    inc.w   R13        
incr_R14    inc.w   R14
            cmp     #12000, R14            
            jnz     incr_R14
            clr     R14
            cmp     #1000, R13              
            jnz     incr_R13           
            ret            
;------------------------------------------------------------------------------
delay_8MHz_AAF;            
;------------------------------------------------------------------------------           
            clr     R14
            clr     R13
inc_R13     inc.w   R13        
inc_R14     inc.w   R14
            cmp     #25, R14            
            jnz     inc_R14
            clr     R14
            cmp     #1, R13              
            jnz     inc_R13
            ret            
;------------------------------------------------------------------------------
delay_8MHz_no_AAF;            
;------------------------------------------------------------------------------            
            clr     R14
            clr     R13
inc_R13_    inc.w   R13        
inc_R14_    inc.w   R14
            cmp     #1, R14            
            jnz     inc_R14_
            clr     R14
            cmp     #1, R13              
            jnz     inc_R13_
            ret
;------------------------------------------------------------------------------
WDF;            Bi-reciprocal WDF fs=38900
;------------------------------------------------------------------------------

            // upper branch \\

            ; ** alpha 3 stage ** gamma=-0.375 -> Type 3, alpha=0.375         

            mov.w   INPUT, inp13            ; WDF input
            mov.w   delay1, inp23
            mov.w   outp23, delay1
            mov.w   inp13, temp1
            sub.w   inp23, temp1
            mov.w   temp1, p13              ; p13=inp13-inp23

            ; begin shift & add multipication using horner method

            clr.w   temp2
            sub.w   temp1, temp2
            mov.w   temp2, temp1            ; negate temp1
            rra.w   temp1
            rra.w   temp1
            add.w   p13, temp1              ; 2
            rra.w   temp1                   ; 1

            ; end shift & add multipication using horner method

            mov.w   temp1, temp2
            sub.w   inp13, temp2                  
            mov.w   temp2, outp23           ; outp23=temp1-inp13
            sub.w   inp23, temp1
            mov.w   temp1, outp13           ; outp13=temp1-inp23

            ; ** alpha 1 stage ** gamma=-0.109375 -> Type 3 alpha=0.109375

            mov.w   INPUT, inp11            ; WDF input
            mov.w   delay2, inp21
            mov.w   outp21, delay2
            mov.w   inp11, temp1
            sub.w   inp21, temp1
            mov.w   temp1, p11              ; p11=inp11-inp21


            ; begin shift & add multipication using horner method

            clr.w   temp2
            sub.w   temp1, temp2
            mov.w   temp2, temp1            ; negate temp1

            rra.w   temp1
            rra.w   temp1
            rra.w   temp1
            add.w   p11, temp1              ; 3
            rra.w   temp1
            rra.w   temp1
            rra.w   temp1

            ; end shift & add multipication using horner method

            mov.w   temp1, temp2
            sub.w   inp11, temp2                  
            mov.w   temp2, outp21           ; outp21=temp1-inp11
            sub.w   inp21, temp1           
            mov.w   temp1, outp11           ; outp11=temp1-inp21

            ; ** alpha 5 stage ** gamma=-0.75 -> Type 4 alpha=0.75

            mov.w   outp11, inp15
            mov.w   delay3, inp25
            mov.w   outp25, delay3
            mov.w   inp25, temp1
            sub.w   inp15, temp1
            mov.w   temp1, p15              ; p15=inp25-inp15

            ; begin shift & add multipication using horner method

            rra.w   temp1                  
            rra.w   temp1

            ; end shift & add multipication using horner method

            sub.w   inp25, temp1                  
            mov.w   temp1, outp25           ; outp25=temp1-inp25
            mov.w   outp25, temp2
            sub.w   p15, temp2
            mov.w   temp2, outp15           ; outp15=outp25-p15

            ; begin final output

            mov.w  delay4, OUTP
            sub.w  outp15, OUTP             ; high pass output
            rra    OUTP                     ; divide output by two
            mov.w  outp13, delay4

            ; end final output

            ret           
;-------------------------------------------------------------------------------
INITMEM;        INIT Memory                                                                                                                       
;-------------------------------------------------------------------------------

            clr.w   INPUT               
            clr.w   OUTP                  

            clr.w   inp11               
            clr.w   inp21               
            clr.w   outp11              
            clr.w   outp21              

            clr.w   inp13               
            clr.w   inp23               
            clr.w   outp13              
            clr.w   outp23              

            clr.w   inp15               
            clr.w   inp25               
            clr.w   outp15              
            clr.w   outp25              

            clr.w   delay1
            clr.w   delay2
            clr.w   delay3
            clr.w   delay4
            clr.w   temp1
            clr.w   temp2

            clr.w   avg_1                                                
            clr.w   avg_2                                   
            clr.w   avg_3                                   
            clr.w   res_avg                     

            clr.w   avg_temp_1                           
            clr.w   avg_temp_2                              

            clr.w   peaks               
            clr.w   zeros               

            clr.w   integ_total                           
            clr.w   integ_HPB                           

            clr.w   sample_count
            clr.w   sample_count_2
            clr.w   div_count_1         
            clr.w   div_count_2         

            clr.w   ratio_false         
            clr.w   peak_false         
            clr.w   zero_false

            ret
;------------------------------------------------------------------------------
            COMMON  INTVEC                  ; Interrupt Vectors
;------------------------------------------------------------------------------
            ORG     RESET_VECTOR            ; MSP430 RESET Vector
            DW      RESET                   ;
            ORG     TIMERA0_VECTOR          ; Timer_A0 Vector (CCRO IFG only)
            DW      TA0_ISR                 ;
            ORG     ADC10_VECTOR            ; ADC10 Vector
            DW      ADC10_ISR               ;
            END


最新回复

翻译成C挺简单,你看懂汇编的意思就很好写  详情 回复 发表于 2018-1-25 10:52
 
点赞 关注

回复
举报

62

帖子

1

TA的资源

一粒金砂(中级)

沙发
 
楼主省省吧,谁没事来反汇编这么长的汇编代码
 
 

回复

1059

帖子

1

TA的资源

版主

板凳
 
汇编代码挺少的,很好翻译,就是需要花点时间,你自己对着MSP430汇编指令翻译
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

4
 
LSJ.Micro 发表于 2018-1-24 17:24
楼主省省吧,谁没事来反汇编这么长的汇编代码

也是
 
 
 

回复

5

帖子

0

TA的资源

一粒金砂(初级)

5
 
qwerghf 发表于 2018-1-24 18:11
汇编代码挺少的,很好翻译,就是需要花点时间,你自己对着MSP430汇编指令翻译

汇编  难不难?   感觉 C语言就难了

点评

翻译成C挺简单,你看懂汇编的意思就很好写  详情 回复 发表于 2018-1-25 10:52
 
 
 

回复

1059

帖子

1

TA的资源

版主

6
 
曾祥裕 发表于 2018-1-25 09:58
汇编  难不难?   感觉 C语言就难了

翻译成C挺简单,你看懂汇编的意思就很好写
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表