智能车制作

标题: 图像采集处理问题 [打印本页]

作者: 潞箬    时间: 2012-5-18 16:03
标题: 图像采集处理问题
采集不到数据,好像程序始终在场中断里死循环,跳不出去。在场中断处理函数interrupt 9 void VSYN_Interrupt(void)里面都写了TIE=OX02,强行关闭场中断了,可还是在场中断里执行,跳不进行中断处理函数interrupt 8 void HREF_Interrupt(void) 。因此采集不到数据,串口软件里始终显示的是0,我摄像头选的是ov7620。
路过的飘过的都来指导指导小弟吧,快纠结死了,万分感谢......
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include <MC9S12G128.h>
#define ROW 30
#define COLUMN  70
unsigned char Image_Data[ROW][COLUMN];
unsigned char Point_C, VSYN_C=0, Line_Flag, m = 0,n=0;
unsigned int Line_C=0;
unsigned char Interval;
unsigned char  THRESHOLD=0x20;

void Delay(int i)
{
    int j;
    for(j=0;j<i;j++)
    {
     _asm(nop);
    }
}
void SetBusCLK_nM(byte nM)
{   
    MMCCTL1=0X00;   
    PKGCR  =0X06;   
    DIRECT =0x00;
    IVBR   =0xFF;   
    ECLKCTL=0xC0;   
    CPMUPROT   =0x26;   //停止保护时钟配置寄存器
    CPMUCLKS_PSTP=0;    //
    CPMUCLKS_PLLSEL=1;  //应用PLL      
    //CPMUSYNR   =nM-1;   //设置分频因子  
    CPMUSYNR   =0x40|(nM-1); //设置分频因子
    CPMUREFDIV =0x80|0x00;   //pllclock=2*(1+SYNR)= MHz;
    CPMUPOSTDIV=0x00;   // Set the post divider register      
    CPMUPOSTDIV=0x00;   // Set the post divider register  
    CPMUPLL    =0x10;   // Set the PLL frequency modulation  
    while(CPMUFLG_LOCK == 0); /* Wait until the PLL is within the desired tolerance of the target frequency */
    CPMUPROT=0x00;            /* Enable protection of clock configuration registers */
}  
void TIM_Init(void)
{  
   
   TIOS=0x00;          //外部输入捕捉 1,2 通道  
    TCTL4=0x24;         //通道1上升沿触发,通道 2 下降沿触发
   TSCR1=0x80;         //使能
    TIE=0x06;           //通道 1,2 中断使能
   TFLG1=0xFF;         //清中断标志位
   
}
void IO_init(void)  
{                                             //  IO初始化函数                                 
     DDRD = 0X00;
}
void SCI0_Init(void)
{
SCI0BD = 0X9C;            //9600
SCI0CR1 = 0X00;                                      /*normal,no parity*/
SCI0CR2 = 0X2C;           //发送器,接收器使能
                             /*RIE=1,TE=1,RE=1, */
}
void SCI_Write(unsigned char SendChar)
{
    while (!(SCI0SR1&0x80))
      SCI0DRH=0;
    SCI0DRL=SendChar;
   
}
//图像处理函数
void Process(void)
{
  unsigned char i,j;
  for(i=0;i<ROW;i++)
    {
    for(j=0;j<COLUMN;j++)
      {
       if(Image_Data[j]>THRESHOLD)
       SCI_Write('1') ;
       else  SCI_Write('0') ;
      }
    //SCI_Write(0x0D);
    //SCI_Write(0X0A);
  }
}
//主函数
void main(void) {
   /* put your own code here */
   /*  uchar x,data;  */
    DisableInterrupts;
    SetBusCLK_nM(24);
    TIM_Init();
    IO_init() ;
    SCI0_Init();
EnableInterrupts;
   for(;;) {
        Process() ;   
     _FEED_COP(); /* feeds the dog */
    } /* loop forever */
    /* please make sure that you never leave main */
}
//行中断处理函数
#pragma CODE_SEG NON_BANKED
interrupt 8 void HREF_Interrupt(void)
{
  TFLG1_C1F = 1;
  Line_Flag = 0;
  m++;            //每一个下降沿捕捉一次脉冲
  if ( m<12 || m>288 )
  {
    return;//判断是否从新的一场开始
  }
  if(m<=144)                       Interval=12;
  else if(m>144&&m<=200)  Interval=8;
  else if(m>200&&m<=252)  Interval=6;
  else                                  Interval=4;  
    if(m%Interval==0)
  {
     Delay(1);   
Image_Data[Line_C][0] = PORTD;Image_Data[Line_C][1] = PORTD;
Image_Data[Line_C][2] = PORTD;Image_Data[Line_C][3] = PORTD;
Image_Data[Line_C][4] = PORTD;Image_Data[Line_C][5] = PORTD;
Image_Data[Line_C][6] = PORTD;Image_Data[Line_C][7] = PORTD;
Image_Data[Line_C][8] = PORTD;Image_Data[Line_C][9] = PORTD;
Image_Data[Line_C][10] = PORTD;Image_Data[Line_C][11] = PORTD;
Image_Data[Line_C][12] = PORTD;Image_Data[Line_C][13] = PORTD;
Image_Data[Line_C][14] = PORTD;Image_Data[Line_C][15] = PORTD;
Image_Data[Line_C][16] = PORTD;Image_Data[Line_C][17] = PORTD;
Image_Data[Line_C][18] = PORTD;Image_Data[Line_C][19] = PORTD;
Image_Data[Line_C][20] = PORTD;Image_Data[Line_C][21] = PORTD;
Image_Data[Line_C][22] = PORTD;Image_Data[Line_C][23] = PORTD;
Image_Data[Line_C][24] = PORTD;Image_Data[Line_C][25] = PORTD;
Image_Data[Line_C][26] = PORTD;Image_Data[Line_C][27] = PORTD;
Image_Data[Line_C][28] = PORTD;Image_Data[Line_C][29] = PORTD;
Image_Data[Line_C][30] = PORTD;Image_Data[Line_C][31] = PORTD;
Image_Data[Line_C][32] = PORTD;Image_Data[Line_C][33] = PORTD;
Image_Data[Line_C][34] = PORTD;Image_Data[Line_C][35] = PORTD;
Image_Data[Line_C][36] = PORTD;Image_Data[Line_C][37] = PORTD;
Image_Data[Line_C][38] = PORTD;Image_Data[Line_C][39] = PORTD;
Image_Data[Line_C][40] = PORTD;Image_Data[Line_C][41] = PORTD;
Image_Data[Line_C][42] = PORTD;Image_Data[Line_C][43] = PORTD;
Image_Data[Line_C][44] = PORTD;Image_Data[Line_C][45] = PORTD;
Image_Data[Line_C][46] = PORTD;Image_Data[Line_C][47] = PORTD;
Image_Data[Line_C][48] = PORTD;Image_Data[Line_C][49] = PORTD;
Image_Data[Line_C][50] = PORTD;Image_Data[Line_C][51] = PORTD;
Image_Data[Line_C][52] = PORTD;Image_Data[Line_C][53] = PORTD;
Image_Data[Line_C][54] = PORTD;Image_Data[Line_C][55] = PORTD;
Image_Data[Line_C][56] = PORTD;Image_Data[Line_C][57] = PORTD;
Image_Data[Line_C][58] = PORTD;Image_Data[Line_C][59] = PORTD;
Image_Data[Line_C][60] = PORTD;Image_Data[Line_C][61] = PORTD;
Image_Data[Line_C][62] = PORTD;Image_Data[Line_C][63] = PORTD;
Image_Data[Line_C][64] = PORTD;Image_Data[Line_C][65] = PORTD;
Image_Data[Line_C][66] = PORTD;Image_Data[Line_C][67] = PORTD;
Image_Data[Line_C][68] = PORTD;Image_Data[Line_C][69] = PORTD;
   
    Line_C++;
  }
    if(Line_C==ROW)
         return;
}
//场中断处理函数
#pragma CODE_SEG  NON_BANKED
interrupt 9 void VSYN_Interrupt(void)
{   
       TFLG1_C1F=1;      //      
       TFLG1_C2F=1;    //清除场同步中断         
       Line_C=0;                  //初始化采集行的下标
       Point_C = 0;
       TIE=0x02 ;   //进入一场后开行中断,关闭场中断                  
}












