📄 notch_60.lst
字号:
MPC "C" COMPILER BC.193 22-Aug-1995 PAGE 14
;
; Output Scaling Routine - used to scale output samples by factors of
; 2, 4, or 8 at end of filter routine
;
scale_y_n:
01DD 13B4 bcf sign,7 ; clear sign,7
01DE 1FB7 btfss y_n+1,7 ; test if y(n) negative
01DF 29E6 goto start_scale ; go to start_scale if not
01E0 17B4 bsf sign,7 ; set sign,7 if negative
01E1 09B6 comf y_n ; and compliment y(n)
01E2 0AB6 incf y_n ;
01E3 1903 btfsc STATUS,Z ;
01E4 03B7 decf y_n+1 ;
01E5 09B7 comf y_n+1 ;
start_scale:
01E6 1003 bcf STATUS,C ; clear carry
01E7 0DB7 rlf y_n+1 ; and rotate y(n) left
01E8 0DB6 rlf y_n ;
01E9 1003 bcf STATUS,C ;
01EA 0DB7 rlf y_n+1 ;
01EB 0DB6 rlf y_n ;
01EC 1003 bcf STATUS,C ;
01ED 0DB7 rlf y_n+1 ;
01EE 0DB6 rlf y_n ;
01EF 1FB4 btfss sign,7 ; test if result is negative
01F0 29F6 goto scale_y_done ; go to scale_y_done if not
01F1 09B6 comf y_n ; negate y(n) if result is negative
01F2 0AB6 incf y_n ;
01F3 1903 btfsc STATUS,Z ;
01F4 03B7 decf y_n+1 ;
01F5 09B7 comf y_n+1 ;
scale_y_done:
01F6 3400 retlw 0 ; done
#endasm
/******************************************************************************
* Filter function - filter takes current input sample, x(n), and outputs next
* output sample, y(n).
*
* usage:
* - write sample to be filtered to x_n
* - call filter()
* - output is in MSB of y_n (y_n=MSB, y_n+1=LSB)
*
******************************************************************************/
void filter(){
#asm
01F7 01B6 clrf y_n ; clear y(n) before starting
MPC "C" COMPILER BC.193 22-Aug-1995 PAGE 15
01F8 01B7 clrf y_n+1 ;
01F9 01AD clrf ACCbLO ; move x(n) to ACCbHI
01FA 0835 movf x_n,W ; (scale 8 bit - 16 bit input)
01FB 00AE movwf ACCbHI ;
01FC 3018 movlw B0_H ; get coefficient b0
01FD 00AC movwf ACCaHI ; y(n)=b0*x(n)
01FE 30BB movlw B0_L ;
01FF 00AB movwf ACCaLO ;
0200 2089 call D_mpyF ;
0201 0830 movf ACCcHI,W ; save remainder from multiply
0202 00C2 movwf rmndr_h ;
0203 082F movf ACCcLO,W ;
0204 00C3 movwf rmndr_l ;
0205 21C3 call dec_adjust ;
0206 082E movf ACCbHI,W ;
0207 00B7 movwf y_n+1 ;
0208 082D movf ACCbLO,W ;
0209 00B6 movwf y_n ;
020A 30D2 movlw B1_H ; get coefficient b1
020B 00AC movwf ACCaHI ; y(n)=y(n)+b1*x(n-1)
020C 3008 movlw B1_L ;
020D 00AB movwf ACCaLO ;
020E 083B movf x_n_1+1,W ;
020F 00AE movwf ACCbHI ;
0210 083A movf x_n_1,W ;
0211 00AD movwf ACCbLO ;
0212 2089 call D_mpyF ;
0213 21A0 call add_rmndr ; add in remainder from previous multiply
0214 0830 movf ACCcHI,W ; and save new remainder
0215 00C2 movwf rmndr_h ;
0216 082F movf ACCcLO,W ;
0217 00C3 movwf rmndr_l ;
0218 21C3 call dec_adjust ;
0219 0837 movf y_n+1,W ;
021A 00AC movwf ACCaHI ;
021B 0836 movf y_n,W ;
021C 00AB movwf ACCaLO ;
021D 207C call D_add ;
021E 082E movf ACCbHI,W ;
021F 00B7 movwf y_n+1 ;
0220 082D movf ACCbLO,W ;
0221 00B6 movwf y_n ;
0222 3018 movlw B2_H ; get coefficient b2
0223 00AC movwf ACCaHI ; y(n)=y(n)+b2*x(n-2)
0224 30B9 movlw B2_L ;
0225 00AB movwf ACCaLO ;
0226 083D movf x_n_2+1,W ;
0227 00AE movwf ACCbHI ;
0228 083C movf x_n_2,W ;
0229 00AD movwf ACCbLO ;
022A 2089 call D_mpyF ;
MPC "C" COMPILER BC.193 22-Aug-1995 PAGE 16
022B 21A0 call add_rmndr ; add in remainder from previous multiply
022C 0830 movf ACCcHI,W ; and save new remainder
022D 00C2 movwf rmndr_h ;
022E 082F movf ACCcLO,W ;
022F 00C3 movwf rmndr_l ;
0230 21C3 call dec_adjust ;
0231 0837 movf y_n+1,W ;
0232 00AC movwf ACCaHI ;
0233 0836 movf y_n,W ;
0234 00AB movwf ACCaLO ;
0235 207C call D_add ;
0236 082E movf ACCbHI,W ;
0237 00B7 movwf y_n+1 ;
0238 082D movf ACCbLO,W ;
0239 00B6 movwf y_n ;
023A 30D2 movlw A1_H ; get coefficient a1
023B 00AC movwf ACCaHI ; y(n)=y(n)+a1*y(n-1)
023C 3008 movlw A1_L ;
023D 00AB movwf ACCaLO ;
023E 083F movf y_n_1+1,W ;
023F 00AE movwf ACCbHI ;
0240 083E movf y_n_1,W ;
0241 00AD movwf ACCbLO ;
0242 2089 call D_mpyF ;
0243 21A0 call add_rmndr ; add in remainder from previous multiply
0244 0830 movf ACCcHI,W ; and save new remainder
0245 00C2 movwf rmndr_h ;
0246 082F movf ACCcLO,W ;
0247 00C3 movwf rmndr_l ;
0248 21C3 call dec_adjust ;
0249 0837 movf y_n+1,W ;
024A 00AC movwf ACCaHI ;
024B 0836 movf y_n,W ;
024C 00AB movwf ACCaLO ;
024D 207B call D_sub ;
024E 082E movf ACCbHI,W ;
024F 00B7 movwf y_n+1 ;
0250 082D movf ACCbLO,W ;
0251 00B6 movwf y_n ;
0252 3011 movlw A2_H ; get coefficient a2
0253 00AC movwf ACCaHI ; y(n)=y(n)+a2*y(n-2)
0254 3071 movlw A2_L ;
0255 00AB movwf ACCaLO ;
0256 0841 movf y_n_2+1,W ;
0257 00AE movwf ACCbHI ;
0258 0840 movf y_n_2,W ;
0259 00AD movwf ACCbLO ;
025A 2089 call D_mpyF ;
025B 21A0 call add_rmndr ;
025C 21C3 call dec_adjust ;
025D 0837 movf y_n+1,W ;
025E 00AC movwf ACCaHI ;
025F 0836 movf y_n,W ;
MPC "C" COMPILER BC.193 22-Aug-1995 PAGE 17
0260 00AB movwf ACCaLO ;
0261 207B call D_sub ;
0262 082E movf ACCbHI,W ;
0263 00B7 movwf y_n+1 ;
0264 082D movf ACCbLO,W ;
0265 00B6 movwf y_n ;
0266 083A movf x_n_1,W ; x(n-2)=x(n-1)
0267 00BC movwf x_n_2 ;
0268 083B movf x_n_1+1,W ;
0269 00BD movwf x_n_2+1 ;
026A 0835 movf x_n,W ; x(n-1)=x(n)
026B 00BB movwf x_n_1+1 ;
026C 01BA clrf x_n_1 ;
026D 083E movf y_n_1,W ; y(n-2)=y(n-1)
026E 00C0 movwf y_n_2 ;
026F 083F movf y_n_1+1,W ;
0270 00C1 movwf y_n_2+1 ;
0271 0836 movf y_n,W ; y(n-1)=y(n)
0272 00BE movwf y_n_1 ;
0273 0837 movf y_n+1,W ;
0274 00BF movwf y_n_1+1 ;
0275 21DD call scale_y_n ;
0276 0837 movf y_n+1,W ; shift lsb of y_n to msb
0277 00B6 movwf y_n ;
#endasm
0278 0008 RETURN }
0001 #define FILTER 1
/* Function Prototypes */
void main_isr();
void timer0_isr();
/*****************************************************************************
* main isr - 16C74 vectors to 0004h (MPC __INT() function) on any interrupt *
* assembly language routine saves W and Status registers then tests flags in
* INTCON to determine source of interrupt. Routine then calls appropriate isr.
* Restores W and status registers when done.
*****************************************************************************/
0004 2A79 GOTO 0279h void __INT(void)
0279 {
0279 118A BCF PCLATH,3 if(INTCON.T0IF){ /* timer 0 interrupt ? */
027A 1D0B BTFSS INTCON,T0IF
027B 2A7E GOTO 027Eh
027C 110B BCF INTCON,T0IF INTCON.T0IF=0; /* clear interrupt flag */
027D 228A CALL 028Ah timer0_isr(); /* and call timer 0 isr */
}
MPC "C" COMPILER BC.193 22-Aug-1995 PAGE 18
/* Restore W, WImage, and STATUS registers */
#asm
027E 1283 BCF STATUS,RP0 ;Bank 0
027F 0825 MOVF temp_PCLATH, W
0280 008A MOVWF PCLATH ;PCLATH restored
0281 0822 MOVF temp_WImage, W
0282 00A1 MOVWF __WImage ;__WImage restored
0283 0824 MOVF temp_FSR, W
0284 0084 MOVWF FSR ;FSR restored
0285 0E23 SWAPF temp_STATUS,W
0286 0083 MOVWF STATUS ;RP0 restored
0287 0EA0 SWAPF temp_WREG,F
0288 0E20 SWAPF temp_WREG,W ;W restored
#endasm
0289 0009 RETFIE }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -