搜索
bottom↓
回复: 5

周期定时的问题,定时中断出来后如何进行?和理想的不一样

[复制链接]

出0入0汤圆

发表于 2011-2-27 22:18:28 | 显示全部楼层 |阅读模式
iniTimer();
   SysTickPeriodSet(6000000UL); // 设置SysTick计数器的周期值
   SysTickEnable(); // 使能SysTick计数器
   ulStart=SysTickValueGet(); // 读取SysTick当前值(初值)
  flag=0;
  while(1){  

     if(flag==1)
     {
      
       DisCountL2=(StepL+1)*65535-DiCountL;//计算当前定时器读取的脉冲值
       DisCountR2=(StepR+1)*65535-DiCountR;
       DisCountL=DisCountL2-DisCountL1;//10ms内的码盘值
       DisCountR=DisCountR2-DisCountR1;
       DisCountL1=DisCountL2;//保存此次脉冲数,用于下次计算
       DisCountR1=DisCountR2;
      
       LCD_dis_chars(1, 1, DisCountL);
(systick2)
      ·······
}
}
中断函数
void Timer0A_ISR()
{   
   flag=1; //标志位置1,返回后主程序进行码盘数值处理
    unsigned long ulStatus;
    ulStatus = TimerIntStatus(TIMER0_BASE, true);
    TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT);   /*  清除定时器0中断             */
    if (ulStatus & TIMER_TIMA_TIMEOUT) // 如果是Timer超时中断
   {
          ulStop = SysTickValueGet( ); // 读取SysTick当前值(终值)
          SysTickDisable(); // 关闭SysTick计数器
          ulInterval=ulStart-ulStop; // 计算时间间隔

    DiCountL=TimerValueGet(TIMER1_BASE,TIMER_A);
    DiCountR=TimerValueGet(TIMER1_BASE,TIMER_B);       
   }
}   

这是弄码盘脉冲计数的一个程序的一部分,timer1A和B用于边沿捕获脉冲,timer0  32位周期定时,10ms的周期,进入后置位1,这样定时出来可以执行对脉冲的处理,用于计算里程。 板子的时钟是50M,LCD用于观测本次10ms内的脉冲值。码盘是2000线的,车轮直径75mm,码盘轮径60mm,给车子的速度是26转每分,这样计算出来10ms应该获得10个脉冲。可是lcd显示时700多的脉冲。期间我用systick计数程序运行的时间,发现进入中断时500000,也就是10ms,systick到上边括号的systick2的位置却花了3000000,也就是60ms,感到很诧异。不知道什么地方出了毛病

出0入296汤圆

发表于 2011-3-1 09:45:45 | 显示全部楼层
不明白你为什么要用定时器来读取码盘的值,没有外中断么?
另外对于你后面的描述不是很明白……

出0入0汤圆

 楼主| 发表于 2011-3-1 18:09:32 | 显示全部楼层
回复【1楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------

timer1的A和B用来外部边沿计数。所以在周期定时到了后要读取当前计数,运算后得码盘行走的距离。后面是我的查错程序,第一次进入定时是正确的时间耗时10ms,按我的思维,在定时中断里修改了flag为1,中断出来后应该进入if中,进入if到systick2的位置只有几行代码,但是检测从程序开始到systick2花了60ms···另外,我单步运行时发现,flag为0时,程序进入了if

出0入296汤圆

发表于 2011-3-2 10:55:18 | 显示全部楼层
- -b 什么芯片啊……感觉你说的定时器行为我不是很能理解……

出0入0汤圆

 楼主| 发表于 2011-3-4 23:38:19 | 显示全部楼层
回复【3楼】Gorgon Meducer 傻孩子
-----------------------------------------------------------------------

已经解决了  我定时里有lcd的程序 占用了很多时间  我的粗心

出0入0汤圆

发表于 2011-3-11 08:54:36 | 显示全部楼层
读书的时候,老师就给我们说:  “中断服务程序”一定要短小精悍。

     看来楼主就是犯了这个原则。
     一肌脑把所有代码都放到定时中断中。

     正确的做法是:只把和时间非常紧密的代码(读取脉冲数)放到定时中断中,至于计算转速代码,就不能放在定时中断中而应该放到主程序中去计算。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 21:23

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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