中级会员
- 积分
- 455
- 威望
- 306
- 贡献
- 83
- 兑换币
- 0
- 注册时间
- 2010-6-24
- 在线时间
- 33 小时
|
虚心学习的:
void vPLLInit(void)//锁相环初始化
{ //BUS-CLOCK=PLL-CLOCK/2=32M
REFDV = 1; // set the REFDV register 16M*2*(3+1)/(1+1)=64M
SYNR =3; // set the SYNR register to give us a 64 MHz PLL-clock.
asm nop // nops required for PLL stability.
asm nop
asm nop
asm nop
while ((CRGFLG&0x08)==0); // wait here till the PLL is locked.
CLKSEL|=0x80; // switch the bus clock to the PLL.
}
设置总线时钟为32M
void vECTInit(void)//定时器初始化
{
TIOS =0x00; //设为输入捕捉
TSCR1=0x80; //定时器使能
TSCR2=0x83; //允许定时器溢出中断,定时器时钟32M/(2^3)=4M
TCTL4=0xAA; //触发电平:下降沿
TIE =0x07; //开中断
TFLG1=0xFF; //清除中断标志
}
输入捕捉的1,2通道接行场中断。
void vADInit(void)//AD转换初始化程序
{
//ATD1设置
//上电,标志位快速清零,忽略外部触发,执行一次停止,中断禁止。
ATD1CTL2 = (ATD1CTL2_AFFC_MASK | ATD1CTL2_ADPU_MASK);
//转换序列长度为1,FIFO模式,Freeze模式下继续转换。|ATD0CTL3_FIFO_MASK
ATD1CTL3 = (ATD1CTL3_S1C_MASK);
//8位精度,2AD采样周期,采样长度8。
//ATDClock=[BusClock*0.5]/[PRS+1] ; PRS=15, divider=32
ATD1CTL4 =(ATD1CTL4_SRES8_MASK|ATD1CTL4_PRS0_MASK);
//右对齐无符号,扫描模式连续采样,单通道采样//多通道采样|ATD0CTL5_MULT_MASK。
ATD1CTL5 = (ATD1CTL5_DJM_MASK|ATD1CTL5_SCAN_MASK);
//禁止数字输入缓冲
ATD1DIEN=0x00;
}
ATD1的0通道用于AD转换
下面是真正的图像采集程序
//当前采样图像的行和列。
unsigned int ui_SampleRow=0,ui_SampleColumn=0;
//图像数据缓存
unsigned char uca_Buffer1[IMAGE_ROW][IMAGE_COLUMN];
unsigned char uca_Buffer2[IMAGE_ROW][IMAGE_COLUMN];
//指向当前采集数据采样缓存首地址的指针
unsigned char *puca_BufferSample=&uca_Buffer1[0][0];
//指向当前处理数据采样缓存首地址的指针
unsigned char *puca_BufferProcess=&uca_Buffer2[0][0];
//用于图像采集和处理交换缓存。(注意:在每次交换指针后保证puca_BufferTemp与puca_BufferSample相同)
unsigned char *puca_BufferTemp=&uca_Buffer1[0][0];
#pragma CODE_SEG NON_BANKED
//输入捕捉2通道中断函数,行同步 ,用于数据采集。
void interrupt 10 vIC2ISR(void)
{
unsigned char ucTemp;
unsigned char *pucTemp;
TFLG1_C2F=1;
if(ui_SampleRow>=SAMP_ROW_START&&ui_SampleRow<SAMP_ROW_MAX)
{
if(ui_SampleRow%SAMP_ROW_SEP==0)
{
for(ui_SampleColumn=0;ui_SampleColumn<SAMP_COL_MAX;ui_SampleColumn++)
{
while(!ATD1STAT1_CCF0);
if(ui_SampleColumn>=SAMP_COL_START)
{
if(ui_SampleColumn%SAMP_COL_SEP==0)
{
pucTemp=puca_BufferSample
+((ui_SampleRow-SAMP_ROW_START)/SAMP_ROW_SEP)*IMAGE_COLUMN
+(ui_SampleColumn-SAMP_COL_START)/SAMP_COL_SEP;
*pucTemp=ATD1DR0L;
}
}
}
}
}
ucTemp=ATD1DR0L;
ui_SampleRow++; //采样行坐标加一。
}
//输入捕捉1通道中断函数,场同步,交换缓存以及图像处理和模型车控制。
void interrupt 9 vIC1ISR(void)
{
TFLG1_C1F=1;
ui_SampleRow=0; //把采样行坐标清零。
ui_SampleColumn=0;
//交换图像采集和处理缓存
puca_BufferSample=puca_BufferProcess;
puca_BufferProcess=puca_BufferTemp;
puca_BufferTemp=puca_BufferSample;
//系统时间加一。
ul_SystemTime+=1;
//开中断,允许行信号中断进行采样。
EnableInterrupts;
if(uc_CarState==STATE_START)
{
// PORTB_BIT1=1;
//分析图像,获取路径参数,根据路径参数控制模型车。。
vImageProcess();
//根据路径参数控制模型车。
vAutoControl();
// PORTB_BIT1=0;
}
} |
|