智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 2709|回复: 11
打印 上一主题 下一主题

摄像头采集出问题,麻烦高手看看

[复制链接]

20

主题

128

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
威望
723
贡献
449
兑换币
449
注册时间
2013-1-3
在线时间
331 小时
跳转到指定楼层
1#
发表于 2014-1-9 16:02:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
代码用的就是红树的,下载进去之后2、3秒内上位机接收到数据,之后就接收不到了
情况说明:接线-A0-A7摄像头模块 (数据)Y0 - Y7
      T0  摄像头模块 (行中断)HREF
      T1  摄像头模块 (场中断)VSYN
我只连这几根,加上VCC(5V)\GND
复位单片机也不行,非到全部断电,之后又是2、3秒
尝试过摄像头RST不断复位,倒是可以连续采集了,不过摄像头要1、2秒复位一次
/********************************************************************************/
/********************************************************************************
                  红树伟业智能车专业店MC9S12XS128汽车电子综合开发平台
                  淘宝店?:ttp://hongshuweiye.taobao.com/
                  原创时间:2013年10月10号  
                  客服QQ  :226904339  
                  
上位机设置
  波特率115200
  图像宽度 120
  图像高度 40

接线:
      S0(单片机上的RXD)  -----> 串口模块TXD
      S1(单片机上的TXD)  -----> 串口模块RXD
      GND(单片机上的地)  -----> 串口模块GND      //如果单片机和串口使用不同电源,也需要共地
      波特率115200
      
      A0-A7  -----------------> 摄像头模块 (数据)Y0 - Y7
      T0     -----------------> 摄像头模块 (行中断)HREF
      T1     -----------------> 摄像头模块 (场中断)VSYN
  
                  
      如果图像不在中间,请看 行中断处理函数            
                  
*********************************************************************************
*********************************************************************************/
#include <hidef.h>         
#include "derivative.h"         
#include <mc9s12xs128.h>

#define ROW        40                 //数字摄像头所采集的二维数组行数
#define COLUMN     120                //数字摄像头所采集的二维数组列数
#define ROW_START  10                 //数字摄像头二维数组行开始行值
#define ROW_MAX    200                //数字摄像头所采集的二维数组行最大值
#define THRESHOLD  0x68               //图像阈值,根据所采集图像亮度值大小的实际情况调整(OV7620所采集的亮度值大小为0--255)


unsigned char Buffer[ROW][COLUMN]={0};       //所采集的图像二维数组
unsigned char Image_Center[ROW]={0};        //所采集的图像中心线

unsigned char SampleFlag=0;       //奇偶场标记

unsigned int  m=0;                 //换行变量

unsigned int  Line;               //行中断计数变量
unsigned int  hang;               


unsigned int  Get_Image[]={   
                         17,19,21,23,25,28,31,34,37,40,43,46,49,53,57,
                         61,65,69,73,77,81,85,89,94,99,105,111,117,123,
                         129,135,141,147,153,159,166,173,180,187
                 
                         };     //定每场采哪几行。
                        
/*************************************************************/
/*                        初始化PLL函数                      */
/*************************************************************/
void PLL_Init(void) {

    CLKSEL=0X00;                                //disengage PLL to system
    PLLCTL_PLLON=1;                            //turn on PLL
    SYNR =0xc0 | 0x09;                        
    REFDV=0x80 | 0x01;
    POSTDIV=0x00;                       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=160MHz;
    _asm(nop);                          //BUS CLOCK=80M
    _asm(nop);
    while(!(CRGFLG_LOCK==1));              //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;                        //engage PLL to system;
}

/*************************************************************/
/*                      行场中断初始化函数                   */
/*************************************************************/
void TIM_Init(void)
{
        TIOS=0x00;              //外部输入捕捉0,1通道
        TCTL4=0x09;             //通道0 上升沿触发,通道1下降沿触发
        TSCR1=0x80;             //使能
        TIE=0x03;               //通道 0,1 中断使能
        TFLG1=0xFF;             //清中断标志位
}

/*************************************************************/
/*                      IO口初始化函数                       */
/*************************************************************/

void IO_Init(void)
{

         DDRA=0X00;             //端口A配置成输入
   
}

