[技术问答]

N76E003例程的定时器2自动重载延时那个是不是有错的地方

[复制链接]
1768|10
手机看帖
扫描二维码
随时随地手机跟帖
玛尼玛尼哄|  楼主 | 2018-9-16 20:34 | 显示全部楼层 |阅读模式
/*---------------------------------------------------------------------------------------------------------*/
/*                                                                                                         */
/* Copyright(c) 2017 Nuvoton Technology Corp. All rights reserved.                                         */
/*                                                                                                         */
/*---------------------------------------------------------------------------------------------------------*/

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

//***********************************************************************************************************
//  File Function: N76E003 Timer2 Auto reload Mode counter demo code
//***********************************************************************************************************
#include "N76E003.h"
#include "Common.h"
#include "Delay.h"
#include "SFR_Macro.h"
#include "Function_define.h"


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

//#define TIMER2_DIV_4                        T2MOD|=0x10;T2MOD&=0x9F
//#define TIMER2_DIV_16                        T2MOD|=0x20;T2MOD&=0xAF
//#define TIMER2_DIV_32                        T2MOD|=0x30;T2MOD&=0xBF
//#define TIMER2_DIV_64                        T2MOD|=0x40;T2MOD&=0xCF
//#define TIMER2_DIV_128                T2MOD|=0x50;T2MOD&=0xDF
//#define TIMER2_DIV_256                T2MOD|=0x60;T2MOD&=0xEF
//#define TIMER2_DIV_512                T2MOD|=0x70

//#define TIMER2_Auto_Reload_Delay_Mode                                T2CON&=~SET_BIT0;T2MOD|=SET_BIT7;T2MOD|=SET_BIT3
//#define TIMER2_Auto_Reload_Capture_Mode                        T2CON&=~SET_BIT0;T2MOD|=SET_BIT7
//#define        TIMER2_Compare_Capture_Mode                                        T2CON|=SET_BIT0;T2MOD&=~SET_BIT7;T2MOD|=SET_BIT2
#endif

/************************************************************************************************************
*    Timer2 interrupt subroutine
************************************************************************************************************/
void Timer2_ISR (void) interrupt 5
{
          clr_TF2;                                //Clear Timer2 Interrupt Flag
          P12 = ~P12;                                                                                                                        // GPIO1 toggle
                printf("\n TM2 INT 0x%bX",RCMP2H);
}
/************************************************************************************************************
*    Main function
************************************************************************************************************/
void main (void)
{
    Set_All_GPIO_Quasi_Mode;
                InitialUART0_Timer3(115200);
       
                TIMER2_DIV_128;
                TIMER2_Auto_Reload_Delay_Mode;

                RCMP2L = TIMER_DIV128_VALUE_100ms;
                RCMP2H = TIMER_DIV128_VALUE_100ms>>8;
                TL2 = 0;
                TH2 = 0;

    set_ET2;                                    // Enable Timer2 interrupt
          set_EA;
    set_TR2;                                    // Timer2 run
   
    while(1);
}


玛尼玛尼哄|  楼主 | 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的没有讲是不是自动重载,那到底是不是

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

3005

帖子

2

粉丝