YFROBOT创客社区

标题: 转帖:跑马灯变形记(三) [打印本页]

作者: 雷柏    时间: 2014-12-24 08:20
标题: 转帖:跑马灯变形记(三)
第二次变形:精度控制,添加中断定时器


本帖转自:http://bbs.21ic.com

上述代码中,定时器的延时存在两个问题。

(1)    延时程序精度不高。在不同mcu和不同的外部晶振,这个函数都需要修改。当这个系统开启了更多的中断时,这个函数精度受到的影响就是随机性的。

(2)    while+for的延时方法,属于一种“硬延时”,生生地耗掉mcu的运行资源。在实时性要求极高的嵌入式领域,这种做法显然不合时宜。

综上,在本次进化,我们需要引进系统的定时器中断功能。它至少涉及两个函数。

  1. /***** LED 跑马灯(从右至左)***************************/
  2. ……………….
  3. /**********************************************************/
  4. #define XTAL                        (36864000UL)
  5. #define TIMER_1MS                (XTAL/12UL/1000UL)        
  6. /*--------------------------------*/
  7. static volatile unsigned char  flag_80ms = 0;
  8. static void timer1(void) interrupt 3 using 1
  9. {
  10.         static unsigned char tcnt = 0;
  11.         TCNT1 += (-TIMER_1MS);/* 为何如此写法,详见章节…*/
  12.         if (++tcnt >= LIGHT_INTERVAL_TIME)
  13.         {
  14.                 tcnt = 0;
  15.                 flag_80ms = 1;
  16.         }
  17. }
  18. void timer_init(void)
  19. {
  20.         TMOD  = 0x11;        // timer0 16-bit, timer1 16-bit
  21.         TCNT1 = (-TIMER_1MS);
  22.         TR1   = 1;
  23.         IE   |= 0x0A;        // ???? ial 0, enable timer 1, ex0,1
  24. }
复制代码
  1. /*********************************************************/
  2. void main(void)
  3. {
  4.         led_light_init();
  5.         timer_init();
  6.          while (1)
  7.         {
  8.                 if (flag_80ms)
  9.                 {
  10.                         flag_80ms = 0;
  11.                         led_light_right2left();
  12.                 }
  13.         }
  14. }
  15.                                 代码3  跑马灯的第二次变形
复制代码
加上定时器中断后,定时器的精度提高了,mcu的运算资源也极大的释放。然而,我们不得不设置了一个全局变量“flag_80ms”,用来沟通main和定时中断,增加一个内部全局变量tcnt,用来累计1ms定时功能。此时,main.c文件里面的代码乱像已显,为此,我们迫切需要第三次的变形。








欢迎光临 YFROBOT创客社区 (http://yfrobot.com.cn/) Powered by Discuz! X3.1