智能车制作

标题: ov7620+k60 DMA采集 图像有明显的分割 求教!!! [打印本页]

作者: lifuxian1994    时间: 2015-2-6 14:58
标题: ov7620+k60 DMA采集 图像有明显的分割 求教!!!


如图是什么情况啊,改了3天了。之前在第十届总贴那边也问了。按照他们的方法试过了,还是不行啊。

//main.c发送部分

while(1)
  {
    if(Image_Flag == 1)
    {

      DisableInterrupts;

      uart_putchar(UART4,0xFF);  //图像头

      for(i=0; i<ROW; i++)
      {
        for(j=0;j<COL ;j++)
        {
          if(ImageBuf[j] == 0xFF) ImageBuf[j]--;
          uart_putchar(UART4,ImageBuf[j]);         
        }
      }

      Image_Flag = 0 ;

      EnableInterrupts;

    }
  }



//---VSYN场中断处理
void PORTB_IRQHandler()
{
  DisableInterrupts;

  if(PORTB_ISFR & (1 << 0))         //PTB0触发中断  场中断
  {

    PORTB_ISFR  |= (1 << 0); //写1清中断标志位

    rowCnt = 0;

    Image_Flag = 1;

    DMA_IRQ_DIS(DMA_CH4);//关DMA

    disable_irq(88);//关场中断

    enable_irq(87);//开行中断

  }

  EnableInterrupts;
}




void PORTA_IRQHandler()
{
  DisableInterrupts;

  //---HREF行中断处理
  DMA_IRQ_DIS(DMA_CH4);

  if( PORTA_ISFR & (1 << 16))         //PTA16触发中断  
  {
    Image_Flag = 0 ;

    PORTA_ISFR  |= (1 << 16);        //写1清中断标志位

    //-------------DAM初始化通道4,数据源为PTD,每次存在数组ImageBuf[]指针中,PCLK接PTE5触发,每次传输1个字节,每次触发传输COL次,上升沿触发

    DMA_PORTx2BUFF_Init (DMA_CH4, (void *)&PTD_BYTE0_IN, ImageBuf[rowCnt], PTE5, DMA_BYTE1, COL, DMA_rising);   

    DMA_EN(DMA_CH4);  //----使能DMA,初始化的时候禁止DMA

    rowCnt++;

    if(rowCnt == ROW )   //行计数
    {

      rowCnt = 0;

      DMA_DIS(DMA_CH4); //关DMA

      disable_irq(87);//关行

      enable_irq(88);//开场  

    }

  }
  EnableInterrupts;
}



//DMA中断
void DMA_CH4_Handler(void)
{
  //DMA通道4
  DisableInterrupts;

  DMA_IRQ_CLEAN(DMA_CH4);   //清除通道传输中断标志位    (这样才能再次进入中断)
  DMA_IRQ_DIS(DMA_CH4); //禁止DMA   等待下一次行中断来临开启DMA

  Image_Flag = 0 ;

  EnableInterrupts;
}


作者: lygwzy89    时间: 2015-2-6 16:39
你那个图像分割问题,是不是你在场中断来的时候传送图像,这样这一场初始的几个行中断你就接不到,然后发送完图像继续接受,但只接受了一点这一场就完了,随后接着一场的第一行继续,知道行计数满了。所以你的图像下面是这一场,之后是下一场的图像
作者: ganlei    时间: 2015-2-6 16:55
这个问题以前也遇到过,其实很简单的,加一个缓存数组就好了,采集完,复制一下,然后发送复制的那个数组的,瞬间就好了。
作者: lifuxian1994    时间: 2015-2-6 17:20
ganlei 发表于 2015-2-6 16:55
这个问题以前也遇到过,其实很简单的,加一个缓存数组就好了,采集完,复制一下,然后发送复制的那个数组的 ...

增加了一个ImageBuf1[ROW][COL]

//main.c中发送部分修改
for(i=0; i<ROW; i++)
      {
        for(j=0;j<COL ;j++)
        {
          if(ImageBuf1[j] == 0xFF) ImageBuf1[j]--;
          uart_putchar(UART4,ImageBuf1[j]);         
        }
      }


//isr.c 对应部分修改

if(rowCnt == ROW )   //行计数
    {

      rowCnt = 0;

      ImageBuf1[ROW][COL] = ImageBuf[ROW][COL];   //根据你说的,缓存数组

      DMA_DIS(DMA_CH4); //关DMA

      disable_irq(87);//关行

      enable_irq(88);//开场  

    }




结果变成黑屏了

求指教!






作者: ganlei    时间: 2015-2-6 17:29
lifuxian1994 发表于 2015-2-6 17:20
增加了一个ImageBuf1[ROW][COL]

//main.c中发送部分修改

不是复制一个发一个,整幅图像复制完了再发。

作者: lifuxian1994    时间: 2015-2-6 18:30
ganlei 发表于 2015-2-6 17:29
不是复制一个发一个,整幅图像复制完了再发。

在if(rowCnt == ROW)里  复制数组不就是把整幅图复制的么?

作者: Quixote    时间: 2015-2-6 18:31
本帖最后由 Quixote 于 2015-2-6 18:34 编辑

保证下幅图过来时候,此图不被干扰。虽然更感觉这是行中断、场中断有问题。

作者: lifuxian1994    时间: 2015-2-6 18:38
Quixote 发表于 2015-2-6 18:31
保证下幅图过来时候,此图不被干扰。虽然更感觉这是行中断、场中断有问题。

