?? chap15.c
字號:
// Chapter 15 6811 C programs// Jonathan W. Valvano// This software accompanies the book,// Embedded Microcomputer Systems: Real Time Interfacing// published by Brooks Cole, 1999// Program 15.1. Real time data acquisition with a simple digital filter, Equation 2.// MC68HC11A8#define Rate 2000#define OC5 0x08 #pragma interrupt_handler TOC5handler()void TOC5handler(void){ TFLG1=OC5; // Ack interrupt TOC5=TOC5+Rate; // Executed every 1 ms x[1]=x[0]; // shift MACQ data x[0] = A2D(channel); // new data y=(x[0]+x[1])>>1;} void ritual(void) { asm(" sei"); // make atomic TMSK1|=OC5; // Arm output compare 5 x[0] = x[1] = 0; TFLG1=OC5; // Initially clear OC5F TOC5=TCNT+Rate; // First one in 1 msasm(" cli"); }// Program 15.2. Real time data acquisition with a simple digital filter, Equation 3.// MC68HC11A8#define OC5 0x08 #pragma interrupt_handler TOC5handler()void TOC5handler(void){ unsigned int i; TFLG1=OC5; // Ack interrupt TOC5=TOC5+5556; // fs=360Hz for(i=5;i>0;i++) x[i]=x[i-1]; // shift MACQ data x[0] = A2D(channel); // new data y=(x[0]+x[1]+x[2]+x[3]+x[4]+x[5])/6;} void ritual(void) { asm(" sei"); // make atomic TMSK1|=OC5; // Arm output compare 5 x[0]=x[1]=x[2]=x[3]=x[4]=x[5]=0; TFLG1=OC5; // Initially clear OC5F TOC5=TCNT+5556; asm(" cli"); }// Program 15.3. Real time data acquisition with a simple digital filter, Equation 4.// MC68HC11A8#define OC5 0x08 #pragma interrupt_handler TOC5handler()void TOC5handler(void){ TFLG1=OC5; // Ack interrupt TOC5=TOC5+5556; // fs=360Hz x[3]=x[2]; // shift MACQ data x[2]=x[1]; x[1]=x[0]; x[0] = A2D(channel); // new data y=(x[0]+x[3])>>1;} void ritual(void) { asm(" sei"); // make atomic TMSK1|=OC5; // Arm output compare 5 x[0]=x[1]=x[2]=x[3]=0; TFLG1=OC5; // Initially clear OC5F TOC5=TCNT+5556; asm(" cli"); } // Program 15.4. Compiler listings for the filter implementation.; MC68HC11A8, ICC11; y=(x[0]+x[3])>>1; ldy #1 pshy ldab _x+3 ; 8-bit x[3] clra ; promote into RegD pshb ; save on stack psha ldab _x ; 8 bit x[0] clra ; promote into RegD tsy addd 0,y ; 16-bit x[0]+x[3] puly puly jsr __asrd ; 16-bit shift stab _y ; demote to 8 bit// Program 15.5. Real time data acquisition with a simple digital filter, Equation 5.// MC68HC11A8#define Rate 2000#define OC5 0x08 #pragma interrupt_handler TOC5handler()void TOC5handler(void){ TFLG1=OC5; // Ack interrupt TOC5=TOC5+Rate; // Executed at fs y[1]=y[0]; // shift MACQ data x = A2D(channel); // new data y[0]=(x+y[1])>>1;} // 16-bit void ritual(void) { asm(" sei"); // make atomic TMSK1|=OC5; // Arm output compare 5 y[0] = y[1] = 0; TFLG1=OC5; // Initially clear OC5F TOC5=TCNT+Rate; // First one in 1 msasm(" cli"); }// Program 15.6: The median filter is an example of a nonlinear filter.unsigned char Median(unsigned char u1,unsigned char u2,unsigned char u3){ unsigned char result; if(u1>u2) if(u2>u3) result=u2; // u1>u2,u2>u3 u1>u2>u3 else if(u1>u3) result=u3; // u1>u2,u3>u2,u1>u3 u1>u3>u2 else result=u1; // u1>u2,u3>u2,u3>u1 u3>u1>u2 else if(u3>u2) result=u2; // u2>u1,u3>u2 u3>u2>u1 else if(u1>u3) result=u3; // u2>u1,u2>u3,u1>u3 u2>u1>u3 else result=u1; // u2>u1,u2>u3,u3>u1 u2>u3>u1 return(result):}unsigned char x[3],y; // x[0] is x(n) the current sample// x[1] is x(n-1) the sample 1/fs ago// x[2] is x(n-2) the sample 2/fs agovoid sample(void){ x[2]=x[1]; // shift MACQ data x[1]=x[0]; x[0] = A2D(0); // new data from channel 0 y=median(x[0],x[1],x[2]); // Program 15.7. Real time data acquisition with a 60 Hz notch digital filter, Equation 58.// MC68HC11A8#define OC5 0x08 #pragma interrupt_handler TOC5handler()void TOC5handler(void){ TFLG1=OC5; // Ack interrupt TOC5=TOC5+8333; // fs=240Hz y[2]=y[1]; y[1]=y[0]; // shift MACQ x[2]=x[1]; x[1]=x[0]; x[0] = A2D(channel); // new data y[0]=(113*(x[0]+x[2])-98*y[2])>>7;} void ritual(void) { asm(" sei"); // make atomic TMSK1|=OC5; // Arm output compare 5 y[0]=y[1]=y[2]=x[0]=x[1]=x[2]=0; TFLG1=OC5; // Initially clear OC5F TOC5=TCNT+8333; asm(" cli"); }
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -