智能车制作
标题:
赐教。。一帧图像被截成了两段。。。
[打印本页]
作者:
iven
时间:
2010-5-23 22:57
标题:
赐教。。一帧图像被截成了两段。。。
本帖最后由 iven 于 2010-5-23 23:08 编辑
这是一帧图片,很奇怪的是被中间的东西隔开了,一旦被隔开,下面的部分就是重新开始的部分,而隔开的上半部分是结束的部分。
初步怀疑是场消隐,如果是这个问题,该怎么办呢?
附上场中断和行中断代码:是不是这个有问题?
//+++++++++++++++行中断函数+++++++++++//
#pragma CODE_SEG NON_BANKED
void interrupt 10 Timer2_cow(void) //行中断
{
unsigned char time;
TFLG1_C2F=1; //清行中断标志位
hang_flag++;
x++;//行
if((x>=18)&&(x<=270)&&(x%9==0))
{
AD_Init() ;
for(time=0;time<110;time++); //行消隐
for(y=0;y<IMG_COLUMN;y++)
{
while(!ATD0STAT0_SCF);
imageBuffer[z][y]= ATD0DR0L; //开始采集
}
z++;
ATD0CTL2=0x00;
}
if(z==28){//大于采集的28行
TIE_C2I=0;//关闭行中断
TIE_C3I=1;//打开场中断
send_image_data();//采集完成,串口发送采集到的图像
}
}
//场中断
#pragma CODE_SEG NON_BANKED
void interrupt 11 timer3_chang(void) //场中断到来
{
DisableInterrupts;
TFLG1_C3F=1; //清场中断标志位
TIE_C2I=0; //关行中断
x=0;y=0;z=0; //初始化采集数组
TIE_C2I=1;//开行中断
//TIE_C3I=0;//关场中断
EnableInterrupts;
}
复制代码
作者:
huliang20
时间:
2010-5-24 18:22
看看是不是采集时间长了,视频数据串了
作者:
cat888
时间:
2010-5-24 19:23
AD采集3us一次,行40us左右,如果不超频,每行只能采40/3 个点,采多了就有问题了。
作者:
iven
时间:
2010-5-24 21:19
回复
3#
cat888
超频了,总线64 AD是16M 采集40个点应该没问题吧?
作者:
iven
时间:
2010-5-24 21:20
回复
2#
huliang20
可是我中断时序都正常啊。。按道理来说不应该串的呀。。。
作者:
cat888
时间:
2010-5-25 07:40
回复 cat888
超频了,总线64 AD是16M 采集40个点应该没问题吧?
iven 发表于 2010-5-24 21:19
用示波器看看 采40个点到底用了多长时间。
作者:
iven
时间:
2010-5-26 08:36
回复
6#
cat888
看了一下,示波器场周期平均在13ms 行周期平均在42.5us。是不是正常的?
作者:
cat888
时间:
2010-5-26 09:08
回复
7#
iven
13ms, ov7620?ov6620是20ms。你代码采40个点用了多长时间,这个是关键。
作者:
xiaohaipolang
时间:
2010-5-31 22:01
据说 你可以在场中断里面加一个判断
我的意思是 如果单片机受到干扰 可能会误判中断信号
作者:
oo7ak47666
时间:
2010-6-1 12:37
注意电磁兼容性,如果不是软件原因,很可能是外部干扰,特别是在有电机工作的时候。建议在不使用电机的情况下,查看图像采集。若还有问题,若每行后面不是黑的就不存在点采多了的问题。还有,图像发送程序也可能导致这类问题的发生。
作者:
adrian
时间:
2010-6-1 19:26
上位机只能一帧一帧地收图像,一次只能接一帧,然后就得停止接收,要不然会错位,还有啊,串行通信的时间其实挺长的,所以时序问题也得好好考虑。
作者:
zhangjugang
时间:
2010-9-8 11:03
你单片机波特率设置的是多少?你写寄存器的时候是不是保证单片机波特率是准确的9600(或者其他),因为你单片机寄存器的值是计算得来的,是浮点值,但计算机是很准确的波特率,摄像头一次传很大的数据就有问题了,你试试把单片机的波特率设置精确点,尽量用9600或者19200
作者:
786892880
时间:
2010-9-8 11:43
本帖最后由 786892880 于 2010-9-8 11:52 编辑
个人觉得 程序可以从最简单开始,测试摄像头的信号:
#pragma CODE_SEG NON_BANKED
void interrupt 10 Timer2_cow(void) //行中断
{
TFLG1_C2F=1; //清行中断标志位
{
//AD_Init() ; //放在主函数
for(y=0;y<500;y++) //在500个点里面 摄像头的行信号可以看的很清楚了
{
while(!ATD0STAT0_SCF);
imageBuffer[z][y]= ATD0DR0L; //开始采集
}
}
//send_image_data();//放在主函数 测试阶段可以在cw上调试就行了
}
}
测试清楚以后,你可以根据实际情况调整程序。
欢迎光临 智能车制作 (http://dns.znczz.com/)
Powered by Discuz! X3.2