中级会员
- 积分
- 247
- 威望
- 191
- 贡献
- 32
- 兑换币
- 0
- 注册时间
- 2010-10-15
- 在线时间
- 12 小时
|
我刚开始学单片机,最近在写CCD摄像头图像采集的程序,用的是片内AD,写了段代码有问题,希望有高手看看,指点一下,程序中还应注意什么问题?、?
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
uchar image[62][20]; //采集62行,20列
uchar row=0,column=0,rowcount=0; //行数,列数
//uchar count=0; //定时器计数
void clock_init(void){
CLKSEL=0X00;
PLLCTL_PLLON=1; //锁相环电路使能
REFDV=1;
SYNR=2; //总线频率=16M*(SYNR+1)/(REFDV+1)=24M
while(!(CRGFLG & 0x08)); //等待VCO达到稳定
CLKSEL=0x80; //打开PLL,选定锁相环时钟
}
void peh_init(void){ //中断初始化,PE1接行中断,PH1接场中断
DDRH=0x00; //设置H口为输入
PERH=0xff; //上拉使能寄存器
PPSH=0xff; //极性选择寄存器上升沿触发
PIEH=0xff; //中断使能寄存器
PIFH=0xff; //清除中断标志位
IRQCR_IRQEN=1; //中断使能
IRQCR_IRQE=1; //下降沿触发
}
void ad_init(void){
ATD0CTL1=0x00; //7:1-外部触发,8位精度,采样前不放电
ATD0CTL2=0x40; //自动清零,禁止外部触发, 禁止中断
ATD0CTL3=0xE0; //右对齐无符号(ATD0DR0H),转换序列长度为12,没有映射,冻结模式下继续转换
ATD0CTL4=0x05; //采样时间为4个AD时钟周期,PRS=2,ATDClock=Bus/2*[PRS+1]=48/12=4mhz,
ATD0CTL5=0x30; //单次AD转换模式,单通道AD转换,转换通道:AD0
ATD0DIEN=0x00; //禁止数字输入
}
void main(void){
clock_init();
peh_init();
ad_init();
row=0; //行计数清零
column=0; //列计数清零
EnableInterrupts;
for(;;) {
_FEED_COP(); /* feeds the dog */
} /* loop forever */
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区
interrupt 25 void ISR_VS(void){ //PH1场中断
row=0;
rowcount=0;
IRQCR_IRQEN=1; //行中断使能
PIFH=0xff; //清除场中断标志位
PPSH=~PPSH; //从上升沿触发改为下降沿触发
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED //指示该程序在不分页区
interrupt 6 void ISR_HS(void){ //PE1行中断
IRQCR_IRQEN=0; //关闭行中断
rowcount++; //行数加1
if(rowcount%5==0){ //每隔5行采一次数据
/* PITCFLMT_PITE=1; //定时中断通道0使能
while(!(count==2)); //等待行消隐信号结束,4*2.5us=10us
count=0;
PITCFLMT_PITE=0; //定时器通道0关 */
for(column=0;column<20;column++){ //一行采20个点
ATD0CTL5 = 0x30; //开始一次新的转换
while(!ATD0STAT0_SCF); //等待AD0转换结束
image[row][column]=ATD0DR0L;
}
row++;
}
IRQCR_IRQEN=1; //行中断使能
} |
|