/*************************************************************/
/*                     延时函数                              */
/*************************************************************/

void delays(long m){

while(m--);

}

/*************************************************************/
/*                       串口0初始化函数                     */
/*************************************************************/
void SCI_Init()

{
          SCI0BD=44;              //115200bps     Baud Rate=BusClock/(16*SCIBD)
         //SCI0BD=261;              //19200bps     Baud Rate=BusClock/(16*SCIBD)
         //SCI0BD=521;
         SCI0CR1=0;              //正常8 位模式,无奇偶校验
         SCI0CR2=0X2C;           //发送允许  接受中断允许
}


/*************************************************************/
/*                        串口0发送函数                      */
/*************************************************************/
void SCI_Write(unsigned char SendChar)
{
                                         
      while (!(SCI0SR1&0x80));
      SCI0DRH=0;

      SCI0DRL=SendChar;
}

/*************************************************************/
/*                 向电脑串口发送所采集的图像                */
/*************************************************************/
   void Process()
{
   unsigned char i,j;

   for(i=0;i<ROW;i++)
   {
      for(j=0;j<COLUMN;j++)

       {
          if(Buffer[i][j] == 0xFF)
            SCI_Write(0xFE) ;
          else
            SCI_Write(Buffer[i][j]) ;
      }
      //SCI_Write(0x0D);
      //SCI_Write(0X0A);   
   }
   SCI_Write(0xFF);
}
/*************************************************************/
/*                          主函数                           */
/*************************************************************/
void main(void)
{
  
/* put your own code here */
   PLL_Init();  //初始化锁相环
   TIM_Init();  //初始化中断
   IO_Init();   //初始化IO口
   SCI_Init();  //初始化串口   

  

  

  EnableInterrupts;
  
  for(;;)
  {
   
      Process();           //向电脑串口发送所采集的图像        

   }   

           //   _FEED_COP(); /* feeds the dog */

          /* loop forever */
         /* please make sure that you never leave main */
}

/*************************************************************/
/*                        行中断处理函数                     */
/*************************************************************/

#pragma CODE_SEG __NEAR_SEG NON_BANKED

