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

📄 fir.c

📁 ICETEK-VC5416-EDULab瑞泰创新科技5416开发板的实验源程序
💻 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 + -