?? image.c
字號:
/*****************************************************************************
* File name : image.c
* Description:
******************************************************************************/
#include "image.h"
#include "math.h"
#include "edma.h"
#include "TIMER.h"
#include "C6711_INTR.C"
#include "C6711_EMIF.C"
#include "C6711_TIMER.C"
#include "edma.c"
#define MAX 0x7FFFFFFF
#define UINT volatile unsigned int
#define N 3 /*類別數 */
//#define Debug 1
double LCMDO_Addr[((N + 1) * N)/2];//紋理主方向類別共生矩陣地址LCM of Dominant Orientation of texture
double LCMV_Addr[((N + 1) * N)/2];//垂直方向類別共生矩陣地址LCM of Vertical Orientation
double LCMH_Addr[((N + 1) * N)/2];//水平方向類別共生矩陣地址LCM of Horizontal Orientation
/*******************************************************************************
* Function prototypes
*******************************************************************************/
void IPB_init(void);
unsigned char Feature_Extraction(unsigned char *Dst_Addr);//特征提取
/*******************************************************************************
* FUNCTION : main
* ARGUMENTS :void
*******************************************************************************/
unsigned char flage=0,flag9=0,flag8=0,flag6=0,infoflag=0;
unsigned char buffer_data0[4096]; //4096*32bit 是以雙字為單位的
unsigned char buffer_data1[4096];
unsigned char pci_cnt=0;
unsigned int framecnt=0,test_cnt=0;
unsigned char pci_flag=0;
unsigned char cal_cnt=0,pingpongflag=0;
unsigned char defectsign[32],defectsend[8];
/*通過pci傳遞的相機參數變量*/
unsigned int internal_clockfrq;
unsigned int internal_occupation;
unsigned int decoder_occupation;
unsigned int decode_param;
/*通過pci傳遞的算法參數變量*/
unsigned char Label;
unsigned char Orientations;
unsigned char Threasholds0;
unsigned char Threasholds1;
unsigned int MaxBDE[4];
unsigned int MaxWDE[4];
int DeltaX[4];
int DeltaY[4];
int StartX[4];
int StartY[4];
int EndX[4];
int EndY[4];
int Delta[4];
void test_led();
unsigned int temppci[25];
void main (void)
{
unsigned int i,j;
unsigned int Camarareg_baseraddr=0xB000FFC0;//相機寄存器設置
unsigned int Pci_baseaddr=0xA0004000; //pci起始地址
IPB_init();
test_led();
for(i=0;i<25;i++)
temppci[i]=(*(unsigned int *)(Pci_baseaddr+i*4));
/*get the parameter from pci d-sram*/
internal_clockfrq=temppci[0]; //曝光頻率
internal_occupation=temppci[1];//曝光 時間
decoder_occupation=temppci[2];
decode_param=temppci[3];
Label=(unsigned char)temppci[4];
Orientations=(unsigned char)temppci[5];
if(temppci[24]!=0x55AA) //初值判斷 說明參數不正確
{
Orientations=0;
decoder_occupation=0x900;
decode_param=0x538;
}
Threasholds0=(unsigned char)temppci[6];
Threasholds1=(unsigned char)temppci[7];
for(i = 0; i < Orientations; i ++)
{
MaxBDE[i]=(unsigned int)temppci[8+i];
MaxWDE[i]=(unsigned int)temppci[12+i];
DeltaX[i]=(int)temppci[16+i];
DeltaY[i]=(int)temppci[20+i];
StartX[i]=(DeltaX[i] > 0) ? 0 : -DeltaX[i];
StartY[i]=(DeltaY[i] > 0) ? 0 : -DeltaY[i];
EndX[i]=(DeltaX[i] > 0) ? 64-DeltaX[i] : 64;
EndY[i]=(DeltaY[i] > 0) ? 64-DeltaY[i] : 64;
Delta[i]=DeltaY[i]*64+DeltaX[i];
}
(*(unsigned int *)(Camarareg_baseraddr)) = internal_clockfrq;//0x00002000; //內部時鐘采樣頻率
(*(unsigned int *)(Camarareg_baseraddr+8)) = internal_occupation;//0x00000800; //內部時鐘占空比
(*(unsigned int *)(Camarareg_baseraddr+12)) = decoder_occupation;//0x0002000;//編碼器時鐘占空比
(*(unsigned int *)(Camarareg_baseraddr+16)) = decode_param;//0x00000538;//;//0-1:增益 3-4:0 8:選擇內外部時鐘,9-13:分頻比 14模擬數據
/*+16 reg: bit 6-8 選擇內外部時鐘 100-內部 其他外部bit 0-1 增益 11-4* 00-8* */
EDMA_init();//初始化EDMA
*(volatile unsigned int *) CIPR = 0xffff;
// ISTP=0x000;//中斷向量表重 定位
cal_cnt=0;
IER=0x4113;//打開中斷
while(1)//endless interation
{
if(flage)//flage is set to 1 in EDMA_Interrupt4() and set to 0 in the end of the required frame number
{
flage =0;
}
if(flag8) //向上位機器 發送信號 表示pci已經收到8偵數據
{
flag8=0;
}
//flag6=1;
if(flag6) //計算 怎么終止一次計算呢? 在退出循環的時候清調flag6
{
flag6=0;
test_cnt=0;
if(pingpongflag) //奇數
{
//led_blink2(0);//on
defectsign[cal_cnt]=Feature_Extraction(buffer_data1);
//led_blink2(1);//off
if((defectsign[cal_cnt])&&(cal_cnt>5)&&(cal_cnt<26))
*(unsigned int *)GPVAL &= 0xFFF7;
}
else //oushu
{
//led_blink2(0);//on 高電平
defectsign[cal_cnt]=Feature_Extraction(buffer_data0);
//led_blink2(1);//off
if((defectsign[cal_cnt])&&(cal_cnt>5)&&(cal_cnt<26))
*(unsigned int *)GPVAL &= 0xFFF7;
}
//在此處斷點 可能計算途中新的數據已經傳輸完畢覆蓋掉了label value
if(cal_cnt==30)
{
for(i=0;i<8;i++)
{
defectsend[i]=i;//設置計數器信息
for(j=0;j<4;j++)
{
defectsend[i]<<=1;//先移位
defectsend[i]+=defectsign[i*4+j]&0x01;
}
//defectsend[i]+=i*16;
}
*(unsigned int *)GPVAL |= 0x08;
}
//if(cal_cnt>=32)cal_cnt=0;
//在計算的時間段中edma6肯定傳輸完畢 為了防止錯誤的重新啟動計算
//有必要在推出計算循環的時候清掉此標志
//由于中斷里面每次開始新的計算循環的時候都將cal_cnt清零
//所以如果本循環能夠退出來的話說明計算在規定時間內完成了
// StartTimer();
// pci_cnt=*(unsigned volatile int *)TIMER0_COUNT;
}
}
}
/********使用CAche影響中斷**********/
void IPB_init()
{
/*Initiate CPU Registers*/
// CSR=0x109; /* disable all interrupts */
CSR=0x141; /*PCC=010 ennable Cache */
*(unsigned int *)CCFG=0x0007; /*CCFG L2MODE=010 32kcache +32ksram*/
*(unsigned int *)MAR0=0x0003; /*enable cache address 0x80000000*/
IER=1; /* disable all interrupts except NMI */
ICR=0xffff; /* clear all pending interrupts */
*(unsigned int *)GPEN|=0x08;//GPIO3 enable
*(unsigned int *)GPDIR|=0x08;//GPIO3 output
emif_init();
intr_init();
// // timer0_init(0x0200,0xffffffff)
}
//******************************************************
void test_led(void)
{
unsigned int test_ledadd1=0x1940000;//TIMER0_CTRL
unsigned int test_ledadd0=0x1980000;//TIMER1_CTRL
(*(unsigned int *)test_ledadd1)|=0x04; //on
// (*(unsigned int *)test_ledadd0)&=0x0B;
// for(i=0;i<0x3FFFFF;i++);
// (*(unsigned int *)test_ledadd1)|=0x04;
// for(i=0;i<0x3FFFFF;i++);
(*(unsigned int *)test_ledadd0)&=0x0B;//off
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -