智能车制作

标题: 上位机采集出的图有时候分为两截,图像下一截是后一帧图像的上半部分,怎么回事? [打印本页]

作者: adndcn    时间: 2012-3-21 21:03
标题: 上位机采集出的图有时候分为两截,图像下一截是后一帧图像的上半部分,怎么回事?
[attach]21060[/attach]
有时会是如上的图片
[attach]21061[/attach]这个是原图
上位机使用了坛子里一个高手写的,感谢这位高手。
程序如下:
#include<stm32f10x_lib.h>
#include"delay.h"
#include"sys.h"
#include"usart.h"
#include"sccb.h"
#include"exti.h"
//#include"key.h"

int main(void)
{
        u8 i,j;                       
        Stm32_Clock_Init(9); //系统时钟设置
        delay_init(72);             //延时初始化
        uart_init(72,128000);  //串口初始化

        RCC->APB2ENR|=1<<3;
        GPIOB->CRH&=0X00000000;
        GPIOB->CRH|=0X88888888;
        GPIOB->ODR&=0XFFFF00FF;
        GPIOB->ODR|=0XFFFFFFFF;

        SCCB_Init();
        delay_ms(100);

        //SCCB_Write(0x42,0x15,0x24);
        SCCB_Write(0x42,0x11,0x01);
        delay_ms(1000);
        delay_ms(1000);
        delay_ms(1000);
        delay_ms(1000);
        EXTIX_Init();

        while(1)
        {
                while(imageok);
                imageok=1;
                USART1->DR=1;
                while((USART1->SR&0X40)==0);
                for(i=0;i<Ymax;i++)
                {
                        for(j=0;j<Xmax;j++)
                        {
                                if(data[j]==0x01)
                                {
                                        data[j]=0x02;
                                }
                                USART1->DR=data[j];
                                while((USART1->SR&0X40)==0);
                        }
                }

                USART1->DR=1;
                while((USART1->SR&0X40)==0);

                delay_ms(1000);
                delay_ms(1000);
                EXTI->IMR|=(1<<0);
                EXTI->EMR|=(1<<0);
                EXTI->IMR|=(1<<1);
                EXTI->EMR|=(1<<1);       
        }
                         


芯片是STM32,先谢谢各位了。。。。

作者: adndcn    时间: 2012-3-21 21:11
俺很想知道为什么会出现这种情况???很影响调试,是我的程序有问题吗??
作者: QianDE1991    时间: 2012-3-21 21:29
我用试用版的~~不知怎么就是出不来图像~~郁闷中~~
作者: Sid20    时间: 2012-3-21 21:39
开行中断或场中断之前清中断标志位
作者: adndcn    时间: 2012-3-21 22:29
  1. void EXTI0_IRQHandler(void)//VSYNC
  2. {
  3.         VSYNC_Flag=1;
  4.         EXTI->PR=1<<0;
  5. }

  6. void EXTI1_IRQHandler(void)//HREF
  7. {       
  8.         if(VSYNC_Flag)
  9.         {
  10.                 if(HREF_Num<480)
  11.                 {
  12.                         if(HREF_Num%8==0)
  13.                         {
  14.                                 for(pclk_Num=0;pclk_Num<Xmax;pclk_Num++)
  15.                                 {
  16.                                         //rewdata=GPIOB->IDR;
  17.                                         //imagedata=(rewdata&0x0000FF00)>>8;
  18.                                         //data[HREF_Num/10][pclk_Num]=imagedata;
  19.                                         data[HREF_Num/8][pclk_Num]=(GPIOB->IDR&0x0000ff00)>>8;
  20.                                 }
  21.                         }
  22.                         HREF_Num++;
  23.                 }
  24.                 else
  25.                 {
  26.                         EXTI->IMR&=~(1<<0);
  27.                         EXTI->EMR&=~(1<<0);
  28.                         EXTI->IMR&=~(1<<1);
  29.                         EXTI->EMR&=~(1<<1);
  30.                         VSYNC_Flag=0;
  31.                         HREF_Num=0;
  32.                         imageok=0;
  33.                 }
  34.         }
  35.         EXTI->PR=1<<1;
  36. }
复制代码



作者: adndcn    时间: 2012-3-21 22:38
3楼 你设置了帧头么,还有那个图片大小需要调整,不接收满这个软件貌似不会显示。希望能帮到你
作者: adndcn    时间: 2012-3-21 22:39
QianDE1991 发表于 2012-3-21 21:29
我用试用版的~~不知怎么就是出不来图像~~郁闷中~~

你设置了帧头么,还有那个图片大小需要调整,不接收满这个软件貌似不会显示。希望能帮到你

作者: 荔枝糖葫芦    时间: 2012-3-22 08:48
开行中断或场中断之前清中断标志位 + 1
作者: adndcn    时间: 2012-3-22 10:28
荔枝糖葫芦 发表于 2012-3-22 08:48
开行中断或场中断之前清中断标志位 + 1
  1. void EXTI0_IRQHandler(void)//VSYNC
  2. {
  3.         VSYNC_Flag=1;//帧标志flag置一
  4.         EXTI->PR=1<<0;//向寄存器写1 清中断标志
  5. }

  6. void EXTI1_IRQHandler(void)//HREF
  7. {        
  8.         if(VSYNC_Flag)
  9.         {
  10.                 if(HREF_Num<480)
  11.                 {
  12.                         if(HREF_Num%8==0)
  13.                         {
  14.                                 for(pclk_Num=0;pclk_Num<Xmax;pclk_Num++)
  15.                                 {
  16.                                         //rewdata=GPIOB->IDR;
  17.                                         //imagedata=(rewdata&0x0000FF00)>>8;
  18.                                         //data[HREF_Num/10][pclk_Num]=imagedata;
  19.                                         data[HREF_Num/8][pclk_Num]=(GPIOB->IDR&0x0000ff00)>>8;//采集图像
  20.                                 }
  21.                         }
  22.                         HREF_Num++;
  23.                 }
  24.                 else
  25.                 {
  26.                         EXTI->IMR&=~(1<<0);
  27.                         EXTI->EMR&=~(1<<0);
  28. //中断关闭
  29.                         EXTI->IMR&=~(1<<1);
  30.                         EXTI->EMR&=~(1<<1);
  31. //中断关闭
  32.                         VSYNC_Flag=0;//帧标志清零
  33.                         HREF_Num=0;//行计数清零
  34.                         imageok=0;//一帧图像采集完毕
  35.                 }
  36.         }
  37.         EXTI->PR=1<<1;
  38. //向寄存器写1 清中断标志
  39. }
复制代码
注释写好了,很抱歉是stm32的程序,但是您说的“清中断标志位”我已经清过了,您能指点下具体的么?谢谢!!

作者: 齐天小晟    时间: 2012-3-22 14:03
我也遇到过这个问题,场中断优先级要高于行中断
作者: 齐天小晟    时间: 2012-3-22 14:05
adndcn 发表于 2012-3-21 22:38
3楼 你设置了帧头么,还有那个图片大小需要调整,不接收满这个软件貌似不会显示。希望能帮到你

建议自己尝试做一个,用起来更方便,而且不难的
作者: QianDE1991    时间: 2012-3-22 16:07
齐天小晟 发表于 2012-3-22 14:05
建议自己尝试做一个,用起来更方便,而且不难的

我是这么想的~~可是不知道怎么开始~~用什么软件做好~~
作者: adndcn    时间: 2012-3-22 17:58
齐天小晟 发表于 2012-3-22 14:03
我也遇到过这个问题,场中断优先级要高于行中断

其实我也想做一个,但是只有我一个人弄摄像头,会耗费很多时间。恩,不多说,我尝试改了一下中断优先级,但是效果依旧。谢谢你的回复。我再尝试看看其他方法。

作者: 齐天小晟    时间: 2012-3-22 18:46
QianDE1991 发表于 2012-3-22 16:07
我是这么想的~~可是不知道怎么开始~~用什么软件做好~~

LABVIEW,我3天就做出来了,毕竟用到的东西很少。。。论坛里有个手把手教你做上位机的教程
作者: 齐天小晟    时间: 2012-3-22 18:47
adndcn 发表于 2012-3-22 17:58
其实我也想做一个,但是只有我一个人弄摄像头,会耗费很多时间。恩,不多说,我尝试改了一下中断优先级, ...

磨刀不误砍柴工啊,学会以后可以自己改进上位机的功能
作者: adndcn    时间: 2012-3-22 19:12
齐天小晟 发表于 2012-3-22 18:47
磨刀不误砍柴工啊,学会以后可以自己改进上位机的功能

非常感谢,以前用过labview搞过荧光算法,后来卸了就没装了,俺找找其他原因,顺便改改我的程序。

作者: Sid20    时间: 2012-3-22 22:08
没用过stm32啊,不过我用XS128,遇到这样问题的时候是这样解决的
问个小问题,我记得PAL制式一场只有300多行,但是程序里为什么记了480个行中断
作者: adndcn    时间: 2012-3-23 10:26
Sid20 发表于 2012-3-22 22:08
没用过stm32啊,不过我用XS128,遇到这样问题的时候是这样解决的
问个小问题,我记得PAL制式一场只有300多 ...

可能是我对时序有点弄错了,我后来设置过逐行扫描模式,共有484行。
pal制式?俺用的是ov7620,数字摄像头,好像木有这个,模拟输出口是NTSC制式。
今天研究下,争取搞定!!!!
谢谢您的回复。

作者: adndcn    时间: 2012-3-23 19:17
本帖最后由 adndcn 于 2012-3-23 19:18 编辑
齐天小晟 发表于 2012-3-22 18:47
磨刀不误砍柴工啊,学会以后可以自己改进上位机的功能

嘿,哥们,我解决了。是我的采集程序。
我现在设置了QVGA,逐行扫描模式,黑白模式。
如下:
SCCB_Write(0x42,0x14,0x24);//qva
SCCB_Write(0x42,0x28,0x60);//black white progressive scan mode

现在令我费解的是,我行中断计数了480个,隔8个采一行数据,结果图像就不抖动了,而且显示的非常好。。。。
QVGA不是240行么?
很费解。。。。O(∩_∩)O~
程序是无意中改了个参数的
void EXTI0_IRQHandler(void)//VSYNC
{
        VSYNC_Flag=1;
        EXTI->PR=1<<0;
}

void EXTI1_IRQHandler(void)//HREF
{       
        if(VSYNC_Flag)
        {
                if(HREF_Num<480)
                {
                        if(HREF_Num%8==0)
                        {
                                for(pclk_Num=0;pclk_Num<Xmax;pclk_Num++)
                                {
                                        //rewdata=GPIOB->IDR;
                                        //imagedata=(rewdata&0x0000FF00)>>8;
                                        //data[HREF_Num/10][pclk_Num]=imagedata;
                                        data[HREF_Num/8][pclk_Num]=(GPIOB->IDR&0x0000ff00)>>8;
                                }
                        }
                        HREF_Num++;
                }
                else
                {
                        EXTI->IMR&=~(1<<0);
                        //EXTI->EMR&=~(1<<0);
                        EXTI->IMR&=~(1<<1);
                        //EXTI->EMR&=~(1<<1);
                        VSYNC_Flag=0;
                        HREF_Num=0;
                        imageok=0;
                }
        }
        EXTI->PR=1<<1;
}


作者: zhangxing    时间: 2012-3-24 21:47
同样问题……

作者: qq8057    时间: 2012-3-25 17:29
图像应该是分奇偶场发送的,奇偶场图像不一样
作者: 贾海勇    时间: 2012-3-29 19:09
我用的也是楼主使用的上位机,但是不知道用什么程序显示摄像头显示的实时图像,我是用S12核心板的,求楼主给一个源代码,我的Q是334085919,,谢谢了。。

作者: adndcn    时间: 2012-3-30 14:28
贾海勇 发表于 2012-3-29 19:09
我用的也是楼主使用的上位机,但是不知道用什么程序显示摄像头显示的实时图像,我是用S12核心板的,求楼主给 ...

我用的是stm32的芯片,没有用s12.。。。
显示程序已经贴出来了,用串口先发送0x01,然后是一行一行的数据,最后给个0x01是为了以防万一,给个结束。
你可以看看。
我一般是先把一副图数据保存到一个全局数组里,然后关闭中断,发送数据,之后延迟一秒再开中断接收图像数据,否则数据量大,我电脑受不了,我电脑已经蓝屏很多次了。。。。。。

作者: 落落、、    时间: 2012-6-28 21:33
我现在就是这个问题,是什么原因造成的,怎么解决,各位大神求指教。优先级,和标志位 我都是按要求处理的,可为什么还会有这个问题。
作者: imfgz1990    时间: 2012-6-29 12:58

作者: lihang29    时间: 2012-11-2 19:39
齐天小晟 发表于 2012-3-22 14:03
我也遇到过这个问题,场中断优先级要高于行中断

优先级设置过之后,图像不会分为两段了,这是为什么啊。搞不懂啊。。。。
作者: 吼吼哈哈    时间: 2014-7-25 22:52
请问是如何设置成QVGA
作者: lihuanhuan    时间: 2014-7-26 09:25






欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2