设为首页收藏本站

arduino 单片机机器人爱好者之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 1233|回复: 0

转帖:跑马灯变形记(三)

[复制链接]

签到天数: 9 天

[LV.3]偶尔看看II

发表于 2014-12-24 08:20:01 | 显示全部楼层 |阅读模式
第二次变形:精度控制,添加中断定时器


本帖转自: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文件里面的代码乱像已显,为此,我们迫切需要第三次的变形。



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

本版积分规则

QQ|Archiver|手机版|小黑屋|联系我们|YFRobot ( 苏ICP备13017135  

GMT+8, 2018-2-22 13:15 , Processed in 0.094014 second(s), 24 queries .

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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