智能车制作

标题: 蓝宙库 中断服务函数 [打印本页]

作者: 1013956044    时间: 2016-4-1 16:53
标题: 蓝宙库 中断服务函数
pit_init_ms(PIT0, 5);    5ms中断

void PIT0_IRQHandler(void)
{
   PIT_Flag_Clear(PIT0);       //清中断标志位

   TimeCount ++ ;

  if(TimeCount%1 == 0 ){
     TIME0flag_5ms = 1;

}
  if(TimeCount%2 == 0 ){
     TIME0flag_10ms = 1;

  }
  if(TimeCount%3 == 0 ){
     TIME0flag_15ms = 1;
  }
  if(TimeCount%4 == 0 ){
     TIME0flag_20ms = 1;
  }
  if(TimeCount%64 == 0 ){
     TIME0flag_80ms = 1;
  }


  if(TimeCount == 192)
  {
    TimeCount = 0 ;
  }

请问下80ms那里TimeCount%64 为什么是对64求余呢?
我的理解是5ms进去一次中断服务函数 然后TimeCount就+1 这样的话80ms不是应该对16求余么(80/5=16) 但是检测了一下,64不像是写错的样子,想问下到底是怎么计算 比如我现在要一份85ms的标志位 应该怎么写?
还有为什么TimeCount == 192 就要清零了呢  是跟总线时间有关么?
实在不解 望回复!


作者: jamesdeep    时间: 2016-4-2 13:09
本帖最后由 jamesdeep 于 2016-4-2 13:13 编辑

我感觉应该是写错了,应该就是你说的16,或者将80ms改成320ms才对。

至于为什么TimeCount == 192就清0,我认为这跟蓝宙写的这个程序框架有关系,不知道你有没有注意到,192是1、2、3、4、64的公倍数,那么假设这个值不是192而是191会发生什么事情呢?

在TimeCount从190->191(被清0)变化的过程中,以(TimeCount%2 == 0 )这个条件为例,这个条件本应隔10ms满足一次,但是这时隔5ms就满足了一次,因此就会发生问题。
由于192*5ms不是85ms的倍数,因此在这个框架里面你无法实现85ms,最接近85ms的应该是80ms,192*5ms是80ms的12倍。

作者: 1013956044    时间: 2016-4-4 19:56
jamesdeep 发表于 2016-4-2 13:09
我感觉应该是写错了,应该就是你说的16,或者将80ms改成320ms才对。

至于为什么TimeCount == 192就清0, ...

谢谢你详述 这样说来 是不是我们如果用这个终端服务函数实现 N ms的中断,那是不是就必须满足192*5是N得倍数   又不也可以修改192 成T  是T*5是N的倍数。

作者: jamesdeep    时间: 2016-4-5 12:54
1013956044 发表于 2016-4-4 19:56
谢谢你详述 这样说来 是不是我们如果用这个终端服务函数实现 N ms的中断,那是不是就必须满足192*5是N得 ...

很对

作者: 1013956044    时间: 2016-4-5 17:56
jamesdeep 发表于 2016-4-5 12:54
很对

谢谢

作者: 1013956044    时间: 2016-6-5 20:41
jamesdeep 发表于 2016-4-5 12:54
很对

还想问下  如果不清零呢  会有什么问题吗?

作者: bydes    时间: 2016-6-7 15:18
这个64代表的意思是规范的定时时间的,因为程序运行的时候定时器定时不是那么完全准确的,在定时器运行和溢出的过程中是要有时间延时的,而这个64是在使用示波器条件下,测试时间离这个数值最准确的一个数值,因此取64的。
作者: 1013956044    时间: 2016-6-10 18:45
bydes 发表于 2016-6-7 15:18
这个64代表的意思是规范的定时时间的,因为程序运行的时候定时器定时不是那么完全准确的,在定时器运行和溢 ...

不是很能理解你所说的  写64的话 那个中断还是80ms?  还有 如果我改成16呢 中断时间是多少? 再有 最下面那个192的清零是什么意思?改成200成么?





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