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

📄 iopin.c

📁 图像直方图算法
💻 C
字号:
#include "ICETEK-C6713-A.h"
//////////////////////////////////////////////
// 1.在程序中"break point"注释行语句上加软件断点
// 2.看大图:菜单view->graph->Image:
//     color space                  = RGB
//     Start Address -R Source      = y
//     Start Address -G Source      = y
//     Start Address -B Source      = y
//     Lines Per Display            = 288
//     Pixels Per Line              = 720
//     Byte Packing to Fill 32 Bits = No
//     Image Origin                 = Top Left
// 3.看小图:菜单view->graph->Image:
//     color space                  = RGB
//     Start Address -R Source      = buffer
//     Start Address -G Source      = buffer
//     Start Address -B Source      = buffer
//     Lines Per Display            = 96
//     Pixels Per Line              = 120
//     Byte Packing to Fill 32 Bits = No
//     Image Origin                 = Top Left
// 4.按F5运行到断点可显示采集图像
// 5.转动摄像头后再按F5可再次采集
///////////////////////////////////////

#define IDKCCMDRESET 2
#define IDKCCMDCAPTURE 4
#define IDKCCMDRESETRP 8
#define IDKCCMDRESETWP 0x10
#define IDKCCMDCOLOR 0x20
#define IDKIMGREADY 2
#define IMAGEWIDTH 120
#define IMAGEHEIGHT 96

#define PLL_BASE_ADDR   0x01b7c000
#define PLL_PID         ( PLL_BASE_ADDR + 0x000 )
#define PLL_CSR         ( PLL_BASE_ADDR + 0x100 )
#define PLL_MULT        ( PLL_BASE_ADDR + 0x110 )
#define PLL_DIV0        ( PLL_BASE_ADDR + 0x114 )
#define PLL_DIV1        ( PLL_BASE_ADDR + 0x118 )
#define PLL_DIV2        ( PLL_BASE_ADDR + 0x11C )
#define PLL_DIV3        ( PLL_BASE_ADDR + 0x120 )
#define PLL_OSCDIV1     ( PLL_BASE_ADDR + 0x124 )
#define CSR_PLLEN          0x00000001
#define CSR_PLLPWRDN       0x00000002
#define CSR_PLLRST         0x00000008 
#define CSR_PLLSTABLE      0x00000040
#define DIV_ENABLE         0x00008000
float fHistogram[256];

void Delay(unsigned int nTime);	// 延时
void StartIIC(void);		// 启动I2C总线传输
void StopIIC(void);		// 停止I2C总线传输
void AckIIC(void);		
void WriteIIC(unsigned char data);	// 写字节数据到I2C总线
void Init5150(void);			// 初始化ICETEK-TVP5150-E
void DelayMSEC(unsigned int nDelay);	// 延时
void Close5150(void);			// 关闭ICETEK-TVP5150-E
void  init_pll( void );			// 设置DSP主频

unsigned char buffer[120*96],y[720*288];	// Y存放图象
void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto[256]);

main()
{
	int i,j,x,c1,c2,c3,xx,yy,uu,vv,xxx;
	float rr,gg,bb;
	unsigned int www=722,bGoodFrame,dbScanCode;
	int a,b,c,d,e,f,g,h;
	unsigned char uWork;

	init_emif();	// 初始化emif
    	InitCTR();		// 初始化ICETEK-CTR
	xx=1;
	for ( j=0;j<72;j++ )
		for ( i=0;i<90;i++ )
			y[j*90+i]=0;
	a=288;
	b=722;
	c=0;
	d=8;
	e=4;
	f=1;
	g=576;
	h=0;
	Init5150();	// 初始化ICETEK-TVP5150-E
	init_pll();
	
	while ( 1 )
	{
		if ( xx )
		{
			IDKCGR=IDKCCMDRESET; IDKCGR=0;	// 复位FIFO
			Delay(16);
			IDKCGR=IDKCCMDRESETWP;		// 复位FIFO写指针
			IDKCGR=IDKCCMDCAPTURE;		// 启动采集
			Delay(2560);
			IDKCGR=0;
			Delay(2560);
		}
		x=0;
		IDKCGR=IDKCCMDRESETRP;		// 复位FIFO读指针
		Delay(16);		
		IDKCGR=0;	
		Delay(16);		
		uWork=IDKCDATA;			// 读取首个数据并放弃
		Delay(16);		
		for ( i=0;i<724;i++ )	buffer[i]=0;
		for ( i=0;i<c;i++ )	buffer[i]=IDKCDATA;
		for ( j=0;j<a;j++ )		// 读取整幅图象722x288
		{
			for ( i=0;i<b;i++ )
			{
				y[j*720+i]=buffer[i]=IDKCDATA;
			}
		}
		// 将图象缩小后观察
		for ( j=0;j<288;j+=3 )
			for ( i=0;i<720;i+=6 )
				buffer[j/3*120+i/6]=y[j*720+i];
		xxx=IDKCSTATUS;
		Histogram(buffer,IMAGEWIDTH,IMAGEHEIGHT,fHistogram);
		x=0;	// BREAK POINT 在此设置软件断点
		x=0;
		x=0;
	}
	exit(0);
}               

void StartIIC(void)
{
	I2C_REG = 0x05;		/*	"00100101":sda,scl = '1' */
	DelayMSEC(1);
	I2C_REG = 0x04;		/*	"00100100":sda= '0',scl = '1' */
	DelayMSEC(1);
}
void StopIIC(void)
{	
	I2C_REG = 0x024;		/*	"00100101":sda = '0',scl = '1' */
	DelayMSEC(1);
	I2C_REG = 0x025;		/*	"00100101":sda,scl = '1' */
	DelayMSEC(1);
}		
void AckIIC(void)
{
	I2C_REG = 0x020;		/*	"00100101":sda='z',scl = '0' */
	I2C_REG = 0x022;		/*	"00100101":sda='z',scl = '0' */
	DelayMSEC(1);
	I2C_REG = 0x026;		/*	"00100101":sda='z',scl = '1' */
	DelayMSEC(1);
	I2C_REG = 0x022;		/*	"00100101":sda='z',scl = '0' */
	DelayMSEC(1);
	I2C_REG = 0x021;		/*	"00100101":sda='1',scl = '0' */
	DelayMSEC(1);
}	
void WriteIIC(unsigned char data)
{
	unsigned char BitCounter = 8;
	unsigned char Temp;
	unsigned int reg_val;
	
	reg_val = 0x020;
	I2C_REG = 0x20;		/*SCL 置低 sda 置低*/
	DelayMSEC(1);						/*延时*/
	do{
		Temp = data;
		reg_val &= 0x0fffffffb;
		I2C_REG = reg_val;		/*SCL 置低*/
		DelayMSEC(1);						/*延时*/
		
		if((Temp&0x80)==0x80)
			reg_val |= 0x01;	/*如果最高位是1*/
		else
			reg_val &= 0x0fffffe;
		I2C_REG = reg_val;		/*设置SDA*/
		DelayMSEC(1);						/*延时*/

		reg_val |= 0x004;
		I2C_REG = reg_val;		/*SCL 置高*/
		DelayMSEC(1);						/*延时*/

		Temp = data<<1;
		data = Temp;
		BitCounter --;
	}while(BitCounter);

	reg_val &= 0x0fffffffb;
	I2C_REG = reg_val;		/*SCL 置低*/
	DelayMSEC(3);						/*延时*/
}	

void Init5150(void)
{
	StartIIC();		
	WriteIIC(0x0ba);			
	AckIIC();
	WriteIIC(0x03);		// TVP5150控制寄存器3,取值0x8F
	AckIIC();
	WriteIIC(0x08f);
	AckIIC();
	StopIIC();
	DelayMSEC(10);
}

void DelayMSEC(unsigned int nDelay)
{
	unsigned int i,k;
	
	for ( i=0;i<nDelay*64;i++ )
	{
//		for ( j=0;j<6144;j++ )
			k++;

	}
}

void  init_pll( void )
{
    *(int *)PLL_CSR  &= ~CSR_PLLEN;		// Enable PLL
    *(int *)PLL_CSR  |= CSR_PLLRST;		// Asserts RESET to PLL
    *(int *)PLL_DIV0    = DIV_ENABLE + 0;  // div0 enable
    *(int *)PLL_MULT    = 4;//8;			// 25MHz×8=200MHz               
    *(int *)PLL_OSCDIV1 = DIV_ENABLE + 4;
    *(int *)PLL_DIV3    = DIV_ENABLE + 3; 
    *(int *)PLL_DIV2    = DIV_ENABLE + 3; 
    *(int *)PLL_DIV1    = DIV_ENABLE + 1; 
    *(int *)PLL_CSR  &= ~CSR_PLLRST;
    *(int *)PLL_CSR |= CSR_PLLEN;

}

void Histogram(unsigned char *pImage,int nWidth,int nHeight,float fHisto[256])
{
   int i,j;
   unsigned int uWork;
   unsigned char *pWork;
   
	for ( i=0;i<256;i++ )	fHisto[i]=0.0f;
	pWork=pImage;
	for ( i=0;i<nHeight;i++ )
	{  
		for ( j=0;j<nWidth;j++,pWork++ )
		{
			uWork=(unsigned int)(*pWork);
			fHisto[uWork]++;
		}
	}
	uWork=nWidth*nHeight;
    for ( i=0;i<256;i++ )
    {
    	fHisto[i]/=uWork;
    	fHisto[i]*=100;
    }
}
/* END OF FILE */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -