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

📄 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 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
#define IMAGEWIDTH 120
#define IMAGEHEIGHT 96

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主频
void Sobel(int nWidth,int nHeight);

unsigned char buffer[120*96],y[720*288];	// Y存放图象


//extern unsigned char dbImage[IMAGEWIDTH*IMAGEHEIGHT];
unsigned char dbTargetImage[IMAGEWIDTH*IMAGEHEIGHT];


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;
		Sobel(IMAGEWIDTH,IMAGEHEIGHT);
		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 Sobel(int nWidth,int nHeight)
{
	int i;
	int mi,mj,m_nWork1,m_nWork2;
	unsigned int m_nWork,*pWork;
	unsigned char *pImg1,*pImg2,*pImg3,*pImg;
	unsigned int x1,x2,x3,x4,x5,x6,x7,x8,x9;

	pImg=dbTargetImage;
	for ( i=0;i<IMAGEWIDTH;i++,pImg++ )
		(*pImg)=0;
	(*pImg)=0;
	pImg1=buffer;
	pImg2=pImg1+IMAGEWIDTH;
	pImg3=pImg2+IMAGEWIDTH;
	for ( i=2;i<nHeight;i++ )
	{
		pImg++;
		x1=(*pImg1); pImg1++; x2=(*pImg1); pImg1++;
		x4=(*pImg2); pImg2++; x5=(*pImg2); pImg2++;
		x7=(*pImg3); pImg3++; x8=(*pImg3); pImg3++;
		for ( mi=2;mi<nWidth;mi++,pImg++,pImg1++,pImg2++,pImg3++ )
		{
			x3=(*pImg1); x6=(*pImg2); x9=(*pImg3);
			m_nWork1=x7+x8+x8-x2-x2-x3;
			m_nWork2=x3+x6+x6-x4-x4-x7;
			if ( m_nWork1<m_nWork2 )
				m_nWork1=m_nWork2;
			m_nWork2=m_nWork1+x9-x1;
			if ( m_nWork2>255 )	m_nWork2=255;
			else if ( m_nWork2<0 )	m_nWork2=0;
			(*pImg)=m_nWork2;
			x1=x2; x2=x3;
			x4=x5; x5=x6;
			x7=x8; x8=x9;
		}
		(*pImg)=0; pImg++;
	}
}

/* END OF FILE */

⌨️ 快捷键说明

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