打印
[技术问答]

新唐定时器例程Timer01_M0 计算为63uS实测86uS 求助!

[复制链接]
2330|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jack5288|  楼主 | 2018-8-14 16:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jack5288 于 2018-8-14 17:10 编辑

新唐N76E003定时器例程Timer01_M0 计算为63uS实测86uS 求助!
时间=(65535-0XFC0F)/16M(晶振频率)=1009/16=63uS.
而实测为86uS,开始我以为是晶振频率不对,但实测为16M。
请大家帮忙分析下!!!

例程如下:

#define TH0_INIT        0xFC //5.0ms@XTAL=12MHz, Period = (10.85/2) ms@XTAL=22.1184MHz
#define TL0_INIT        0x0F
#define TH1_INIT        0xE0 //2.5ms@XTAL=12MHz, Period = (5.425/2) ms@XTAL=22.1184MHz
#define TL1_INIT        0x00


/************************************************************************************************************
*    TIMER 0 interrupt subroutine
************************************************************************************************************/
void Timer0_ISR (void) interrupt 1          //interrupt address is 0x000B
{
    TH0 = TH0_INIT;
    TL0 = TL0_INIT;
    P12 = ~P12;                                                         // GPIO toggle when interrupt
}
/************************************************************************************************************
*    TIMER 1 interrupt subroutine
************************************************************************************************************/
void Timer1_ISR (void) interrupt 3          //interrupt address is 0x001B
{
    TH1 = TH1_INIT;
    TL1 = TL1_INIT;
    P03 = ~P03;                                                         // GPIO toggle when interrupt
}
/************************************************************************************************************
*    Main function
************************************************************************************************************/
void main (void)
{
    TMOD = 0XFF;
    Set_All_GPIO_Quasi_Mode;
    TIMER0_MODE0_ENABLE;                        //Timer 0 and Timer 1 mode configuration
    TIMER1_MODE0_ENABLE;
   
    clr_T0M;
    clr_T1M;

    TH0 = TH0_INIT;
    TL0 = TL0_INIT;
    TH1 = TH1_INIT;
    TL1 = TL1_INIT;
   
//  set_ET0;                                    //enable Timer0 interrupt
    set_ET1;                                    //enable Timer1 interrupt
    set_EA;                                     //enable interrupts
   
    set_TR0;                                    //Timer0 run
//  set_TR1;                                    //Timer1 run

  while(1)
    {
        TH0 = TH0_INIT;
        TL0 = TL0_INIT;
        set_TR0;
        while(!TF0);
        clr_TR0;
        P12 = ~P12;
        TF0 = 0 ;
}
}
沙发
jack5288|  楼主 | 2018-8-14 16:55 | 只看该作者

RE: 新唐定时器例程Timer01_M0 计算为63uS实测86uS 求助!

方便各位分析附上两个波形。

P12 波形(86uS).jpg (408.44 KB )

P12 波形(86uS).jpg

P11 晶振波形(频率16M).jpg (404.1 KB )

P11 晶振波形(频率16M).jpg

使用特权

评论回复
板凳
tianxj01| | 2018-8-14 17:15 | 只看该作者
根据计算,应该没问题,不至于差这么多。
但是发现你这个main函数有问题,怎么这里还有个while1 里面  还在初始化TIM0呢?
中断里面有更新了,这里就不应该,2个更新是肯定有冲突的。

使用特权

评论回复
地板
小明的同学| | 2018-8-14 20:46 | 只看该作者
定时器前后操作的时间算进去了?

使用特权

评论回复
5
huangcunxiake| | 2018-8-14 21:52 | 只看该作者
22M是啥?

使用特权

评论回复
6
jasontu| | 2018-8-15 08:30 | 只看该作者
void Timer0_ISR (void) interrupt 1          //interrupt address is 0x000B
{
     P12 = ~P12;                                                         // GPIO toggle when interrupt
     TF0=0;
}

要修改如下:
void main (void)
{
     TMOD = 0XFF;
     Set_All_GPIO_Quasi_Mode;
     TIMER0_MODE0_ENABLE;                        //Timer 0 and Timer 1 mode configuration
     TIMER1_MODE0_ENABLE;
     
     clr_T0M;
     clr_T1M;

     TH0 = TH0_INIT;
     TL0 = TL0_INIT;
     TH1 = TH1_INIT;
     TL1 = TL1_INIT;
     
//  set_ET0;                                    //enable Timer0 interrupt
     set_ET1;                                    //enable Timer1 interrupt
     set_EA;                                     //enable interrupts
    TF0=0
     set_TR0;                                    //Timer0 run
//  set_TR1;                                    //Timer1 run

   while(1)
     {
         set_TR0;
         while(!TF0);
        }
}

使用特权

评论回复
7
jack5288|  楼主 | 2018-8-15 13:47 | 只看该作者
jasontu 发表于 2018-8-15 08:30
void Timer0_ISR (void) interrupt 1          //interrupt address is 0x000B
{
     P12 = ~P12;        ...

这个代码编译时出错,有时间帮忙编译试试。

编译出错.pdf

99.61 KB

使用特权

评论回复
8
晓伍| | 2018-8-17 11:13 | 只看该作者
时钟源用的哪个啊

使用特权

评论回复
9
jack5288|  楼主 | 2018-8-17 22:33 | 只看该作者
晓伍 发表于 2018-8-17 11:13
时钟源用的哪个啊

时钟源没有设置默认为16M内部晶振,第二张图即实测时钟波形16M正常。
我现发现另一个问题;用Timer0时要使能Timer1中断(set_ET1) 
          用Timer1时要使能Timer0中断(set_ET0),不知为何。

使用特权

评论回复
10
ztb| | 2018-8-18 10:00 | 只看该作者
你的问题是在定时值再装载时刻延迟.计数器到0后等待软件重置数据是需要代码执行时间的.而这个时间由程序的不同而异,现在的表现是需要23uS.解决的办法有二:
1.计数值减去程序运行延时时间.但是由于程序结构不同这个时间不能确定,如果有中断那就更不确定了.
2.T1只有8位自动重装置,你的1009T时间接近 12*84=1008,就是说,设置T1时钟为1/12Fsys,设置T1为
   8位自动重装载模式.靠硬件自动装载就没有软件的延时问题了.如果对定时要求更准确就只能用带16位
  自动重装载的定时器了如T2.

使用特权

评论回复
11
晓伍| | 2018-8-20 10:33 | 只看该作者
楼主是如何精确测到这个数值的啊

使用特权

评论回复
12
yiyigirl2014| | 2018-8-20 10:54 | 只看该作者
一般我不做那些要求精确时间参考的项目,如果做就用外置的有源晶振,确保稳定可靠。

使用特权

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

本版积分规则

2

主题

29

帖子

0

粉丝