📄 notch_60.lst
字号:
mulMac
024A 0CB2 0CB1 03
011C27 2800 082B
012A 07AD 1803 AE
010A2C 082C 07AE
012F 0CAE 0CAD B0
010C31 0CAF
mulMac
0266 0CB2 0CB1 03
011C35 2800 082B
0138 07AD 1803 AE
010A3A 082C 07AE
013D 0CAE 0CAD B0
010C3F 0CAF
mulMac
0282 0CB2 0CB1 03
011C43 2800 082B
0146 07AD 1803 AE
010A48 082C 07AE
MPC "C" COMPILER BC.193 22-Aug-1995 PAGE 10
014B 0CAE 0CAD B0
010C4D 0CAF
mulMac
029E 0CB2 0CB1 03
011C51 2800 082B
0154 07AD 1803 AE
010A56 082C 07AE
0159 0CAE 0CAD B0
010C5B 0CAF
mulMac
02BA 0CB2 0CB1 03
011C5F 2800 082B
0162 07AD 1803 AE
010A64 082C 07AE
0167 0CAE 0CAD B0
010C69 0CAF
;
.IF SIGNED
016B 1FB4 btfss sign,7
016C 3400 retlw 0
016D 09AF comf ACCcLO ; negate ACCa ( -ACCa -> ACCa )
016E 0AAF incf ACCcLO
016F 1903 btfsc STATUS,Z
0170 03B0 decf ACCcHI
0171 09B0 comf ACCcHI
0172 1903 btfsc STATUS,Z
0173 09AD neg_B comf ACCbLO ; negate ACCb
0174 0AAD incf ACCbLO
0175 1903 btfsc STATUS,Z
0176 03AE decf ACCbHI
0177 09AE comf ACCbHI
0178 3400 retlw 0
.ELSE
retlw 0
.ENDIF
;
;*******************************************************************
;
0179 3016 setup movlw 16 ; for 16 shifts
017A 00B3 movwf temp
017B 082E movf ACCbHI,W ;move ACCb to ACCd
017C 00B2 movwf ACCdHI
017D 082D movf ACCbLO,W
017E 00B1 movwf ACCdLO
017F 01AE clrf ACCbHI
0180 01AD clrf ACCbLO
0181 3400 retlw 0
;
;*******************************************************************
;
0182 09AB neg_A comf ACCaLO ; negate ACCa ( -ACCa -> ACCa )
0183 0AAB incf ACCaLO
0184 1903 btfsc STATUS,Z
0185 03AC decf ACCaHI
0186 09AC comf ACCaHI
MPC "C" COMPILER BC.193 22-Aug-1995 PAGE 11
0187 3400 retlw 0
;
;*******************************************************************
; Assemble this section only if Signed Arithmetic Needed
;
.IF SIGNED
;
0188 082C S_SIGN movf ACCaHI,W
0189 062E xorwf ACCbHI,W
018A 00B4 movwf sign
018B 1FAE btfss ACCbHI,7 ; if MSB set go & negate ACCb
018C 2992 goto chek_A
;
018D 09AD comf ACCbLO ; negate ACCb
018E 0AAD incf ACCbLO
018F 1903 btfsc STATUS,Z
0190 03AE decf ACCbHI
0191 09AE comf ACCbHI
;
0192 1FAC chek_A btfss ACCaHI,7 ; if MSB set go & negate ACCa
0193 3400 retlw 0
0194 2982 goto neg_A
;
.ENDIF
#endasm
0035 bits x_n; /* input sample x(n) */
0036 unsigned long y_n; /* output sample y(n) */
003A unsigned long x_n_1; /* x(n-1) */
003C unsigned long x_n_2; /* x(n-2) */
003E unsigned long y_n_1; /* y(n-1) */
0040 unsigned long y_n_2; /* y(n-2) */
0042 char rmndr_h; /* high byte of remainder from multiplies */
0043 char rmndr_l; /* low byte of remainder from multiplies */
00D2 #define A1_H 0xd2 /* filter coefficients */
0008 #define A1_L 0x08 /* for 60Hz notch filter */
0011 #define A2_H 0x11 /* Fs= 1kHz */
0071 #define A2_L 0x71
0018 #define B0_H 0x18
00BB #define B0_L 0xbb
00D2 #define B1_H 0xd2
0008 #define B1_L 0x08
0018 #define B2_H 0x18
00B9 #define B2_L 0xb9
/******************************************************************************
* Filter initialization - clears all taps in memory.
*
* usage:
* - call init_filter()
* use at program initialization
MPC "C" COMPILER BC.193 22-Aug-1995 PAGE 12
******************************************************************************/
void init_filter(){
#asm
0195 01B6 clrf y_n ; clear output value
0196 01B7 clrf y_n+1 ;
0197 01BE clrf y_n_1 ; and all filter "taps"
0198 01BF clrf y_n_1+1 ;
0199 01C0 clrf y_n_2 ;
019A 01C1 clrf y_n_2+1 ;
019B 01BA clrf x_n_1 ;
019C 01BB clrf x_n_1+1 ;
019D 01BC clrf x_n_2 ;
019E 01BD clrf x_n_2+1 ;
#endasm
019F 0008 RETURN }
/******************************************************************************
* Assembly language subroutines for main filter() function
******************************************************************************/
#asm
;
; Add Remainder subroutine - adds remainder from multiplies to ACCc
;
add_rmndr:
01A0 1FB4 btfss sign,7 ; check if number is negative
01A1 29AD goto add_r_start ; go to add_r_start if not
01A2 09AF comf ACCcLO ; if so, negate number in ACC
01A3 0AAF incf ACCcLO ;
01A4 1903 btfsc STATUS,Z ;
01A5 03B0 decf ACCcHI ;
01A6 09B0 comf ACCcHI ;
01A7 1903 btfsc STATUS,Z ;
01A8 09AD comf ACCbLO ;
01A9 0AAD incf ACCbLO ;
01AA 1903 btfsc STATUS,Z ;
01AB 03AE decf ACCbHI ;
01AC 09AE comf ACCbHI ;
add_r_start:
01AD 0843 movf rmndr_l,W ; get low byte of remainder
01AE 07AF addwf ACCcLO ; and add to ACCcLO
01AF 1803 btfsc STATUS,C ; check for overflow
01B0 0AB0 incf ACCcHI ; if overflow, increment ACCcHI
01B1 0842 movf rmndr_h,W ; get high byte of remainder
01B2 07B0 addwf ACCcHI ; and add to ACCcHI
01B3 1803 btfsc STATUS,C ; check for overflow
01B4 0AAD incf ACCbLO ; if overflow, increment ACCbLO
MPC "C" COMPILER BC.193 22-Aug-1995 PAGE 13
01B5 1FB4 btfss sign,7 ; check if result negative
01B6 29C2 goto add_r_done ; if not, go to add_r_done
01B7 09AF comf ACCcLO ; if so, negate result
01B8 0AAF incf ACCcLO ;
01B9 1903 btfsc STATUS,Z ;
01BA 03B0 decf ACCcHI ;
01BB 09B0 comf ACCcHI ;
01BC 1903 btfsc STATUS,Z ;
01BD 09AD comf ACCbLO ;
01BE 0AAD incf ACCbLO ;
01BF 1903 btfsc STATUS,Z ;
01C0 03AE decf ACCbHI ;
01C1 09AE comf ACCbHI ;
add_r_done: ;
01C2 3400 retlw 0 ; done
;
; Decimal Adjust Subroutine - used after each Q15 multiply to convert Q30 result
; to Q15 number
dec_adjust:
01C3 13B4 bcf sign,7 ; clear sign
01C4 1FAE btfss ACCbHI,7 ; test if number is negative
01C5 29D2 goto adjust ; go to adjust if not
01C6 17B4 bsf sign,7 ; set sign if negative
01C7 09AF comf ACCcLO ; and negate number
01C8 0AAF incf ACCcLO
01C9 1903 btfsc STATUS,Z
01CA 03B0 decf ACCcHI
01CB 09B0 comf ACCcHI
01CC 1903 btfsc STATUS,Z
01CD 09AD comf ACCbLO
01CE 0AAD incf ACCbLO
01CF 1903 btfsc STATUS,Z
01D0 03AE decf ACCbHI
01D1 09AE comf ACCbHI
adjust:
01D2 0DB0 rlf ACCcHI ; rotate ACC left 1 bit
01D3 0DAD rlf ACCbLO ;
01D4 0DAE rlf ACCbHI ;
01D5 1FB4 btfss sign,7 ; check if result should be negative
01D6 29DC goto adj_done ; if not, done
01D7 09AD comf ACCbLO ; if result negative, negate ACC
01D8 0AAD incf ACCbLO
01D9 1903 btfsc STATUS,Z
01DA 03AE decf ACCbHI
01DB 09AE comf ACCbHI
adj_done:
01DC 3400 retlw 0 ; done
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -