智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 1656|回复: 1
打印 上一主题 下一主题

[采集类] 新人求助 OV6620每一场的行数不对

[复制链接]

5

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
威望
248
贡献
115
兑换币
10
注册时间
2011-2-26
在线时间
5 小时
跳转到指定楼层
1#
发表于 2011-4-14 09:10:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1贡献
我们队使用的是OV6620^
之前由于单片机出了问题,一直没有找到解决的方案,所以进度有点慢啊
现在遇到的问题是,我们用PT0口接场中断,PT1口接行中断,场中断用了下降沿,行中断用了上升沿
设计的是用串口发送0x55过去,就开启场中断,在场中断服务程序中开启行中断,然后采集数据
到了第二场过来的时候就关闭两个中断,并用串口传送采集数据
可是一开始在行中断服务程序计数行数时中出现了问题
行数也就是 href变量 竟然从47到288行变化不等!怎么会这样的?
我真的不明白,请高手帮忙啊!
程序如下:
/************************场中断*************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED                                    
void interrupt 8 vIC2ISR(void) {
DisableInterrupts;
TFLG1_C0F=1;
if (flag3 == 0x66){
    flag3 = 0x33;
    row = 0;
    line = 0;      
    TIE_C1I=1; //使能行中断T1使能   
}else if(flag3 == 0x33){
    flag3 = 0;
    flag2 = 0;
    flag1 = 1;
    flag4 = 0;
    TIE  =0x00;    //关闭两个中断T1,T0
    uart_SentBuffer1();
}
EnableInterrupts;
}
#pragma CODE_SEG CODE_DEFAULT
/************************行中断*************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 9 vIC1ISR(void)
{
    TFLG1_C1F=1;
    flag4 = 1;   
    row ++;
    line = 0;
    href ++;
}
#pragma CODE_SEG CODE_DEFAULT
/************************主函数**************************/
void main(void) {
  /* put your own code here */
  INT8U ch,i;
  DisableInterrupts;
  SetBusCLK_40M();
  uart_init();
  vinterruptsinit();
  vIOPortInit();
  EnableInterrupts;   
  while (1){         
                  if(flag1 == 1){       
                          DisableInterrupts;
                          TIOS =0x00;  //关闭场中断
                         EnableInterrupts;             
                          uart_SentChar(flag2);                                          
                                  uart_SentChar(href/256);
                          uart_SentChar(href%256);
                          if(!(href == 0)){
                            href = 0;                                   
                        }                                
                          flag2 = uart_GetChar();                                
                          flag1 = 0;                    
                   }
                     if (flag2 == 0x55){  //如果上位机发送0x55指令,则初始化外部中断,并开始准备向串口传输数据;
                       TIE_C0I=1;            //使能场中断,在场中断中使能行中断
                       flag3 = 0x66;
                           flag1 = 1;
                           }else flag1 = 1;
                      while (flag2 == 0x55){
                           while (flag3 == 0x33){              //确定 行中断已经开启,并开始采集数据
                           while(flag4 == 1) {
                                     while(row <ROW_MAX && line <LINE_MAX)
                                          Buffer1[row-1][line] = PORTB;
                                     line ++;
                              }                       
                                                                  
                         }          
                     }                 
      }   
  /* please make sure that you never leave main */
  }

5

主题

22

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
373
威望
248
贡献
115
兑换币
10
注册时间
2011-2-26
在线时间
5 小时
2#
 楼主| 发表于 2011-5-20 20:27:34 | 只看该作者
呵呵 当年很单纯啊… 其实也就一个多月前…
出现这样情况的同学们… 那是因为在场中断中开启行中断,是有硬件稳定时间的…
连续开着的话… 行数就不会变化了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2024-6-17 11:51 , Processed in 0.041300 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表