补充内容 (2012-5-18 22:22):
中断序号改过来了,任然有问题,真想不通,路过的大神们哪。。。
作者: 潞箬    时间: 2012-5-18 16:05
求指导
作者: 梦枫辰    时间: 2012-5-18 16:41
你这程序每一步都看懂了么?算法是自己写的吗?
作者: xinmengwangran    时间: 2012-5-18 17:58
好像是混合的程序 你把几个人的融合啦  呵呵 中断号和你设置的不对应
作者: xinmengwangran    时间: 2012-5-18 18:02
TCTL4=0x24;         //通道1上升沿触发,通道 2 下降沿触发
这个位置设置通道1和2,而你下面的中断号分别对应的是通道0和1的,明白了吗??
应该这样改TCTL4=0x09;  你试一试好不好使,如果不行,我就不知哪里出了问题啦

作者: 潞箬    时间: 2012-5-18 18:49
xinmengwangran 发表于 2012-5-18 18:02
TCTL4=0x24;         //通道1上升沿触发,通道 2 下降沿触发
这个位置设置通道1和2,而你下面的中断号分别 ...

我看看,先谢谢你
作者: xinmengwangran    时间: 2012-5-18 19:12
潞箬 发表于 2012-5-18 18:49
我看看,先谢谢你

没事 不用谢

作者: 潞箬    时间: 2012-5-18 19:23
xinmengwangran 发表于 2012-5-18 19:12
没事 不用谢

要是任然选用通道1和通道2,下面的中断号该如何改,下面的中断号也对应不同的通道吗?比如interrupt 9 void VSYN_Interrupt(void)里面9对应的就是通道1 吗?


作者: xinmengwangran    时间: 2012-5-18 19:27
潞箬 发表于 2012-5-18 19:23
要是任然选用通道1和通道2,下面的中断号该如何改,下面的中断号也对应不同的通道吗?比如interrupt 9 vo ...

对 我建议你改上面方便 除非你硬件已经接PT1和PT2 那就改下面吧
但是行中断、场中断要对应好 尤其是中断触发方式

作者: 潞箬    时间: 2012-5-18 19:57
xinmengwangran 发表于 2012-5-18 19:27
对 我建议你改上面方便 除非你硬件已经接PT1和PT2 那就改下面吧
但是行中断、场中断要对应好 尤其是中断 ...

我们pcb板都已经送过去做了,没办法,只有对这板子做程序啊。。。。而且用的单片机又是9s12g,资料就一英文版的,天天看的头都大,谢谢

作者: 潞箬    时间: 2012-5-18 21:19
梦枫辰 发表于 2012-5-18 16:41
你这程序每一步都看懂了么?算法是自己写的吗?

看了一些例程,然后写的,现在那个中断序号对应的优先级不太懂,大神方便解释不,谢谢

作者: xinmengwangran    时间: 2012-5-19 09:06
潞箬 发表于 2012-5-18 19:57
我们pcb板都已经送过去做了,没办法,只有对这板子做程序啊。。。。而且用的单片机又是9s12g,资料就一英 ...

哦  呵呵 你们真是可以呀 软件基本端口没确定 能去制版 那就只好改动软件啦 其实也不是很难 注意对应上就OK啦
作者: 潞箬    时间: 2012-5-19 09:29
xinmengwangran 发表于 2012-5-19 09:06
哦  呵呵 你们真是可以呀 软件基本端口没确定 能去制版 那就只好改动软件啦 其实也不是很难 注意对应上就 ...

我已经对上了,还是有问题,真心想不通。。。。。。

作者: xinmengwangran    时间: 2012-5-19 10:20
潞箬 发表于 2012-5-19 09:29
我已经对上了,还是有问题,真心想不通。。。。。。

说来听听你怎么改的
作者: 潞箬    时间: 2012-5-19 10:33
xinmengwangran 发表于 2012-5-19 10:20
说来听听你怎么改的

pt1,pt2已经改不了了,只好相应的改写下面的行场中断序号了,行中断T1,上升沿触发,对应的中段序号改为了9;相应的场改成了10,。
图像采集按道理不是先进行场中断处理,在进入行中断处理,所以在场中断处理后加入了行中断使能。
不过现在让程序一步一步执行,没进入场中断处理,直接进入行中断了,并且脉冲数m貌似一直是小于12的,所以又进不了D端口的输入,VSYN_C也就没有加1处理,下面的process()也就一直没执行。。。。。。


作者: xinmengwangran    时间: 2012-5-19 11:53
潞箬 发表于 2012-5-19 10:33
pt1,pt2已经改不了了,只好相应的改写下面的行场中断序号了,行中断T1,上升沿触发,对应的中段序号改为 ...

