智能车制作

 找回密码
 注册

扫一扫,访问微社区

楼主: xhlove555
打印 上一主题 下一主题

摄像头采集串口看的效果,求高手帮忙。。。

  [复制链接]

5

主题

37

帖子

0

精华

高级会员

Rank: 4

积分
512
威望
318
贡献
54
兑换币
0
注册时间
2010-5-3
在线时间
70 小时
11#
 楼主| 发表于 2011-4-15 12:14:24 | 只看该作者
回复 10# helibingbingo


    原来没有旁边的1,只有中间的,旁边全是0,能帮忙解释下么?
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
威望
248
贡献
115
兑换币
10
注册时间
2011-2-26
在线时间
5 小时
12#
发表于 2011-4-15 12:30:42 | 只看该作者
回复 7# nasri8hao


    嗯…你可以去买一根USB转串口线,一头是USB可以连接电脑,一头是9针串口…
  然后五针在上为第一排,四针在下为第二排,从左往右,第一排是1~5针
  用2针接PS1,3针接PS0,5针接单片机GND,其他六针不用管,就可以和电脑串口传输了
  我把初始化设置和发送接收数据函数一起给你吧,只要你是照我那么接的就可以用了
  电脑上要一个串口调试助手的,网上很容易下的
  COM口的话在【我的电脑】->【管理】->【设备管理器】 可以看到,选择相应的COM口就好了,原理和51的UART一样一样的
  下面是函数
  void uart_init(void){
        SCI0CR1 = 0x04;     //空闲 字符位计数开始于停止位后
        SCI0CR2 = 0x0c;     //设置接收发送器使能
        SCI0BDH = 0x01;     //波特率设置为9600
        SCI0BDL = 0x04;
}

void uart_SentChar(INT8U ch){         //发送数据
        while (!(SCI0SR1 & 0x80));
        SCI0DRL = ch;

}

INT8U uart_GetChar(void){           //接收数据
        while (!(SCI0SR1 & 0x20));
        return SCI0DRL;
}
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
威望
248
贡献
115
兑换币
10
注册时间
2011-2-26
在线时间
5 小时
13#
发表于 2011-4-15 12:33:24 | 只看该作者
我们也用的是OV6620啊
楼主的OV6620每场的行数都固定吗?我们这边的摄像头没场的行数竟然从 46~282行不等,很奇怪啊
楼主的二值化是直接设定一个阀值二值化了还是设定了阈值用用跳变检测的呀?
回复 支持 反对

使用道具 举报

15

主题

135

帖子

0

精华

高级会员

Rank: 4

积分
990
威望
628
贡献
212
兑换币
50
注册时间
2010-11-23
在线时间
75 小时
14#
发表于 2011-4-15 13:16:02 | 只看该作者
回复 12# jeremylt


    太感谢了,这下明白了,真是活雷锋呀!!!!!
回复 支持 反对

使用道具 举报

15

主题

135

帖子

0

精华

高级会员

Rank: 4

积分
990
威望
628
贡献
212
兑换币
50
注册时间
2010-11-23
在线时间
75 小时
15#
发表于 2011-4-15 13:18:56 | 只看该作者
回复 12# jeremylt


    要是想边跑边看数据,是不是要用无线或sd卡了
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
威望
248
贡献
115
兑换币
10
注册时间
2011-2-26
在线时间
5 小时
16#
发表于 2011-4-15 16:09:28 | 只看该作者
回复 15# nasri8hao


    活雷锋不敢当,我也只是略懂皮毛而已,能帮则帮
   跑的时候可以用无线吧,用个TI的射频单片机与s12用串口连起来就好了
   不过想要把所有的图像数据传出来应该是不可能的…
   因为SCI波特率是很有限的,即使设到最高… 一秒50帧*一帧30行*一行70个点*一个点10位数据得要1050‘000的波特率才能跟上…
   用SPI会快点,但估计也行不通吧,因为单片机采集数据处理数据也要时间啊
   用无线的只能传一些必要数据吧…
   SD卡系统结构很复杂,我前阵子看了些资料,准备尝试一下,但估计也处理不过来吧
   XS芯片貌似有内部的协处理器,如果那个可以用起来的话速度应该可以跟上吧,不过这方面资料缺缺啊,手头也没什么资料
   呵呵,大家一起努力哦,遇到什么问题一起交流下
回复 支持 反对

使用道具 举报

5

主题

37

帖子

0

精华

高级会员

Rank: 4

积分
512
威望
318
贡献
54
兑换币
0
注册时间
2010-5-3
在线时间
70 小时
17#
 楼主| 发表于 2011-4-15 18:31:14 | 只看该作者
回复 13# jeremylt


    我们每场采集的行数都是固定的,直接设定阈值二值化。。。。。唉,估计是程序问题。。。。
回复 支持 反对

使用道具 举报

15

主题

135

帖子

0

精华

高级会员

Rank: 4

