载入中。。。
http://blog.eccn.com/u/107300/index.htm
时间记忆
载入中。。。
最新评论
载入中。。。
我的公告
载入中。。。
我的相册
最新留言
载入中。。。
我的好友
载入中。。。
用户登陆
载入中。。。
友情链接
博客信息
载入中。。。



日志
OV6620采集(3) | 2008-6-18 12:19:00

上篇日志给出了采集电路,下面就采集电路而展开讨论。

电路图中CD40106的作用:将行信号反向,原因是单片要贩IRQ中断只能捕捉下跳变,而对行信号而已,其下跳变是行扫描的结束,上跳变以行扫描的开始,用CD40106后,将信号反向,使得单片机捕捉到下跳变后,正好是行扫描的开始,这样就可以一进入中断就进行采集了。

对于场信号接PJ0,主要是用于图像的刷新,一副图像的开始。

下面给出运用些电路图的一种采集程序结构图与程序思想:

#define VIDEO_SAMPLE      INTCR_IRQEN=1
#define NO_SAMPLE         INTCR_IRQEN=0
 
void PLL_Init(void);
void Video_Init(void);

void main()
{
 DisableInterrupts;
 PLL_Init();   //PLL
 Video_Init();  //采集的初使化
 EnableInterrupts; //开中断
 VIDEO_SAMPLE;  //开始采集图像
 for(;;);
}

void PLL_Init(void)
{
 ///PLL
}

void Video_Init(void)
{
 //开行中断,开场中断
}

#pragma CODE_SEG NON_BANKED
void interrupt 6 IRQ_ISR()
{
  //判断是否是采集的行,不是就跳出,
 //采集
}
#pragma CODE_SEG DEFAULT_ROM
 
#pragma CODE_SEG NON_BANKED
void interrupt x PORTJ_ISR()
{
 //一融图像采集完
 //图像矩阵清零
}
#pragma CODE_SEG DEFAULT_ROM

当然上述只是很多种采集程序中的一种架构,但是万变不离其中,其目的是一样的,就是图像采集。