有些纠结 你在场中断把行中断打开 然后再试一下 再不好使 我就想不到啦 如果是实际操作可能还有办法 但是听你描述 然后帮你分析 只能到这啦 我实在不才啊
作者: 潞箬    时间: 2012-5-19 12:03
xinmengwangran 发表于 2012-5-19 11:53
有些纠结 你在场中断把行中断打开 然后再试一下 再不好使 我就想不到啦 如果是实际操作可能还有办法 但是 ...

试过了,不行,不管怎样,还是非常谢谢你
作者: xinmengwangran    时间: 2012-5-19 12:08
潞箬 发表于 2012-5-19 12:03
试过了,不行,不管怎样,还是非常谢谢你

哦 呵呵 继续奋斗吧 只能祝你好运吧
作者: 潞箬    时间: 2012-5-19 16:34
xinmengwangran 发表于 2012-5-19 12:08
哦 呵呵 继续奋斗吧 只能祝你好运吧

恩,加油。。。。。。
作者: xinmengwangran    时间: 2012-5-19 17:25
潞箬 发表于 2012-5-19 16:34
恩,加油。。。。。。

加油 一切都会好起来的

作者: 潞箬    时间: 2012-5-19 21:53
xinmengwangran 发表于 2012-5-19 17:25
加油 一切都会好起来的

{:soso_e113:}
作者: xinmengwangran    时间: 2012-5-19 22:05
潞箬 发表于 2012-5-19 21:53


作者: 潞箬    时间: 2012-5-19 22:25
xinmengwangran 发表于 2012-5-19 22:05

感觉你一直都在,你们车做怎么样了。。。
作者: xinmengwangran    时间: 2012-5-19 23:58
潞箬 发表于 2012-5-19 22:25
感觉你一直都在,你们车做怎么样了。。。

呵呵 不怎么样 我已经退二线了 我做这个毕业设计 估计能跑下来 但是速度有些提不起来
你们呢

作者: 潞箬    时间: 2012-5-20 21:16


作者: 潞箬    时间: 2012-5-20 21:17
xinmengwangran 发表于 2012-5-19 23:58
呵呵 不怎么样 我已经退二线了 我做这个毕业设计 估计能跑下来 但是速度有些提不起来
你们呢

嘿嘿,我大三的,随便搞搞,还得考研,所以五月分才开始做这个的的,烦啊,没太多时间,压力山大
作者: xinmengwangran    时间: 2012-5-21 19:00
潞箬 发表于 2012-5-20 21:17
嘿嘿,我大三的,随便搞搞,还得考研,所以五月分才开始做这个的的,烦啊,没太多时间,压力山大

哦  呵呵 努力吧

作者: Make_it!    时间: 2012-5-23 08:14
现在好没有啊?我也出现这样的情况!烦躁的很啊!
作者: 潞箬    时间: 2012-5-23 13:39
Make_it! 发表于 2012-5-23 08:14
现在好没有啊?我也出现这样的情况!烦躁的很啊!

没呢,哎,天天都在想着问题,一个星期了

作者: Make_it!    时间: 2012-5-23 16:08
加个好友吧1158793848
作者: 潞箬    时间: 2012-5-23 16:35
Make_it! 发表于 2012-5-23 16:08
加个好友吧1158793848

加了{:soso_e100:}
作者: txgc    时间: 2012-6-15 17:35
我的编译都没有通过,提示:Fixup overflow in_Vector_59,to API_ISR 1,at offset 0x0
作者: txgc    时间: 2012-6-15 17:45
你加上我吧,1324988896
作者: 潞箬    时间: 2012-6-15 23:39
txgc 发表于 2012-6-15 17:45
你加上我吧,1324988896

加了{:soso_e100:}
作者: 潞箬    时间: 2012-6-15 23:51
txgc 发表于 2012-6-15 17:35
我的编译都没有通过,提示:Fixup overflow in_Vector_59,to API_ISR 1,at offset 0x0

你用的API中段吗?
作者: txgc    时间: 2012-6-16 00:40
潞箬 发表于 2012-6-15 23:51
你用的API中段吗?

是啊,不过还没有成功。我还不是特别了解这个接口。
作者: 颓廢至极〇    时间: 2012-10-11 20:34
什么乱七八糟的东西  东平西凑的 看得我蛋疼
作者: mxj1005071012    时间: 2013-1-21 23:57
你好  我也是参考的这个程序 请问你搞定了吗 我搞了很久都不行啊 8918767435@qq.com  谢谢了
作者: 战斗堡垒    时间: 2013-3-11 09:10
谢谢,很有用。。。





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