智能车制作

标题: 赐教。。一帧图像被截成了两段。。。 [打印本页]

作者: iven    时间: 2010-5-23 22:57
标题: 赐教。。一帧图像被截成了两段。。。
本帖最后由 iven 于 2010-5-23 23:08 编辑




这是一帧图片,很奇怪的是被中间的东西隔开了,一旦被隔开,下面的部分就是重新开始的部分,而隔开的上半部分是结束的部分。

初步怀疑是场消隐,如果是这个问题,该怎么办呢?


附上场中断和行中断代码:是不是这个有问题?

  1. //+++++++++++++++行中断函数+++++++++++//
  2. #pragma CODE_SEG NON_BANKED
  3. void interrupt 10 Timer2_cow(void) //行中断

  4. {
  5. unsigned char time;
  6. TFLG1_C2F=1; //清行中断标志位
  7. hang_flag++;

  8. x++;//行
  9. if((x>=18)&&(x<=270)&&(x%9==0))
  10. {
  11. AD_Init() ;
  12. for(time=0;time<110;time++); //行消隐
  13. for(y=0;y<IMG_COLUMN;y++)
  14. {
  15. while(!ATD0STAT0_SCF);
  16. imageBuffer[z][y]= ATD0DR0L; //开始采集

  17. }
  18. z++;
  19. ATD0CTL2=0x00;
  20. }

  21. if(z==28){//大于采集的28行
  22. TIE_C2I=0;//关闭行中断
  23. TIE_C3I=1;//打开场中断
  24. send_image_data();//采集完成,串口发送采集到的图像
  25. }
  26. }
  27. //场中断
  28. #pragma CODE_SEG NON_BANKED
  29. void interrupt 11 timer3_chang(void) //场中断到来
  30. {
  31. DisableInterrupts;
  32. TFLG1_C3F=1; //清场中断标志位
  33. TIE_C2I=0; //关行中断
  34. x=0;y=0;z=0; //初始化采集数组

  35. TIE_C2I=1;//开行中断
  36. //TIE_C3I=0;//关场中断
  37. EnableInterrupts;
  38. }
复制代码

作者: 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://111.231.132.190/) Powered by Discuz! X3.2