[技术问答] N76E003例程的定时器2自动重载延时那个是不是有错的地方

[复制链接]
2335|10
 楼主| 玛尼玛尼哄 发表于 2018-9-16 20:34 | 显示全部楼层 |阅读模式
  1. /*---------------------------------------------------------------------------------------------------------*/
  2. /*                                                                                                         */
  3. /* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
  4. /*                                                                                                         */
  5. /*---------------------------------------------------------------------------------------------------------*/

  6. //***********************************************************************************************************
  7. //  Nuvoton Technoledge Corp.
  8. //  Website: http://www.nuvoton.com
  9. //  E-Mail : MicroC-8bit@nuvoton.com
  10. //  Date   : Apr/21/2017
  11. //***********************************************************************************************************

  12. //***********************************************************************************************************
  13. //  File Function: N76E003 Timer2 Auto reload Mode counter demo code
  14. //***********************************************************************************************************
  15. #include "N76E003.h"
  16. #include "Common.h"
  17. #include "Delay.h"
  18. #include "SFR_Macro.h"
  19. #include "Function_define.h"


  20. /******************************************************************
  21. * Following define for timer 2 also in Function_define.h
  22. ********************************************************************/
  23. #if 0
  24. //#define TIMER_DIV4_VALUE_10us                                65536-56                                //9*4/22118400 = 10 uS,                            // Timer divider = 4
  25. //#define TIMER_DIV4_VALUE_1ms                                65536-5530                        //923*4/22118400 = 1 mS,                           // Timer divider = 4
  26. //#define TIMER_DIV4_VALUE_100us                        65536-553                                //553*4/22118400 = 100 us                                // Timer divider = 4
  27. //#define TIMER_DIV4_VALUE_200us                        65536-1106                        //1106*4/22118400 = 200 us                        // Timer divider = 4
  28. //#define TIMER_DIV4_VALUE_500us                        65536-2765                        //2765*4/22118400 = 500 us                        // Timer divider = 4               
  29. //#define TIMER_DIV16_VALUE_10ms                        65536-13824                        //1500*16/22118400 = 10 ms                        // Timer divider = 16
  30. //#define TIMER_DIV64_VALUE_30ms                        65536-10368                        //10368*64/22118400 = 30 ms                        // Timer divider = 64
  31. //#define        TIMER_DIV128_VALUE_100ms                65536-17280                        //17280*128/22118400 = 100 ms                // Timer divider = 128
  32. //#define        TIMER_DIV128_VALUE_200ms                65536-34560                        //34560*128/22118400 = 200 ms                // Timer divider = 128
  33. //#define TIMER_DIV256_VALUE_500ms                65536-43200                        //43200*256/22118400 = 500 ms         // Timer divider = 256
  34. //#define TIMER_DIV512_VALUE_1s                                65536-43200                        //43200*512/22118400 = 1 s                        // Timer divider = 512

  35. //#define TIMER2_DIV_4                        T2MOD|=0x10;T2MOD&=0x9F
  36. //#define TIMER2_DIV_16                        T2MOD|=0x20;T2MOD&=0xAF
  37. //#define TIMER2_DIV_32                        T2MOD|=0x30;T2MOD&=0xBF
  38. //#define TIMER2_DIV_64                        T2MOD|=0x40;T2MOD&=0xCF
  39. //#define TIMER2_DIV_128                T2MOD|=0x50;T2MOD&=0xDF
  40. //#define TIMER2_DIV_256                T2MOD|=0x60;T2MOD&=0xEF
  41. //#define TIMER2_DIV_512                T2MOD|=0x70

  42. //#define TIMER2_Auto_Reload_Delay_Mode                                T2CON&=~SET_BIT0;T2MOD|=SET_BIT7;T2MOD|=SET_BIT3
  43. //#define TIMER2_Auto_Reload_Capture_Mode                        T2CON&=~SET_BIT0;T2MOD|=SET_BIT7
  44. //#define        TIMER2_Compare_Capture_Mode                                        T2CON|=SET_BIT0;T2MOD&=~SET_BIT7;T2MOD|=SET_BIT2
  45. #endif

  46. /************************************************************************************************************
  47. *    Timer2 interrupt subroutine
  48. ************************************************************************************************************/
  49. void Timer2_ISR (void) interrupt 5
  50. {
  51.           clr_TF2;                                //Clear Timer2 Interrupt Flag
  52.           P12 = ~P12;                                                                                                                        // GPIO1 toggle
  53.                 printf("\n TM2 INT 0x%bX",RCMP2H);
  54. }
  55. /************************************************************************************************************
  56. *    Main function
  57. ************************************************************************************************************/
  58. void main (void)
  59. {
  60.     Set_All_GPIO_Quasi_Mode;
  61.                 InitialUART0_Timer3(115200);
  62.        
  63.                 TIMER2_DIV_128;
  64.                 TIMER2_Auto_Reload_Delay_Mode;

  65.                 RCMP2L = TIMER_DIV128_VALUE_100ms;
  66.                 RCMP2H = TIMER_DIV128_VALUE_100ms>>8;
  67.                 TL2 = 0;
  68.                 TH2 = 0;

  69.     set_ET2;                                    // Enable Timer2 interrupt
  70.           set_EA;
  71.     set_TR2;                                    // Timer2 run
  72.    
  73.     while(1);
  74. }


 楼主| 玛尼玛尼哄 发表于 2018-9-16 20:35 | 显示全部楼层
//#define TIMER_DIV16_VALUE_10ms                        65536-13824                        //1500*16/22118400 = 10 ms                        // Timer divider = 16


这个宏定义是不是错了,不应该是计算1500*16吧
应该13824*16
大家看呢?
 楼主| 玛尼玛尼哄 发表于 2018-9-16 20:35 | 显示全部楼层
这种注释错误存在太坑爹了 。
 楼主| 玛尼玛尼哄 发表于 2018-9-16 20:36 | 显示全部楼层
希望把新唐的程序员拉过来,没事看看,可以at他,让他知道哪儿有问题。
tianxj01 发表于 2018-9-17 10:03 | 显示全部楼层
玛尼玛尼哄 发表于 2018-9-16 20:35
//#define TIMER_DIV16_VALUE_10ms                        65536-13824                        //1500*16/22118400 = 10 ms                        // Timer divider = 16
...

宏是对的,错的是该死的注释...........
wanduzi 发表于 2018-9-18 23:35 | 显示全部楼层
tianxj01 发表于 2018-9-17 10:03
宏是对的,错的是该死的注释...........

明白人,我阅读例程的时候也发现不少注释,根本不是这个程序的注释,不知道从哪儿粘贴过来没有改。
wanduzi 发表于 2018-9-18 23:38 | 显示全部楼层
                       13824 *16/22118400 = 10 ms   
应该是这样,这个程序是可以实现的,但是注释写错了。不知道程序员整天干啥呢,不看清楚。
yiyigirl2014 发表于 2018-9-19 00:07 | 显示全部楼层
自动重载是什么意思,我去查查。
yiyigirl2014 发表于 2018-9-19 00:14 | 显示全部楼层
因定时器实质是计数器,而且是加法计数器,要定时,要先给定时器写一个初始值,然后在这个初始值的基础上开始加法计数,假设是8位定时器,当计数到最大值1111 1111,即FFH后,再加1就会溢出,回0了(定时时间到,可以中断),如果需要继续再计数,就必须再重新写初始值,否则就停了。所以,写程序时,必须每次时间到了都要重写初始值,有点麻烦,还影响定时的精确度。那么,自动重载就解放了这个麻烦,定时到以后,定时器自动重写初始值,自动开始计数,不用再写程序送初始值了。
yiyigirl2014 发表于 2018-9-19 00:14 | 显示全部楼层
理解基本概念才行啊。
643757107 发表于 2018-9-19 23:18 | 显示全部楼层
定时器3的没有讲是不是自动重载,那到底是不是
您需要登录后才可以回帖 登录 | 注册

本版积分规则

196

主题

3261

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部