阅读全文 | 回复(6) | 引用通告 | 编辑 | By: super
  • 标签:采集方案 
  • Re:OV6620采集(3) | 2008-12-2 9:31:00
    访客s8NYq1(游客)请问一下0v6620默认的输出格式是不是,YUV,16位,彩色模式呢?谢谢
    个人主页 | 引用 | 返回 | 删除 | 回复 | By: 访客s8NYq1(游客)
    视频采集 | 2008-9-25 21:03:00
    三(游客)康桥仁你好:

    我编了一个视频采集程序,但采集的数据不对你帮我看一下把,我用PT0,PT1分别接行场同步,我用的视频芯片是OV5116.
    #i nclude <hidef.h> /* common defines and macros */
    #i nclude <mc9s12dg128.h> /* derivative information */
    #pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
    #define ROW_MAX 40 /*采集的最大行数*/
    #define LINE_MAX 28 /*每行采集的最大列数*/
    #define INTERVAL_ROW 7 /*每隔INTERVAL_ROW 行采集image 数据*/
    volatile unsigned int counter_row=0; /*采集的行线计数*/
    volatile unsigned int row=0;
    volatile unsigned int line=0;
    volatile unsigned char vertical_start=0; /*新的一场场开始标记为1*/
    volatile unsigned char temp_vd[ROW_MAX][LINE_MAX];
    volatile unsigned char ccd[40][28] ;


    void Init_PLL(void)
    {
    REFDV=0x03; //initiatethe PLLclock
    SYNR=0x07; //Osc 16M,bus clock32MHz
    while(!(CRGFLG&0x08)){
    }//waituntilsteady
    CLKSEL=0x80; //selectthePLLCLK
    }
    void Init_SCI(void)
    {
    SCI0BD=208;
    SCI0CR1=0x00;
    SCI0CR2=0x0C;
    }

    void Tx_SCI(unsigned char s)
    {
    while(SCI0SR1_TC!=1);
    while(SCI0SR1_TDRE!=1);
    SCI0DRL=s;
    }

    void Init_ECT(void)
    {
    TIOS= 0X00; /*select all channels as input*/
    TSCR1 = 0X80; /*timer enable*/
    TSCR2 = 0X04; /*for 32Mbus clock,set prescaler to32.76ms*/
    TCTL4=0X0A; /*PT0,PT1CaptureonFallingEdge */

    TFLG1= 0X03; /*clear C0F,C1F interrupt flag*/

    TIE=0X02; /*enable C1I interrupt*/
    }
    void Init_ATD(void)
    {
    ATD0CTL2=0xC0;
    ATD0CTL3=0x08;
    ATD0CTL4=0x81;
    ATD0CTL5=0xA0;
    ATD0DIEN=0x00;
    }
    #pragma CODE_SEG NON_BANKED
    void interrupt 9 ECT1_ISR(void)
    {

    TFLG1= 0x02; /*clear C1F interrupt flag*/
    TIE_C1I=0; /*disable vertical interrupt*/
    TIE_C0I=1; /*enable thehorizon interrupt*/

    }
    #pragma CODE_SEG DEFAULT
    #pragma CODE_SEG NON_BANKED
    void interrupt 8 ECT0_ISR(void)
    {
    int a,b;
    TFLG1=0x01; /*clear C0F interrupt flag*/
    counter_row++;
    if(counter_row==INTERVAL_ROW)
    {
    row++;
    counter_row=0;
    if(row>=4)/*从第28行开始采集数据,每隔7行采集一次*/
    {
    TIE_C0I=0;/*视频图象采集过程,屏蔽中断*/
    if(row<=ROW_MAX+4)
    {
    Init_ATD();
    for(line=0;line<LINE_MAX;line++)
    { /*采集数据*/
    while(!ATD0STAT1_CCF0);
    temp_vd[row-4][line]=ATD0DR0L;
    // Init_SCI(temp_vd[row-4][line]);

    }
    ATD0CTL2=0x00; /*关ATD*/
    line=0; /*一行采集完毕,列计数清零*/
    }
    TIE_C0I=1; /*重新开启中断*/
    if(row==(ROW_MAX+4))
    {
    for(a=0;a<40;a++)
    {
    for(b=0;b<28;b++)

    ccd[a][b]=temp_vd[a][b] ;
    }

    vertical_start=1 ;
    TIE_C1I=1;
    TIE_C0I=0; /*一场中预定的行采集完毕,disable thehorizoninterruptTIE_C1I=1; /*enable thevertical interruptagain,等待下一场的开始counter_row=0; /*行计数清零*/
    counter_row=0;
    row=0;

    }
    }
    }
    }

    #pragma CODE_SEG DEFAULT

    void main(void)
    {
    int a,b;
    Init_PLL();
    Init_SCI();
    //vertical_start=0;
    counter_row=0;
    row=0;
    line=0;
    Init_ECT();
    EnableInterrupts;




    for(;;)
    {

    if(vertical_start==1)

    { Tx_SCI(0x55);
    for(a=0;a<40;a++)
    { Tx_SCI(0x0F);
    for(b=0;b<28;b++)
    Tx_SCI(ccd[a][b]);
    //{
    //if(ccd[a][b]<0xc2)

    // ccd[a][b]=0x00;
    // else ccd[a][b]=0xFF;
    // Tx_SCI(ccd[a][b]);
    // }

    }
    Tx_SCI(0x11);
    vertical_start=0;
    }

    }
    }
    麻烦你了,谢谢
    个人主页 | 引用 | 返回 | 删除 | 回复 | By: 三(游客)
    Re:OV6620采集(3) | 2008-9-4 11:05:00
    访客01UHx3(游客)关于OV6620的初始化问题,我自己DIY了一个OV6620的模块,(PCB是焊接了OV6620芯片,引脚引出排针),按照DATASHEET上的说明对:(1)VCC:PIN1,PIN8,PIN14,PIN29,PIN32,PIN44. (2)GND:PIN7,PIN15,PIN30,PIN31,PIN43,PIN48

    (3)PWND-接地,RESET-接地,VRCAP(0,1,2)按照给定参数的电容接地。
    (4)IICB接地,MULT接地,XCLK1,XCLK接16M晶振。
    我出现的问题如下,当使用I2C写寄存器时,可以成功,但是一旦开发板重新上电后,就回出现SLA_W_NO_ACK,从机无响应。不知道时怎么回事,希望无你交流一下,我的QQ邮箱时196095567@qq.com
    个人主页 | 引用 | 返回 | 删除 | 回复 | By: 访客01UHx3(游客)
    Re:OV6620采集(3) | 2008-6-23 18:17:00
    访客swn0Qe(游客)我查到原因了,原来我发现我超频稳定的时间需要很长,有的需要半分钟啊
    以下为super的回复:
    怎么可能,频度稳定半分钟,呵呵,我感觉可能板子的有问题吧?
    个人主页 | 引用 | 返回 | 删除 | 回复 | By: 访客swn0Qe(游客)
    Re:OV6620采集(3) | 2008-6-19 19:49:00
    访客swn0Qe(游客)我程序没有设定这样的啊,怎么样才设定舵机和主电机的先后。还有就是我如果,如果我开单片机后,马上开电机就电机起不来,奇怪啊!和超频有关系吗?我们是超到32M的,是不是PCB布线有问题啊!我们的33886用的是两片,D1接地,D2上拉10K接5v
    以下为super的回复:
    MC33886即使级联也有好几种方式.
    对于舵机与电机的启动方式如何设定,舵机与电机都是用PWM控制了,对于PWM就好控制了,有使能位,至于马上开机就启动不了和过一会有启动,这个我不知道,感觉不太合呼情理,可能是其它的地方的问题,如果程序是否运行到了那个地方等!
    个人主页 | 引用 | 返回 | 删除 | 回复 | By: 访客swn0Qe(游客)
    Re:OV6620采集(3) | 2008-6-18 20:01:00
    访客swn0Qe(游客)小车为什么要先开单片机,再过会开电机,电机启动后舵机才会有反映,好奇怪
    以下为super的回复:
    这是你程序初使化的问题,后开电机,主要是留一定的时间给单片要对当前环境的分析,如亮度、传感器的值等。
    至于电机启动后舵机才有反映,这是没有道理的,因为你的程序设定的就是先开主电机再启动舵机,肯定是程序设定的,这一点不用怀疑,我能肯定。
    个人主页 | 引用 | 返回 | 删除 | 回复 | By: 访客swn0Qe(游客)
    发表评论:
    载入中。。。
    Design by blog.nfhot.com / Copyright http://nfhot.com 2006-2008 reserved