void interrupt 8    PT0_Interrupt(){

   TFLG1_C0F=1;    //行中断标志位清除,以便于下次行中断进行

   Line++;         //行中断计数变量
   
   if ( SampleFlag == 0 || Line<ROW_START || Line>ROW_MAX ){
      return;     //不是要采集图像的有效行,返回                              
    }
   
  if( Line==Get_Image[hang]){
   
    delays(8);//如果图像不在中间请修改这里
   
         
        Buffer[m][0]=PORTA;_asm();Buffer[m][1]=PORTA;_asm();Buffer[m][2]=PORTA;_asm();Buffer[m][3]=PORTA;_asm();Buffer[m][4]=PORTA;_asm();
        Buffer[m][5]=PORTA;_asm();Buffer[m][6]=PORTA;_asm();Buffer[m][7]=PORTA;_asm();Buffer[m][8]=PORTA;_asm();Buffer[m][9]=PORTA;_asm();
        Buffer[m][10]=PORTA;_asm();Buffer[m][11]=PORTA;_asm();Buffer[m][12]=PORTA;_asm();Buffer[m][13]=PORTA;_asm();Buffer[m][14]=PORTA;_asm();
        Buffer[m][15]=PORTA;_asm();Buffer[m][16]=PORTA;_asm();Buffer[m][17]=PORTA;_asm();Buffer[m][18]=PORTA;_asm();Buffer[m][19]=PORTA;_asm();
        Buffer[m][20]=PORTA;_asm();Buffer[m][21]=PORTA;_asm();Buffer[m][22]=PORTA;_asm();Buffer[m][23]=PORTA;_asm();Buffer[m][24]=PORTA;_asm();
        Buffer[m][25]=PORTA;_asm();Buffer[m][26]=PORTA;_asm();Buffer[m][27]=PORTA;_asm();Buffer[m][28]=PORTA;_asm();Buffer[m][29]=PORTA;_asm();
        Buffer[m][30]=PORTA;_asm();Buffer[m][31]=PORTA;_asm();Buffer[m][32]=PORTA;_asm();Buffer[m][33]=PORTA;_asm();Buffer[m][34]=PORTA;_asm();
        Buffer[m][35]=PORTA;_asm();Buffer[m][36]=PORTA;_asm();Buffer[m][37]=PORTA;_asm();Buffer[m][38]=PORTA;_asm();Buffer[m][39]=PORTA;_asm();
        Buffer[m][40]=PORTA;_asm();Buffer[m][41]=PORTA;_asm();Buffer[m][42]=PORTA;_asm();Buffer[m][43]=PORTA;_asm();Buffer[m][44]=PORTA;_asm();
        Buffer[m][45]=PORTA;_asm();Buffer[m][46]=PORTA;_asm();Buffer[m][47]=PORTA;_asm();Buffer[m][48]=PORTA;_asm();Buffer[m][49]=PORTA;_asm();
        Buffer[m][50]=PORTA;_asm();Buffer[m][51]=PORTA;_asm();Buffer[m][52]=PORTA;_asm();Buffer[m][53]=PORTA;_asm();Buffer[m][54]=PORTA;_asm();
        Buffer[m][55]=PORTA;_asm();Buffer[m][56]=PORTA;_asm();Buffer[m][57]=PORTA;_asm();Buffer[m][58]=PORTA;_asm();Buffer[m][59]=PORTA;_asm();
        Buffer[m][60]=PORTA;_asm();Buffer[m][61]=PORTA;_asm();Buffer[m][62]=PORTA;_asm();Buffer[m][63]=PORTA;_asm();Buffer[m][64]=PORTA;_asm();
        Buffer[m][65]=PORTA;_asm();Buffer[m][66]=PORTA;_asm();Buffer[m][67]=PORTA;_asm();Buffer[m][68]=PORTA;_asm();Buffer[m][69]=PORTA;_asm();
        Buffer[m][70]=PORTA;_asm();Buffer[m][71]=PORTA;_asm();Buffer[m][72]=PORTA;_asm();Buffer[m][73]=PORTA;_asm();Buffer[m][74]=PORTA;_asm();
        Buffer[m][75]=PORTA;_asm();Buffer[m][76]=PORTA;_asm();Buffer[m][77]=PORTA;_asm();Buffer[m][78]=PORTA;_asm();Buffer[m][79]=PORTA;_asm();
        Buffer[m][80]=PORTA;_asm();Buffer[m][81]=PORTA;_asm();Buffer[m][82]=PORTA;_asm();Buffer[m][83]=PORTA;_asm();Buffer[m][84]=PORTA;_asm();
        Buffer[m][85]=PORTA;_asm();Buffer[m][86]=PORTA;_asm();Buffer[m][87]=PORTA;_asm();Buffer[m][88]=PORTA;_asm();Buffer[m][89]=PORTA;_asm();
        Buffer[m][90]=PORTA;_asm();Buffer[m][91]=PORTA;_asm();Buffer[m][92]=PORTA;_asm();Buffer[m][93]=PORTA;_asm();Buffer[m][94]=PORTA;_asm();
        Buffer[m][95]=PORTA;_asm();Buffer[m][96]=PORTA;_asm();Buffer[m][97]=PORTA;_asm();Buffer[m][98]=PORTA;_asm();Buffer[m][99]=PORTA;_asm();
        Buffer[m][100]=PORTA;_asm();Buffer[m][101]=PORTA;_asm();Buffer[m][102]=PORTA;_asm();Buffer[m][103]=PORTA;_asm();Buffer[m][104]=PORTA;_asm();
        Buffer[m][105]=PORTA;_asm();Buffer[m][106]=PORTA;_asm();Buffer[m][107]=PORTA;_asm();Buffer[m][108]=PORTA;_asm();Buffer[m][109]=PORTA;_asm();
        Buffer[m][110]=PORTA;_asm();Buffer[m][111]=PORTA;_asm();Buffer[m][112]=PORTA;_asm();Buffer[m][113]=PORTA;_asm();Buffer[m][114]=PORTA;_asm();
        Buffer[m][115]=PORTA;_asm();Buffer[m][116]=PORTA;_asm();Buffer[m][117]=PORTA;_asm();Buffer[m][118]=PORTA;_asm();Buffer[m][119]=PORTA;_asm();
        Buffer[m][120]=PORTA;
  
        hang++;               
        m++;
   }

}

