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

📄 notch_60.lst

📁 pic16c6x和pic16c7xxx都可以通用
💻 LST
📖 第 1 页 / 共 5 页
字号:
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 + -