智能车制作

标题: 摄像头采集 [打印本页]

作者: 六步上篮    时间: 2014-9-21 19:44
标题: 摄像头采集
用K60加OV7620仿照别人的程序写了个采集程序,就是采集回来发给上位机这点目的,但是始终没有图像,用的是野火新版的库,哪位大神帮我看看是哪里出错了吧,一下是程序,仅仅是采集和发送。其中PTA29接行中断,PTB0接场中断,PTC0为像素中断
#include "common.h"
#include "include.h"
#define H 260                                    
#define V 60
unsigned char Pix_Data[V][H];
void PTA29_IRQHandler(void);
void PTB0_IRQHandler(void);
void DMA_CH4_Handler(void);
unsigned int Hang_Cnt;                //行采集计数
unsigned char Is_SendPhoto;         //图像发送标志
void main()
{
    int i=0,j=0;
    DisableInterrupts;
    Hang_Cnt=0;                       //行计数
    Is_SendPhoto=0;                //从串口发送图像   
    port_init(PTA29,IRQ_RISING|PF|ALT1|PULLDOWN);   //行中断,PORTA29 端口外部中断初始化 ,
                                                   //上升沿触发中断,内部下拉
    disable_irq(PORTA_IRQn);                              //行中断关闭
    port_init(PTB0,IRQ_FALLING|PF|ALT1|PULLDOWN);    //场中断,PORTB0 端口外部中断初始化 ,
                                                     //下降沿触发中断,内部下拉
    uart_init(UART1,256000);
    set_vector_handler(PORTA_VECTORn,PTA29_IRQHandler); //设置行中断函数
    set_vector_handler(PORTB_VECTORn,PTB0_IRQHandler);  //设置场中断函数
    set_vector_handler(DMA4_VECTORn,DMA_CH4_Handler);
    enable_irq(PORTB_IRQn);
    EnableInterrupts;
    enable_irq(PORTB_IRQn);
    while(1)
    {
      if(Is_SendPhoto)
      {
          disable_irq(PORTA_IRQn);
          disable_irq(PORTB_IRQn);   //关闭PORTB中断,即关闭场中断,防止串口发送图像数据进程被打乱
          //以下四句话是固定格式,是串口和上位机软件之间的协议
          uart_putchar(UART1,0);
          uart_putchar(UART1,255);
          uart_putchar(UART1,1);
          uart_putchar(UART1,0);
          for(i=0;i<V;i++)
          {
            for(j=0;j<H;j++)
            {        
                uart_putchar(UART1,Pix_Data[i][j]);
            }
          }
          enable_irq(PORTB_IRQn);      //打开PORTB中断
          enable_irq(PORTA_IRQn);
          Is_SendPhoto=0;
      }
    }
}
void PTA29_IRQHandler(void)
{
    if((PORTA_ISFR & (1<<29)))               //PTA29触发中断,行中断
    {
      PORTA_ISFR |= (1<<29);               //写1清中断标志位
      if((++Hang_Cnt)%4 == 0)            //判断该行数据是否需要,根据自己需要的行数自己设定判别条件
      {
        DMA_EN(DMA_CH4);                 //使能通道CHn 硬件请求
      }
    }
}
void PTB0_IRQHandler(void)
{
    if(PORTB_ISFR & (1<<0))           //PTB0触发中断,场中断
    {
        PORTB_ISFR |= (1<<0);            //写1清中断标志位                          
        dma_portx2buff_init(DMA_CH4,(void *)&PTD_B0_IN,Pix_Data,PTC0,DMA_BYTE1,H,DADDR_KEEPON);
        //DMA通道4初始化,PTC0上升沿触发DMA传输,源地址为PTD_BYTE0_IN,
                    //目的地址为:Pix_Data ,每次传输1Byte,传输H次后停止传输,
                    //目的地址保持不变,关闭通道CHn 硬件请求
        enable_irq(PORTA_IRQn);      //使能PORTA中断,即开启行中断,PORTA的ISR中断号为87
        Hang_Cnt=0;             //行采集计数清零
        Is_SendPhoto = 0;
      }
}
void DMA_CH4_Handler(void)
{
    DMA_IRQ_CLEAN(DMA_CH4);       //清除通道传输中断标志位    (这样才能再次进入中断)
    DMA_DIS(DMA_CH4);        //采集完H个数据后进入这个DMA中断,停止DMA传输。行中断中打开DMA传输
    if(Hang_Cnt == 240)
      Is_SendPhoto = 1;
}

作者: 六步上篮    时间: 2014-9-22 11:20
没人啊
作者: 六步上篮    时间: 2014-9-22 19:43

作者: ╭ァ简简单单、    时间: 2014-12-31 22:37
你这么厉害,谁还能指导了你




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