📄 fir.c
字号:
/////////////////////////////////////////////////
// Example For ICETEK-VC5416-EDU //
// CTR Version : V4 //
// Filename: Fir.c //
// Project : Fir.pjt //
// Version : 2.00 //
// Write by: Daniel Hawk //
// Company : Realtimedsp Co.Ltd. //
// //
// All Rights opened & no Onus 2005.06 //
/////////////////////////////////////////////////
#include <math.h>
#define TIM *(int *)0x24
#define PRD *(int *)0x25
#define TCR *(int *)0x26
#define IMR *(int *)0x0
#define IFR *(int *)0x1
#define PMST *(int *)0x1d
#define REGISTERCLKMD *(int *)0x58
ioport unsigned int port2,port3,port4;
#define AD_DATA port2
#define AD_SEL port3
#define AD_HOLD port4
void interrupt time(void);
int *ptr,k0,k1;
signed int uWork0,uWork,uWork1;
unsigned int nCount;
int *nADC0;
#pragma DATA_SECTION(mix,".image")
int mix[256];
int kk=0;
int kkk=0;
#define FIRNUMBER 64
#define SIGNAL1F 1000
#define SIGNAL2F 4500
#define SAMPLEF 10000
#define PI 3.1415926
float InputWave();
float FIR();
float fHn[FIRNUMBER]={
-0.00003439,-0.00012393,-0.00024141,-0.00035107,-0.00040971,-0.00036807,-0.00017269,0.00023201,0.00090143,
0.00188829, 0.00324021,0.00499726,0.00718971,0.00983610,0.01294158,0.01649678,0.02047707,0.02484246,0.02953799,
0.03449473,0.03963128,0.04485582,0.05006853,0.05516443,0.06003642,0.06457854,0.06868920,0.07227434,0.07525045,
0.07754723,0.07910984,0.07990069,0.07990069,0.07910984,0.07754723,0.07525045,0.07227434,0.06868920,0.06457854,0.06003642,
0.05516443,0.05006853,0.04485582,0.03963128,0.03449473,0.02953799,0.02484246,0.02047707,0.01649678,0.01294158,0.00983610,
0.00718971,0.00499726,0.00324021,0.00188829,0.00090143,0.00023201,-0.00017269,-0.00036807,-0.00040971,-0.00035107,
-0.00024141,-0.00012393,-0.00003439
};
float fXn[FIRNUMBER]={ 0.0 };
float fInput,fOutput;
float fSignal1,fSignal2;
float fStepSignal1,fStepSignal2;
float f2PI;
int i;
float fIn[256],fOut[256];
int nIn,nOut;
int flage=0;
main()
{
int i,j;
asm(" ssbx INTM"); // 关闭可屏蔽中断
*(int *)0x58=0x0;
asm(" nop");
asm(" nop");
*(int *)0x58=0x9007; // DSP主频改为=160MHz
k0=k1=0;
ptr=(int *)0x3000; // 转换数据的保存区,从数据区3000H开始
// 3000H-3200H保存第1通道(AIN1)的转换结果
// 3200H-3400H保存第2通道(AIN2)的转换结果
for(i=0;i<0x400;i++) // 将转换数据的保存区清0
*(ptr+i)=0;
j= PMST;
PMST = j&0xff;
IMR = 0x8;
TCR = 0x417; // 计数器分频系数=8
TIM = 8;
// PRD = 0x27;
PRD = 0x018f;
TCR = 0x427; // 427
IFR = 0x100; // 其中,时钟周期为8MHz
AD_SEL=6; // 通道选择 A0,A1
nADC0=(int *)0x3000;
asm(" rsbx INTM"); // 开中断进行转换
nIn=0; nOut=0;
f2PI=2*PI;
fSignal1=0.0;
fSignal2=PI*0.1;
fStepSignal1=2*PI/30;
fStepSignal2=2*PI*1.4;
while ( 1 )
{
if(flage==1)
{
//flage=0;
fInput=InputWave();
fIn[nIn]=fInput;
nIn++; nIn%=256;
fOutput=FIR();
fOut[nOut]=fOutput;
nOut++;
if ( nOut>=256 )
{
nOut=0; //在此加软件断点
}
}
}
}
float InputWave()
{
for ( i=FIRNUMBER-1;i>0;i-- )
fXn[i]=fXn[i-1];
fXn[0]=mix[kkk];
kkk++;
if ( kkk>=0x200 )
{
kkk=0;
flage=0;
}
return(fXn[0]);
}
float FIR()
{
float fSum;
fSum=0;
for ( i=0;i<FIRNUMBER;i++ )
{
fSum+=(fXn[i]*fHn[i]);
}
return(fSum);
}
// 定时器中断服务程序,完成:保存转换结果、启动下次转换
void interrupt time(void)
{
if(flage==0)
{
AD_HOLD =0; // 送转换信号
for ( uWork=0;uWork<10;uWork++ );
AD_HOLD=1;
uWork0=AD_DATA; // 从FIFO中读取转换结果
uWork1=AD_DATA; // 从FIFO中读取转换结果
uWork=uWork0&0x0f000;
if ( uWork==0x8000 )
{
uWork0<<=4; // 去掉高4位
uWork0>>=4; // 取低4位有效值
*(ptr+k0)=uWork0; // 保存结果
k0++;
if ( k0>=0x200 )
{
k0=0;
}
}
else if ( uWork==0x9000 )
{
uWork0<<=4; // 去掉高4位
uWork0>>=4; // 取低4位有效值
*(ptr+k1+0x200)=uWork0; // 保存结果
k1++; k1%=0x200;
}
uWork=uWork1&0x0f000;
if ( uWork==0x8000 )
{
uWork1<<=4; // 去掉高4位
uWork1>>=4; // 取低4位有效值
*(ptr+k0)=uWork1; // 保存结果
k0++;
if ( k0>=0x200 )
{
k0=0;
}
}
else if ( uWork==0x9000 )
{
uWork1<<=4; // 去掉高4位
uWork1>>=4; // 取低4位有效值
*(ptr+k1+0x200)=uWork1; // 保存结果
k1++;
if ( k1>=0x200 )
{
k1=0;
}
}
mix[kk]=(*(ptr+kk)+*(ptr+kk+0x200))/2;
kk++;
if ( kk>=0x200 )
{
kk=0;
flage=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -