中级会员
- 积分
- 257
- 威望
- 146
- 贡献
- 67
- 兑换币
- 80
- 注册时间
- 2013-3-15
- 在线时间
- 22 小时
- 毕业学校
- USTC
|
我用的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;//使能场中断,等下一场到了就去读摄像头
}
}
都快比赛了还在纠结硬件,真是捉鸡。
|
|