标题: 一条MCU指令走600多个机器周期正常吗?新手求答 [打印本页]

作者: 旅途1    时间: 2021-5-11 17:01
标题: 一条MCU指令走600多个机器周期正常吗?新手求答

重载TM2的高位初始值  这条指令走了600多个机器周期 重载低位初始值也是   这合理吗(First和FRE是全局变量,First是设定不变的初试值,FRE是计算好的储存值)

作者: npn    时间: 2021-5-11 17:55
请确认First和FRE是否为浮点数据类型。
作者: 花心的刘备    时间: 2021-5-11 21:33
First和fre是什么类型的?是不是float类型的?
作者: 旅途1    时间: 2021-5-11 22:13
npn 发表于 2021-5-11 17:55
请确认First和FRE是否为浮点数据类型。

不是  无符号整数型
作者: 旅途1    时间: 2021-5-11 22:13
花心的刘备 发表于 2021-5-11 21:33
First和fre是什么类型的?是不是float类型的?

不是  为unsigned int类型
作者: linghuchongchon    时间: 2021-5-11 22:25
确认First和FRE是否为浮点数据类型
作者: 名字不是重点    时间: 2021-5-11 23:21
这个要看C代码展开后的汇编代码是什么。。
一行C可能会编译成N条汇编指令。。
作者: birdzhyli    时间: 2021-5-12 01:13
写的timer1实际上是定时器0。。。。一个加法减法除法应该用不了那么多,仔细检查一下
作者: TTQ001    时间: 2021-5-12 07:45
600个机器指令周期似乎是不可能的。
作者: 黄youhui    时间: 2021-5-12 08:24
TTQ001 发表于 2021-5-12 07:45
600个机器指令周期似乎是不可能的。

是每个指令都600机器周期吗?如果是的话就是单片机问题。
作者: 旅途1    时间: 2021-5-12 10:00
名字不是重点 发表于 2021-5-11 23:21
这个要看C代码展开后的汇编代码是什么。。
一行C可能会编译成N条汇编指令。。

用keil5仿真  可以看汇编语言吗
作者: 旅途1    时间: 2021-5-12 10:00
黄youhui 发表于 2021-5-12 08:24
是每个指令都600机器周期吗?如果是的话就是单片机问题。

不是  就这一个  所以很纳闷
作者: 黄youhui    时间: 2021-5-12 10:11
旅途1 发表于 2021-5-12 10:00
不是  就这一个  所以很纳闷

这样试试看,你初始化时不要计算(65536-1000)/256这些,你就直接TH0 = 252;TH1 = 24;.可能是你的单片机不具备多位数的算法(浮点算法)
作者: 旅途1    时间: 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调用的时候   走了很多指令  
下面附上部分程序
作者: 旅途1    时间: 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;
}
作者: jizhongbiao    时间: 2021-5-12 18:11
不合理,进debug看汇编代码大概查一下。
作者: 黄youhui    时间: 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;}





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1