再次求教大神定时器不准确问题,付代码 - TMS320C6748 - 嵌入式开发者社区 - 51ele.net
设为首页收藏本站

嵌入式开发者社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 4476|回复: 7
打印 上一主题 下一主题

再次求教大神定时器不准确问题,付代码

[复制链接]

2

主题

7

帖子

37

积分

新手上路

Rank: 1

积分
37
跳转到指定楼层
楼主
发表于 2016-6-9 14:41:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序基本思路是在for()里通过串口接到上位机赋初值后,启动定时器,然后1秒结算1次,用的定时器1,然后在定时器中断里点灯,设置标识,在for里再用一个函数做些解算和通过串口传给上位机的功能,问题是感觉点灯时间要比1秒多,感觉要有两秒了,要是在for里不执行解算等功能函数,感觉点灯就1秒正常了,这是为什么?代码如下:
void  ISR_5ms()
{
        TimerIntStatusClear(SOC_TMR_1_REGS, TMR_INT_TMR12_NON_CAPT_MODE);
        g_uiCntClock++;
    GPIOPinWrite(SOC_GPIO_0_REGS, 109, ucLED);
                ucLED=!ucLED;
                GPIOPinWrite(SOC_GPIO_0_REGS, 110, ucLED);
                OUT_Flag=1;
}

        for(;;)
        {        
                InportProc();
        //OutportProc();

}
如果不执行OutportProc()感觉定时器点灯正常,计时准确,如果执行了就要比1秒时间长,根绝计时就不准确了OutportProc();代码如下:
void OutportProc(void)

{
         if(1==OUT_Flag)
                                                                   {

                                                         for(i = 0; i < 20; i++)  //初始化数据变量
                                                         {
                                                          b = '\0';
                                                         }
                                                           i=0;

                                                                  sins(qnb,vn,pos,wm,vm,Ts);
                                                                                   vn[2] = 0;
                                                                                   pos[2] = pos0[2];         //限定高度发散

                                                                                   nav_err(qnb,vn,pos,qnb0,vn0,pos0);
                                                                              for( j=0; j<9 ; j++ )
                                                                              {
                                                                                      sprintf(b,"%le",vari_nav_err[j]);
                                                                                      strcat(b,"\t");
                                                                                                   printf("%s",b);
                                                                                               Send_Flag=1;
                                                                                            if(Send_Flag == 1)
                                                                                          {
                                                                                                // ScibRegs.SCITXBUF=b[0];
                                                                                                   while( b!= '\0')

                                                                                           {
                                                                                                        UARTCharPut(SOC_UART_1_REGS, b);
                                                                                                i++;
                                                                                          }

                                                                                                   i=0;
                                                                     }


                                                                                                                    Send_Flag=0;
                                                                              }
                                                                      printf("\n");
                                                                        UARTCharPut(SOC_UART_1_REGS,receive);
//
//                                        GPIOPinWrite(SOC_GPIO_0_REGS, 109, ucLED);
//                                        ucLED=!ucLED;
//                                        GPIOPinWrite(SOC_GPIO_0_REGS, 110, ucLED);
                                                                        OUT_Flag=0;


                                                                }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖
回复

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
沙发
发表于 2016-6-9 14:58:25 来自手机 | 只看该作者
排队等着进广东省博物馆 反正无聊顺带回答下你的问题  TI C6000 DSP 不允许系统的时候不支持中断嵌套 所以在中断服务函数执行时其它中断都会被忽略 你的 ISR 函数时间太长估计是丢了中断了
回复 支持 反对

使用道具 举报

2

主题

7

帖子

37

积分

新手上路

Rank: 1

积分
37
板凳
 楼主| 发表于 2016-6-9 15:51:14 | 只看该作者
没太懂,能说的详细点没,我的定时器中断里很简单呀,没几条语句呀
回复 支持 反对

使用道具 举报

2

主题

7

帖子

37

积分

新手上路

Rank: 1

积分
37
地板
 楼主| 发表于 2016-6-9 16:30:15 | 只看该作者
我想1秒解算1次,然后把结果过串口1输出到上位机保存,如果不允许中断嵌套,该如何实现。
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
5#
发表于 2016-6-9 16:53:01 来自手机 | 只看该作者
在主函数做处理
回复 支持 反对

使用道具 举报

2

主题

7

帖子

37

积分

新手上路

Rank: 1

积分
37
6#
 楼主| 发表于 2016-6-9 17:04:10 | 只看该作者
感谢你在假期给我的回答,我现在就是在主函数的for()里做的,我刚才又试了下,把OutportProc()里下面代码去掉
for( j=0; j<9 ; j++ )
                                                                              {
                                                                                      sprintf(b,"%le",vari_nav_err[j]);
                                                                                      strcat(b,"\t");
                                                                                                   printf("%s",b);
                                                                                               Send_Flag=1;
                                                                                            if(Send_Flag == 1)
                                                                                          {
                                                                                                // ScibRegs.SCITXBUF=b[0];
                                                                                                   while( b!= '\0')

                                                                                           {
                                                                                                        UARTCharPut(SOC_UART_1_REGS, b);
                                                                                                i++;
                                                                                          }

                                                                                                   i=0;
                                                                     }


                                                                                                                    Send_Flag=0;
                                                                              }
                                                                      printf("\n");
                                                                        UARTCharPut(SOC_UART_1_REGS,receive);
就正常了,加上就慢了,可是我肯定需要这些代码要往上位机传数据呀
回复 支持 反对

使用道具 举报

15

主题

1357

帖子

4579

积分

创龙

Rank: 8Rank: 8

积分
4579
7#
发表于 2016-6-9 18:58:42 来自手机 | 只看该作者
printf 这些函数很耗时的
回复 支持 反对

使用道具 举报

2

主题

7

帖子

37

积分

新手上路

Rank: 1

积分
37
8#
 楼主| 发表于 2016-6-12 20:40:44 | 只看该作者
真是高手,就是printf的问题,谢谢
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|嵌入式开发者社区 ( 粤ICP备15055271号

GMT+8, 2024-5-5 05:56 , Processed in 0.036247 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2015 Comsenz Inc.

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