找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2404|回复: 16
打印 上一主题 下一主题
收起左侧

一条MCU指令走600多个机器周期正常吗?新手求答

[复制链接]
跳转到指定楼层
楼主

重载TM2的高位初始值  这条指令走了600多个机器周期 重载低位初始值也是   这合理吗(First和FRE是全局变量,First是设定不变的初试值,FRE是计算好的储存值)
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:57657 发表于 2021-5-11 17:55 | 只看该作者
请确认First和FRE是否为浮点数据类型。
回复

使用道具 举报

板凳
ID:684049 发表于 2021-5-11 21:33 | 只看该作者
First和fre是什么类型的?是不是float类型的?
回复

使用道具 举报

地板
ID:826204 发表于 2021-5-11 22:13 | 只看该作者
npn 发表于 2021-5-11 17:55
请确认First和FRE是否为浮点数据类型。

不是  无符号整数型
回复

使用道具 举报

5#
ID:826204 发表于 2021-5-11 22:13 | 只看该作者
花心的刘备 发表于 2021-5-11 21:33
First和fre是什么类型的?是不是float类型的?

不是  为unsigned int类型
回复

使用道具 举报

6#
ID:834651 发表于 2021-5-11 22:25 | 只看该作者
确认First和FRE是否为浮点数据类型
回复

使用道具 举报

7#
ID:824490 发表于 2021-5-11 23:21 | 只看该作者
这个要看C代码展开后的汇编代码是什么。。
一行C可能会编译成N条汇编指令。。
回复

使用道具 举报

8#
ID:889094 发表于 2021-5-12 01:13 来自手机 | 只看该作者
写的timer1实际上是定时器0。。。。一个加法减法除法应该用不了那么多,仔细检查一下
回复

使用道具 举报

9#
ID:420836 发表于 2021-5-12 07:45 | 只看该作者
600个机器指令周期似乎是不可能的。
回复

使用道具 举报

10#
ID:592807 发表于 2021-5-12 08:24 | 只看该作者
TTQ001 发表于 2021-5-12 07:45
600个机器指令周期似乎是不可能的。

是每个指令都600机器周期吗?如果是的话就是单片机问题。
回复

使用道具 举报

11#
ID:826204 发表于 2021-5-12 10:00 来自手机 | 只看该作者
名字不是重点 发表于 2021-5-11 23:21
这个要看C代码展开后的汇编代码是什么。。
一行C可能会编译成N条汇编指令。。

用keil5仿真  可以看汇编语言吗
回复

使用道具 举报

12#
ID:826204 发表于 2021-5-12 10:00 来自手机 | 只看该作者
黄youhui 发表于 2021-5-12 08:24
是每个指令都600机器周期吗?如果是的话就是单片机问题。

不是  就这一个  所以很纳闷
回复

使用道具 举报

13#
ID:592807 发表于 2021-5-12 10:11 | 只看该作者
旅途1 发表于 2021-5-12 10:00
不是  就这一个  所以很纳闷

这样试试看,你初始化时不要计算(65536-1000)/256这些,你就直接TH0 = 252;TH1 = 24;.可能是你的单片机不具备多位数的算法(浮点算法)
回复

使用道具 举报

14#
ID:826204 发表于 2021-5-12 16:57 | 只看该作者
黄youhui 发表于 2021-5-12 10:11
这样试试看,你初始化时不要计算(65536-1000)/256这些,你就直接TH0 = 252;TH1 = 24;.可能是你的单片机 ...

谢谢您的回答   
这个  我试了下  定时器0 写(65536-1000)/256和直接写“256”这样都是两个机器周期
TM2定时器直接写“256”这样的也是两个机器周期    而(65536-(First+FRE))/256这样写就600多个机器周期   不知道是不是First 和FRE调用的时候   走了很多指令  
下面附上部分程序
回复

使用道具 举报

15#
ID:826204 发表于 2021-5-12 16:59 | 只看该作者
黄youhui 发表于 2021-5-12 10:11
这样试试看,你初始化时不要计算(65536-1000)/256这些,你就直接TH0 = 252;TH1 = 24;.可能是你的单片机 ...

uint curvalue;
uint error;
uint enlarge;
uint FRE=0;
uint First=500;
uint setvalue=20;     //数据类型  uint为"unsigned int"


void time1()
{
  TMOD |=0X01;
        TH0=(65536-2000)/256;
        TL0=(65536-2000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}
void TIM2Inital()
{
        T2MOD=0;
        TH2=(65536-(First+FRE))/256;      //设置定时初值
        TL2=(65536-(First+FRE))%256;      //设置定时初值
  RCAP2H = (65536-(First+FRE))/256; //设置定时重载值
  RCAP2L = (65536-(First+FRE))%256; //设置定时重载值
        EA=1;                             //打开总中断
  ET2=1;                           //打开定时器中断                    
  TR2=1;                           //打开定时器开关
}
void timer1(void)interrupt 1
{
  TH0=(65536-2000)/256;
        TL0=(65536-2000)%256;
        RCAP2H = (65536-(First+FRE))/256; //设置定时重载值
  RCAP2L = (65536-(First+FRE))%256; //设置定时重载值
}
void TM2(void) interrupt 5 using 1
{
        TF2=0;                           //自动清零
        if(curvalue<=20)
        {
        error=setvalue-curvalue;         //偏差,靠近设定值时递减
        enlarge=50*error;                //放大
        FRE=1000-enlarge;                             //靠近设定值时FRE递增,脉冲频率变大,速度变慢
        DIR=1;
          if(error<3)                    
          {
            ET2=0;
          }
  }
        else
        {
                DIR=0;
                error=curvalue-setvalue;        //同上
                enlarge=5*error;
                FRE=1000-enlarge;
        }
        shudu2=~shudu2;
}
回复

使用道具 举报

16#
ID:130230 发表于 2021-5-12 18:11 | 只看该作者
不合理,进debug看汇编代码大概查一下。
回复

使用道具 举报

17#
ID:592807 发表于 2021-5-12 20:59 | 只看该作者
旅途1 发表于 2021-5-12 16:59
uint curvalue;
uint error;
uint enlarge;

你在做PWM调节吗?
1 确定键全局变量换成普通数字是否会恢复正常   
2 中断是否会嵌套  例如TIM1中断里面触发TIM2中断
3 你的全局变量是否在主函数频繁出现  例如if(First > 0){delay_ms(10);这里是中断{First = 0;}First = First - 100;}
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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