智能车制作

标题: ColdFire图像滚动 [打印本页]

作者: Frozenflame    时间: 2013-7-5 20:07
标题: ColdFire图像滚动
我用的Coldfire的EPORT来接受场中断和行中断。
用的是OV6620.
奇数场读摄像头数据,偶数场把前面读到得数据写到sd卡。

奇怪的是,图像总是向上滚动。滚了两天了。。。搞不定。用的是CodeWarrior

猜测,最直接的原因是,场中断函数的执行不是按照摄像头给的信号去执行的。就是,摄像头给了我场中断信号,但是我没有理他,而是继续干自己的事,等我去执行场中断时(干完自己的事会马上进场中断,因为中断标志总会被置),以为摄像头正在发第一行的数据,其实他已经发了好几行,不过我都丢掉了。或者,我一退出场中断马上就又进去了,没等摄像头给我发中断信号。
这样图像就会滚动。

然后觉得是没有清除中断标志,但是我已经清了。

然后觉得是写sd卡的时间太长,导致我“欠”着一个场中断,等我去真正执行的时候已经晚了几行。但是我少写一个扇区,情况没有什么变化。还是滚。

到底怎么回事呢?
不知道同志们有没有遇到过类似的问题。有用ColdWarrior的吧?我刚学这个片子(以前是xs128),不知道用这个Coldfire有什么需要注意的问题。尤其是中断方面的。



/*行中断 P5*/
__declspec(interrupt:0) void EPORT_irq5_handler(void)
{
       
        MCF_EPORT_EPFR|=MCF_EPORT_EPFR_EPF5;//清除中断标志
       
//        return ;
       
  MCF_EPORT_EPIER &= ~MCF_EPORT_EPIER_EPIE5;//两个中断都禁止掉(貌似中断标志仍然会被置,等使能了中断马上会去执行)
  MCF_EPORT_EPIER &= ~MCF_EPORT_EPIER_EPIE7;
  
  cLine++;

  if(cLine>120){//6620:352*288隔行扫描?????。7620:640*480隔行扫描。//大于120行,下面不要了。
      MCF_EPORT_EPIER |= MCF_EPORT_EPIER_EPIE7;
      return;
  }
  
  cmd=cLine%4;
  curLine=cLine/4;
  
  
  switch(cmd){
   
    case 0:{//采集
      CaiJi();
      break;
    }
    case 1:{//二值化
      ErZhiHua();
      break;
    }

    case 2:{
       //ZuoBianJie();//左边界
       //YouBianJie();//右边界
   
      break;
      
    }

    /*case 3:{
        border[curLine][0]=iLeft;
            border[curLine][1]=iRight;
                  border[curLine][3]=(iRight-iLeft);
                  iMiddle=(iLeft+iRight)/2;
                  border[curLine][2]=iMiddle;
                  //for(i=0;i<40;i++)uart_putchar(1,line[i]);
       break;
        }*/
        default:
                break;
  }
  
    MCF_EPORT_EPIER |= MCF_EPORT_EPIER_EPIE5; //最后把行中断再使能。
       

}

/*场中断 P7*/
__declspec(interrupt:0) void EPORT_irq7_handler(void)
{
       
        MCF_EPORT_EPFR|=MCF_EPORT_EPFR_EPF7;//清除场中断标志

       
  MCF_EPORT_EPIER &= ~MCF_EPORT_EPIER_EPIE5;//两个中断都禁掉
  MCF_EPORT_EPIER &= ~MCF_EPORT_EPIER_EPIE7;
   
   flagCameraorSD ^= 1;//如果是0,就读摄像头,如果是1,就写sd卡。

  if(!flagCameraorSD){// it is camera
                                      uart_putchar(1,0xee);
    cField++;
    cLine=-1;
   
    MCF_EPORT_EPIER |= MCF_EPORT_EPIER_EPIE5;使能行中断
   
  }else{
   //电机和舵机控制
  // uart_putchar(1,0x22);
  // DianJiKongZhi();
  // DuoJiKongZhi();
   
   
    //写入SD卡
    pgraph=(byte *)graph;
    *pgraph++=0b01010101;
    *pgraph++=cField>>8;
    *pgraph++=(byte)cField;
    pgraph=(byte *)graph;
   
    for(i=0;i<2;i++){//写入sd卡
      _io_sdcard_spi_write_block(&sdcard_struct,pgraph,RdWrAdd+3*cField+i);
      pgraph+=512;
    }
   
    MCF_EPORT_EPIER |= MCF_EPORT_EPIER_EPIE7;//使能场中断,等下一场到了就去读摄像头
   
  }
}


都快比赛了还在纠结硬件,真是捉鸡。

作者: Frozenflame    时间: 2013-7-5 20:10
下面是初始化中断函数的部分。

