一线研发之声 https://bbs.21ic.com/?567930 [收藏] [复制] [RSS] ------最底层、最深邃、最负重的编程之歌

日志

一线研发之声 之 跑马灯变形记(三)

热度 11已有 3949 次阅读2014-11-8 06:38 |个人分类:一线研发之声|系统分类:嵌入式系统| 变形记, 跑马灯

第二次变形:精度控制,添加中断定时器

本系列入口:一线研发之声 之 跑马灯变形记(一)

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

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


一线研发之声 之 跑马灯变形记(四)


路过

鸡蛋
9

鲜花
2

握手

雷人

刚表态过的朋友 (11 人)

发表评论 评论 (2 个评论)

回复 kakaoracle 2014-11-12 23:16
楼主牛逼,作为新手深深拜服
回复 kakaoracle 2014-11-12 23:16
楼主牛逼,作为新手深深拜服