/*************************************************************/
/*                        场中断处理函数                     */
/*************************************************************/

#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 9 PT1_Interrupt()

{
             TFLG1_C1F=1;              //场中断清楚,以便于下次的场中断的正常进行
             TFLG1_C0F=1;              //行中断清除,以便于开始采集图像数据
             m=0;                      //行中间变量清零,以便于开始从把采集的图像放到数组的第一行
             Line=0;                   //行中断临时变量清零
             hang=0;                   //行临时变量清除
             SampleFlag=~SampleFlag;   //场中断标记取反,这样只采集奇数场的图像
}







8

主题

282

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2056
QQ
威望
1038
贡献
670
兑换币
675
注册时间
2012-12-26
在线时间
174 小时
2#
发表于 2014-1-9 16:33:51 | 只看该作者
用延时取数据太狠了
回复 支持 反对

使用道具 举报

6

主题

67

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1600
威望
746
贡献
464
兑换币
490
注册时间
2012-12-9
在线时间
195 小时
3#
发表于 2014-1-9 17:00:29 | 只看该作者
表示代码好长
回复 支持 反对

使用道具 举报

20

主题

801

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4967

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
2934
贡献
605
兑换币
1966
注册时间
2012-9-13
在线时间
714 小时
毕业学校
上海海事大学
4#
发表于 2014-1-9 22:21:05 | 只看该作者
这个浪费了太多单片机的资源。不过应该能采集到,而且你发送数据的时候应该把采集部分关掉,发送完了再打开,不然中间会出乱的。
回复 支持 反对

使用道具 举报

24

主题

1175

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5379
威望
2669
贡献
1706
兑换币
1811
注册时间
2012-10-29
在线时间
502 小时
5#
发表于 2014-1-10 09:15:04 | 只看该作者
你是不是有写其他代码啊,会不会是进入了其他中断什么的?
回复 支持 反对

使用道具 举报

20

主题

128

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
威望
723
贡献
449
兑换币
449
注册时间
2013-1-3
在线时间
331 小时
6#
 楼主| 发表于 2014-1-10 11:31:18 | 只看该作者
Neozoic 发表于 2014-1-10 09:15
你是不是有写其他代码啊,会不会是进入了其他中断什么的?

解决了,不能用蓝牙传图片
回复 支持 反对

使用道具 举报

32

主题

387

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4627
威望
2290
贡献
1181
兑换币
924
注册时间
2012-2-13
在线时间
578 小时
7#
发表于 2014-1-10 12:14:02 | 只看该作者
电池是不是没电了
回复 支持 反对

使用道具 举报

20

主题

128

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1834
威望
723
贡献
449
兑换币
449
注册时间
2013-1-3
在线时间
331 小时
8#
 楼主| 发表于 2014-1-10 12:23:03 | 只看该作者
mdgs 发表于 2014-1-10 12:14
电池是不是没电了

解决了,不能用蓝牙传图片
回复 支持 反对

使用道具 举报

24

主题

1175

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
5379
威望
2669
贡献
1706
兑换币
1811
注册时间
2012-10-29
在线时间
502 小时
9#
发表于 2014-1-10 16:17:57 | 只看该作者
枫恣零 发表于 2014-1-10 11:31
解决了,不能用蓝牙传图片

嗯嗯,去年用蓝牙连续发送图像的时候就出现舵机无法打角的问题
回复 支持 反对

使用道具 举报

32

主题

387

帖子

1

精华

常驻嘉宾

Rank: 8Rank: 8

积分
4627
威望
2290
贡献
1181
兑换币
924
注册时间
2012-2-13
在线时间
578 小时
10#
发表于 2014-1-11 13:05:19 | 只看该作者
枫恣零 发表于 2014-1-10 12:23
解决了,不能用蓝牙传图片

用无线模块可以实现,占用的时间也很少,我去年K60处理一场数据的时间不到3ms
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-12-26 14:43 , Processed in 0.088297 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表