void EPORT_init(void)
{
        MCF_GPIO_PNQPAR = MCF_GPIO_PNQPAR_IRQ1_IRQ1
                                     |MCF_GPIO_PNQPAR_IRQ3_IRQ3
                                     |MCF_GPIO_PNQPAR_IRQ5_IRQ5
                                     |MCF_GPIO_PNQPAR_IRQ7_IRQ7;
//pin assignment register:FALLING LEVEL RISING BOTH                          
        MCF_EPORT_EPPAR = MCF_EPORT_EPPAR_EPPA1_FALLING
                                          |MCF_EPORT_EPPAR_EPPA3_FALLING
                                          |MCF_EPORT_EPPAR_EPPA5_RISING
                                         |MCF_EPORT_EPPAR_EPPA7_FALLING;
//data direction register
        MCF_EPORT_EPDDR =(uint8)~MCF_EPORT_EPDDR_EPDD1
                                         &~MCF_EPORT_EPDDR_EPDD3
                                         &~MCF_EPORT_EPDDR_EPDD5
                                         &~MCF_EPORT_EPDDR_EPDD7;

//data register:hold the data to be driven to the pins
        MCF_EPORT_EPDR = MCF_EPORT_EPDR_EPD1
                                      |MCF_EPORT_EPDR_EPD3
                                      |MCF_EPORT_EPDR_EPD5
                                      |MCF_EPORT_EPDR_EPD7;
//data register:reflects the current state of the pins READ ONLY
//        MCF_EPORT_EPPDR

                                  
//set interrupt enable                                  
        MCF_INTC0_IMRL&=~MCF_INTC_IMRL_MASKALL;
        MCF_INTC0_IMRL&=~MCF_INTC_IMRL_INT_MASK1 //EPORT interrupt source 1
                                   &~MCF_INTC_IMRL_INT_MASK3 //EPORT interrupt source 3
                                   &~MCF_INTC_IMRL_INT_MASK5 //EPORT interrupt source 5
                                   &~MCF_INTC_IMRL_INT_MASK7;//EPORT interrupt source 7
                                  
        MCF_INTC0_ICR01=MCF_INTC_ICR_IP(1)+MCF_INTC_ICR_IL(3);
        MCF_INTC0_ICR03=MCF_INTC_ICR_IP(2)+MCF_INTC_ICR_IL(3);
        MCF_INTC0_ICR05=MCF_INTC_ICR_IP(3)+MCF_INTC_ICR_IL(3);
        MCF_INTC0_ICR07=MCF_INTC_ICR_IP(4)+MCF_INTC_ICR_IL(3);

        //interrupt enable register

                                          
        //flag register:individually latches EPORT edge events
        MCF_EPORT_EPFR = MCF_EPORT_EPFR_EPF1
                                    |MCF_EPORT_EPFR_EPF2
                                    |MCF_EPORT_EPFR_EPF3
                                    |MCF_EPORT_EPFR_EPF4
                                    |MCF_EPORT_EPFR_EPF5
                                    |MCF_EPORT_EPFR_EPF6
                                    |MCF_EPORT_EPFR_EPF7;
                                    
                                    uart_putchar(1,0x44);
                                    uart_putchar(1,MCF_EPORT_EPFR);
                                    //while(1);
                       
                       
                       
        MCF_EPORT_EPIER =// MCF_EPORT_EPIER_EPIE1        //EPORT interrupt source 1
                                         //|MCF_EPORT_EPIER_EPIE3        //EPORT interrupt source 3
                                          //0|MCF_EPORT_EPIER_EPIE5        //EPORT interrupt source 5
                                          0|MCF_EPORT_EPIER_EPIE7;//EPORT interrupt source 7            
   // MCF_EPORT_EPIER &= ~MCF_EPORT_EPIER_EPIE5;
   //如果不把上面注释掉,那么在执行这一句前已经发生了场中断
   //然后这句把行中断又屏蔽掉了。

    flagCameraorSD=1;
       
}


作者: 田东林    时间: 2013-7-5 22:37
把场信号 分压 降到3.3V

作者: Frozenflame    时间: 2013-7-5 22:40
田东林 发表于 2013-7-5 22:37
把场信号 分压 降到3.3V

哥们我这就开烙铁

作者: 田东林    时间: 2013-7-5 22:41
Frozenflame 发表于 2013-7-5 22:40
哥们我这就开烙铁

嗯  拿电阻分压就好
作者: Frozenflame    时间: 2013-7-5 23:03
田东林 发表于 2013-7-5 22:37
把场信号 分压 降到3.3V

搞定了搞定了搞定了!!!!把信号搞成3.3V就可以了啊 真是太感激了!
还有。某个版本的OV6620有个“3.3V”的引脚。如果这根线接到5V电压,所有的输出信号都会变成5V。如果接到3.3V电压,所有的输出信号都会是3.3V。如果什么都不接,输出的信号是一坨屎。

作者: wendaoxyp    时间: 2013-7-19 19:58
:)
作者: 厚重的心    时间: 2014-7-11 12:00
Frozenflame 发表于 2013-7-5 23:03
搞定了搞定了搞定了!!!!把信号搞成3.3V就可以了啊 真是太感激了!
还有。某个版本的OV6620有个“3.3 ...

OV7620是不是也是这样呢?

作者: 18062264028    时间: 2014-9-25 16:46
好厉害,我也准备开始学这个
作者: 18772101532    时间: 2014-9-27 18:32
  大神带我飞吧!我也在用coldfire做摄像头组的车!
作者: 18062264028    时间: 2014-11-9 14:19
为嘛用coldfire的不多呢




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