积分
990
威望
628
贡献
212
兑换币
50
注册时间
2010-11-23
在线时间
75 小时
18#
发表于 2011-4-15 19:43:38 | 只看该作者
回复 16# jeremylt


    那能不能把数据写在flash里面,在读到电脑上分析呢,flash虽然不够用,但只存某一弯道的数据进行单独分析,这样可以吗???
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
威望
248
贡献
115
兑换币
10
注册时间
2011-2-26
在线时间
5 小时
19#
发表于 2011-4-16 07:43:22 | 只看该作者
回复 17# xhlove555

   ………程序的问题?那楼主是怎样实现拍一张图片下来的呢?用串口传输一个特定的数字过去吗?
  单片机那边是怎么检测的?用串口中断程序?还是在while()循环里不停的检测?
  不过我想应该都没关系的吧?速度都应该很快啊,不至于行数变化的那么大…
  呵呵,请楼主帮忙看看我们的程序吧,在此万分感激!   
  下面是我的程序:(我是在while里判断的)
/************************************超频*****************************/
void SetBusCLK_40M(void)
{   
    CLKSEL=0X00;                                //disengage PLL to system
    PLLCTL_PLLON=1;                        //turn on PLL
    SYNR =0x40 | 0x04;  // SYNDIV + 1 = 5                     
    REFDV=0x80 | 0x01;  // REFDIV + 1 = 2
    POSTDIV=0x00;       //pllclock=2*osc*(1+SYNR)/(1+REFDV)=80MHz;
    _asm(nop);          //BUS CLOCK=40M
    _asm(nop);
    while(!(CRGFLG_LOCK==1));          //when pll is steady ,then use it;
    CLKSEL_PLLSEL =1;                        //engage PLL to system;
}
/***************************行场中断初始化************************************/
void vinterruptsinit(void)
{

      TSCR1=0x80;//TIMER 定时器使能
    TIE  =0x00;//禁止中断
    TCTL3=0x00;//EDGnB EDGnA 1表示上升沿, 2表示下降沿, 3表示任何沿      
    TCTL4=0x06;//通道0上升沿触发,通道1下降沿触发
    TIOS =0x00;//每一位对应通道的: 0输入捕捉,1输出比较
    //TIE_C0I=1;//中断使能
    //TIE_C1I=1;//中断使能

}
/************************场中断*************************/


#pragma CODE_SEG __NEAR_SEG NON_BANKED                                    
void interrupt 8 vIC2ISR(void) {
DisableInterrupts;
TFLG1_C0F=1;
if (flag3 == 0x66){
    flag3 = 0x33;
    row = 0;
    line = 0;      
    TIE_C1I=1; //使能行中断T1使能
   
}else if(flag3 == 0x33){
    flag3 = 0;
    flag2 = 0;
    flag1 = 1;
    flag4 = 0;
    TIE  =0x00;    //关闭两个中断T1,T0
    //byzn_Buffer1();  //二值化数组
    valve_Buffer1();
    uart_SentBuffer1();
}
EnableInterrupts;


}
#pragma CODE_SEG CODE_DEFAULT
                           

/************************行中断*************************/

#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 9 vIC1ISR(void)
{
    TFLG1_C1F=1;
    flag4 = 1;   
    row ++;
    line = 0;
    href ++;   
}
#pragma CODE_SEG CODE_DEFAULT

/************************主函数**************************/
void main(void) {
  /* put your own code here */
  INT8U ch,i;
  DisableInterrupts;
  SetBusCLK_40M();
  uart_init();
  vinterruptsinit();
  vIOPortInit();
  EnableInterrupts;
   
  while (1){
         
                                       i = 0;
                      if(flag1 == 1){       
                          DisableInterrupts;
                          TIOS =0x00;  //关闭场中断
                       EnableInterrupts;             
                          uart_SentChar(flag2);                                          
                                uart_SentChar(href/256);
                                uart_SentChar(href%256);
                                if(!(href == 0)){
                                    href = 0;                                   
                                }                                
                                 flag2 = uart_GetChar();                                
                                flag1 = 0;                    
                     }
                      if (flag2 == 0x55){  //如果上位机发送0x55指令,则初始化外部中断,并开始准备向串口传输数据;
                          TIE_C0I=1;            //使能场中断,在场中断中使能行中断
                          flag3 = 0x66;
                          flag1 = 1;
                           }else flag1 = 1;
                      while (flag2 == 0x55){
                          while (flag3 == 0x33){              //确定 行中断已经开启,并开始采集数据
                              while(flag4 == 1) {
                                  while(row <ROW_MAX+1 && line <LINE_MAX-1) {                                     
                                      Buffer1[row-1][line] = PORTB;
                                  line ++;
                                  }
                              }                       
                                                                  
                         }          
                     }                 
      }   
  /* please make sure that you never leave main */
  }
回复 支持 反对

使用道具 举报

5

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
威望
248
贡献
115
兑换币
10
注册时间
2011-2-26
在线时间
5 小时
20#
发表于 2011-4-16 07:54:57 | 只看该作者
回复 18# nasri8hao


    呵呵,其实我没尝试过,也不知道呢…
  其实实践很重要,对吧,多实践实践,就能出真理的吧
  有机会我试试看…呵呵,最近在做一张魔兽地图,没怎么弄小车了…其实这个xs128,我也是前天才开始弄它的
  祝君可以成功
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-26 23:16 , Processed in 0.047260 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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