代码中应该修改哪一点?

作者: Quixote    时间: 2015-2-6 18:52
我的代码:
uint8 b_TxImageInformation(uint8 CMOS_Pixel_org[][Beholder_PixNum_MAX])
{
    v_UartTxOne(0xFF);v_UartTxOne(0xFE);
    v_UartTxOne('I');
    v_UartTxOne('M');
    v_UartTxOne('A');
    v_UartTxOne('G');
    v_UartTxOne('E');
   
   
    for(uint8 loop_LineNum = 0;loop_LineNum < Beholder_LineY_MAX;loop_LineNum++)
    {
        for(uint8 loop_PixNum = 0;loop_PixNum < Beholder_PixNum_MAX;loop_PixNum++)
        {
            uint8 rec_temp = CMOS_Pixel_org[loop_LineNum][loop_PixNum];
            v_UartTxOne(rec_temp);
        }
    }
   
    return 'T';
}
作者: 六步上篮    时间: 2015-2-6 19:32
1、主函数里发送完图像开总中断之前对场中断写1清下标志位。
2、DMA的初始化放在场中断里。
作者: make1573    时间: 2015-2-6 20:22
lifuxian1994 发表于 2015-2-6 18:30
在if(rowCnt == ROW)里  复制数组不就是把整幅图复制的么?

你也是用的岱默的吧,我的程序,不过还不是最佳方案
void PORTA_IRQHandler()
{
   //---HREF行中断处理
       if (rowCnt==0)
          SampleFlag=0;
    if( PORTA_ISFR & (1 << 9))         //PTA9触发中断  
    {
      HREFflag++;
      PORTA_ISFR  |= (1 << 9);        //写1清中断标志位
      if (HREFflag==1)
      {
        HREFflag=0;


        //
        //-------------DAM初始化通道4,数据源为PTD,每次存在数组ImageBuf[]指针中,PCLK接PT19触发,每次传输1个字节,每次触发传输320次,上升沿触发
        DMA_PORTx2BUFF_Init (DMA_CH4, (void *)&PTD_BYTE0_IN, ImageBuf[rowCnt], PTC19, DMA_BYTE1, COL, DMA_rising);
        //----使能DMA,初始化的时候禁止DMA
        DMA_EN(DMA_CH4);

        rowCnt++;
       SampleFlag=2;
        if(rowCnt >= ROW)
        {
          rowCnt = 0;
          DMA_DIS(DMA_CH4);

          //---------若为动态显示,删除此行------------//
          DisableInterrupts;
        }
      }
    }

    //---VSYN场中断处理
    if(PORTA_ISFR & (1 << 27))         //PTA27触发中断  场中断
    {
        PORTA_ISFR  |= (1 << 27);       //写1清中断标志位
        rowCnt = 0;
        SampleFlag = 1;
    }
}


主函数:
while(1)
    {

      //DisableInterrupts;
      if (SampleFlag == 1)
     {
        uart_putchar(UART1,0xFF);  //图像头
     for(i=0; i<ROW/4; i++)
      {
        for(j=0;j<COL/6 ;j++)
        {
          if(ImageBuf[i*4][j*6] == 0xFF) ImageBuf[i*4][j*6]--;


          uart_putchar(UART1,ImageBuf[i*4][j*6]);
         }

       }
      }
      EnableInterrupts;


    }


作者: lifuxian1994    时间: 2015-2-6 21:08
六步上篮 发表于 2015-2-6 19:32
1、主函数里发送完图像开总中断之前对场中断写1清下标志位。
2、DMA的初始化放在场中断里。

while(1)
  {
    if(Image_Flag == 1)
    {

      DisableInterrupts;

      uart_putchar(UART4,0xFF);  //图像头

      for(i=0; i<ROW; i++)
      {
        for(j=0;j<COL ;j++)
        {
          if(ImageBuf[j] == 0xFF) ImageBuf[j]--;
          uart_putchar(UART4,ImageBuf[j]);         
        }
      }

      Image_Flag = 0 ;

      PORTB_ISFR  |= (1 << 0);        //写1清中断标志位

      EnableInterrupts;

    }
  }
}


//PORTB场中断
void PORTB_IRQHandler()
{
  DisableInterrupts;

  if(PORTB_ISFR & (1 << 0))         //PTB0触发中断  场中断
  {

    PORTB_ISFR  |= (1 << 0); //写1清中断标志位

    rowCnt = 0;

    Image_Flag = 1;

        //-------------DAM初始化通道4,数据源为PTD,每次存在数组ImageBuf[]指针中,PCLK接PTE5触发,每次传输1个字节,每次触发传输320次,上升沿触发

    DMA_PORTx2BUFF_Init (DMA_CH4, (void *)&PTD_BYTE0_IN, ImageBuf[rowCnt], PTE5, DMA_BYTE1, COL, DMA_rising);   //一行中断采列数 DMA下降沿触发


    DMA_IRQ_DIS(DMA_CH4);//关DMA

    disable_irq(88);//关场中断

    enable_irq(87);//开行中断

  }

  EnableInterrupts;
}



//注释掉PORTA的DMA初始化



按你的说法改,重复采集到黑屏。





作者: 六步上篮    时间: 2015-2-6 21:34
你的场中断刚一来就把Image_Flag 置1了?这时候一幅图才刚刚到来啊亲!!!应该是在采集够了一定行后Image_Flag 才能置1的




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